(discord.py)如何让我的机器人读取发送给它的DM,然后打印它们或将其发送到特定频道

时间:2020-03-19 08:23:10

标签: python bots discord discord.py discord.py-rewrite

因此,我最近用各种meme命令和主持人命令创建了discord机器人。我对python比较陌生,但我了解它的要旨。我已经创建了一个命令,该命令可以让我(只有我)通过该bot DM用户。我现在想尝试使该机器人能够读取发送回它的消息并将其发送给我,无论它是打印在外壳中还是发送到我不在乎的特定频道/我,我只想能够看到发送给它的内容。 我进行了一些阅读,发现this,并从中收集了以下信息:

@bot.event
async def on_message(message):
    channel = bot.get_channel('channel ID')
    if message.server is None and message.author != bot.user:
        await bot.send_message(channel, message.content)
    await bot.process_commands(message)

仅此一项对我而言不起作用,当我对机器人进行DM处理时,出现一条错误消息,提示“ AttributeError:'Message'对象没有属性'server'”。有人告诉我discord.py重写不使用“服务器”,而是使用“行会”。因此,我将其更改为message.guild。从那里它给了我一个错误“ AttributeError:'Bot'对象没有属性'send_message'”,这与我到达那里差不多。我对此进行了修改,并在这里和那里进行了更改,并取得了一些细微的进步……我认为。我的新代码是:

@bot.event
async def on_message(ctx, message):
    channel = bot.get_channel('channel ID')
    if message.guild is None and message.author != bot.user:
        await ctx.send(channel, message.content)
    await bot.process_commands(message)

这给了我错误“ TypeError:on_message()缺少1个必需的位置参数:'message'”。 到目前为止,我已经知道了。如我所说,任何帮助将不胜感激,我还是python的新手,大约2个月前才开始使用它。

3 个答案:

答案 0 :(得分:1)

您正在使用ctx参数,这对于命令来说是唯一的。

'ctx'是commands.Context,提供有关已执行命令的信息。 由于这不是命令,而是事件,所以您不应该提供它。

未经测试,但这可以解决问题:

(为了避免垃圾邮件,我做到了,因此它会忽略来自所有漫游器的消息)

用于将消息打印到控制台

branch.name.blablabla.com

用于将消息内容转储到频道

@bot.event
async def on_message(message: discord.Message):
    if message.guild is None and not message.author.bot:
        print(message.content)
    await bot.process_commands(message)

答案 1 :(得分:0)

您的第一个代码使用的是古老,过时且不受支持的dpy版本。

除了很少的错误,例如on_message事件之外,您基本上在第二个代码中对其进行了正确的更新。

它不起作用,因为它仅接受一个参数message,而该事件中没有ctx

因此,该事件传递了一个参数,但是您的函数接受了2个错误。正确的代码是: async def on_message(message):

但是现在您将对使用此行写的内容感到困惑: await ctx.send(channel, message.content)

即使存在ctx,这也不起作用,因为send不再将目的地作为目标,而是调用目标destination.send("Hello")上的send,如果channel在此处,则转换为代码您要发送的是await channel.send(message.content)

还有一个最后的说明,我注意到您在这里使用了字符串: bot.get_channel('channel ID')可能只是您提供示例,但请记住IDs are ints,如果您传递字符串,它将永远找不到该通道。

例如,这是无效bot.get_channel('123456789111315178')

这将是有效的:bot.get_channel(123456789111315178)

答案 2 :(得分:-1)

基于该错误,我想您可能会在某个时候调用on_message()而不提供message参数。查看您的代码,看看是否可能是这种情况。

或者,如果您尚未编写的其他代码正在调用您的函数,则它可能仅使用一个参数调用on_message(),在这种情况下ctx参数可能与该函数不兼容。