Python - DM пользователя Discord Bot

Я работаю над 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)

person Rubayet Python    schedule 15.09.2018    source источник


Ответы (4)


Самый простой способ сделать это - использовать расширение 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")
person Patrick Haugh    schedule 15.09.2018
comment
Больше бесполезно после перехода на v1.0, как было предложено @Torxed - person Pieter Helsen; 02.08.2020

После большого перехода на версию 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. Вам нужно будет либо:

  1. Прокрутите свои каналы и возьмитесь за ручку на основе некоторых критериев
  2. Хранить дескрипторы / сущности пользователей и обращаться к ним с помощью внутреннего идентификатора

Но единственный способ отправить пользователю - использовать дескриптор удостоверения клиента, который в on_message находится в message.author или в канале, который находится в guild.channels[index].members[index]. Чтобы лучше понять это, я рекомендую прочитать официальную документацию на как отправить DM?.

person Torxed    schedule 22.06.2020
comment
Вы правы насчет send, но это не совсем ответ на вопрос. - person Patrick Haugh; 02.08.2020
comment
@PatrickHaugh каким образом он не отвечает, как отправить сообщение пользователю? Именно это и делает мой первый фрагмент кода. Вы должны найти объект дескриптора пользователя и вызвать .send() для этого объекта. Либо путем зацикливания канала, либо с помощью on_message запроса. - person Torxed; 03.08.2020
comment
.Если владелец бота вводит !DM @user, то бот отправит DM пользователю, упомянутому владельцем. - person Patrick Haugh; 03.08.2020

Я использовал эту команду в прошлом, и, на мой взгляд, она работает лучше всего для меня:

@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.")
person augustincampagna    schedule 07.10.2020

Я заметил, что каждый код, который я помещаю в свои строки кода, не работает полностью, поэтому я добавил к ним свой собственный бит и бац, он работает! Добавляя это в код своего бота, не забудьте добавить имя бота там, где указано имя бота. Это будет только DM того, кто его послал, но вы можете менять то, что он говорит каждый день, чтобы удивить всех, кто использовал команду. У меня это срабатывает каждый раз.

@client.command()
async def botdm(ctx):
  await ctx.message.author.send('hi my name is *bot name here* and i am a bot!')
person The Lil Meowz    schedule 04.07.2021