Я работаю над User Discord Bot на Python. Если владелец бота вводит !DM @user, то бот отправит DM пользователю, упомянутому владельцем.
@client.event
async def on_message(message):
if message.content.startswith('!DM'):
msg = 'This Message is send in DM'
await client.send_message(message.author, msg)






Самый простой способ сделать это - использовать расширение discord.ext.commands. Здесь мы используем конвертер, чтобы получить целевого пользователя, и аргумент только для ключевых слов как дополнительное сообщение для их отправки:
from discord.ext import commands
import discord
bot = commands.Bot(command_prefix='!')
@bot.command(pass_context=True)
async def DM(ctx, user: discord.User, *, message=None):
message = message or "This Message is sent via DM"
await bot.send_message(user, message)
bot.run("TOKEN")
Для более новых версий discord.py 1.0+ следует использовать send вместо send_message.
from discord.ext import commands
import discord
bot = commands.Bot(command_prefix='!')
@bot.command()
async def DM(ctx, user: discord.User, *, message=None):
message = message or "This Message is sent via DM"
await user.send(message)
bot.run("TOKEN")
После большого перехода на версию 1.0 send_message больше не существует.
Вместо этого у них есть перешел на .send() на каждой соответствующей конечной точке (участники, гильдии и т. д.).
Пример для версии 1.0:
async def on_message(self, message):
if message.content == '!verify':
await message.author.send("Your message goes here")
Которая будет DM отправителю !verify. Как и мудрый, вы могли бы сделать:
for guild in client.guilds:
for channel in guild.channels:
channel.send("Hey yall!")
Если вы хотите отправить сообщение «привет» на все ваши серверы и все каналы, в которых находится бот.
Поскольку (судя по комментарию) может быть не совсем ясным, сложная часть может получить дескриптор идентификации пользователя от клиента / сеанса. Если вам нужно отправить сообщение пользователю, что не имеет отправил сообщение, и это за пределами события on_message. Вам нужно будет либо:
Но единственный способ отправить пользователю - использовать дескриптор идентификации клиента, который в on_message находится в message.author или в канале, который находится в guild.channels[index].members[index]. Чтобы лучше понять это, я рекомендую прочитать официальную документацию по как отправить DM?.
Вы правы насчет send, но это не совсем ответ на вопрос.
@PatrickHaugh каким образом он не отвечает, как отправить сообщение пользователю? Именно это и делает мой первый фрагмент кода. Вы должны найти объект дескриптора пользователя и вызвать .send() для этого объекта. Либо путем зацикливания канала, либо с помощью запроса on_message.
". Если владелец бота наберет !DM @user, бот отправит DM пользователю, упомянутому владельцем."
Я использовал эту команду в прошлом, и, на мой взгляд, она работает лучше всего для меня:
@bot.command(pass_context=True)
async def mall(ctx, *, message):
await ctx.message.delete()
for user in ctx.guild.members:
try:
await user.send(message)
print(f"Successfully DMed users!")
except:
print(f"Unsuccessfully DMed users, try again later.")
@bot.command()
async def dm(ctx, user: discord.User, *, message=None):
if message == None:
message = "Hi!"
embed = make_embed(title=f"Sent by {user}", desc=message)
await user.send(embed=embed)
await ctx.send("Message sent!")```
Я заметил, что каждый код, который я помещаю в свои строки кода, не работает полностью, поэтому я добавил к ним свой собственный бит, и бац, он работает! Добавляя это в код вашего бота, не забудьте добавить имя бота там, где написано имя бота здесь. Это будет только DM того, кто его послал, но вы можете менять то, что он говорит каждый день, чтобы удивить всех, кто использовал команду. У меня это срабатывает каждый раз.
@client.command()
async def botdm(ctx):
await ctx.message.author.send('hi my name is *bot name here* and i am a bot!')
Больше бесполезно с момента перехода на v1.0, как было предложено @Torxed