Discord.py 在事件之外发送消息

Posted

技术标签:

【中文标题】Discord.py 在事件之外发送消息【英文标题】:Discord.py send messages outside of events 【发布时间】:2021-11-08 14:49:18 【问题描述】:

Discord.py 似乎是围绕一个侦听 on_readyon_message 等事件的机器人设计的。但我想知道是否有任何方法可以创建我的连接,然后在外部发送消息连接。

这个问题和答案非常适合我的需要,除了 webhook 不允许直接向人们发送消息:Discord - Send message only from python app to discord channel (one way communication)

这是完全正常的代码(它可以直接向用户发送消息)

import discord
client = discord.Client()
@client.event
async def on_ready():
    the_user = await client.fetch_user(PERSON_ID)
    await the_user.send('Hi')
client.run(BOT_TOKEN)

但我的问题是我需要更多的 webhook 设计,我可以在其中做这样的事情(伪代码):

import my_discord_class
client = my_discord_class.connect(TOKEN)
client.send(PERSON_ID, 'Hi')

有什么建议可以解决这个问题吗?基本上我需要发送这些“事件”之外的东西。

【问题讨论】:

你可以在任何你有客户端的地方(包括外部事件,例如在任务中)发送消息,就像在齿轮中一样。您想要做的事情无法在同步环境中完成,并且连接后的代码也不会运行,直到机器人的事件循环停止运行。如果您想在事件之外使用任务,则直接使用 HTTP 路由或client.loop.run_until_complete(your_function()) 感谢阿里的回复,但您介意发布一个简单的例子吗? 【参考方案1】:

如果您不需要其他任何东西而只想发送 dm,那么您可以使用 discord raw API 而不使用 discord.py

import requests

TOKEN = "Your Bot's Token"
USER_ID = Some User ID

BASE_URL = f"https://discord.com/api/v9"
SEND_URL = BASE_URL + "/channels/id/messages"
DM_URL = BASE_URL + f"/users/@me/channels"

headers = 
    "Authorization": f"Bot TOKEN",
    "User-Agent": f"DiscordBot"


dm_channel = requests.post(DM_URL, headers=headers, json="recipient_id": USER_ID)
dm_channel_id = dm_channel.json()["id"]
r = requests.post(SEND_URL.format(id=dm_channel_id), headers=headers, json="content": "Text Here")

这里我们使用requests 模块向discord API 发出HTTP POST 请求。首先,我们是creating a dm channel。并获取其 id,这只需要完成一次,之后,该特定用户的 id 将保持不变,因此如果您想多次对同一个人进行 dm,只需打印 dm_channel_id 并将其存储并下次使用我猜。然后我们是sending a message to the dm channel 使用它的ID。在示例中,我只显示了内容,但您可以添加更多内容,例如嵌入等。 see the documentation了解更多信息

【讨论】:

所以这会在机器人和用户之间创建一个通道(组),对吧?如果是这样,那么这不是一个完美的解决方案。如果我可以只向用户发送消息(就像其他用户一样)会更好......但无论如何这是一个很棒的想法,它确实间接解决了我的问题:) @Frank dm 频道创建只需要完成一次,因此如果您有某种方法可以保存 dm_channel id,则无需创建 dm 频道。此外,如果您查看dpy source code,您会发现当您尝试对用户进行 dm 管理时,它也会创建一个 dm 频道。 discord API 不允许您直接发送 dm,这是 discord 限制,您对此无能为力。甚至当您 1. 发送好友请求 2. 向某人发送消息 3. ctrl+k 进入某人等时,甚至不和谐的 PC 客户端也会创建一个 dm 频道。 如果您查看request logs of the discord client,您会发现当您尝试向用户发送消息时它也会创建一个 dm

以上是关于Discord.py 在事件之外发送消息的主要内容,如果未能解决你的问题,请参考以下文章

发送消息到 dms discord.py

Discord.py 嵌入式消息未从 else 语句发送

discord.py bot:on_message 检测机器人等待发送()消息

Discord py 向频道发送消息

{discord.py} 删除特定用户的特定信息

discord.py 加入消息嵌入未发送