Discord.py 在事件之外发送消息
Posted
技术标签:
【中文标题】Discord.py 在事件之外发送消息【英文标题】:Discord.py send messages outside of events 【发布时间】:2021-11-08 14:49:18 【问题描述】:Discord.py 似乎是围绕一个侦听 on_ready
或 on_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 在事件之外发送消息的主要内容,如果未能解决你的问题,请参考以下文章