无需事件监听器 调用Discord API向用户发送DM的方法
实现方案
Discord 频道Webhook本身不支持发送私信(DM),你不需要维持长连接、挂载事件监听器,直接调用Discord官方REST API即可完成DM发送,逻辑和普通POST接口调用完全一致。
前置准备
- 前往Discord开发者门户创建应用与Bot账号,获取Bot的Token
- 将Bot邀请进你和目标接收用户共同所在的服务器,给Bot分配基础的发送消息权限
- 确认目标用户没有关闭「服务器成员可发送私信」的开关
实现逻辑
整个流程只需要两次普通HTTP POST请求,无需常驻进程、无需连接Discord网关:
- 调用创建DM会话接口,获取和目标用户的专属私信通道ID
- 调用通道消息发送接口,向拿到的私信通道推送消息内容
整个过程不需要启动Bot客户端、不需要维持WebSocket长连接,和你之前调用Webhook的使用逻辑完全一致,业务事件触发时直接执行对应请求即可
代码实现
直接用requests库即可实现,和你之前写Webhook调用的逻辑类似:
import requests BOT_TOKEN = "替换为你的Bot Token" TARGET_USER_ID = "替换为接收消息的用户Discord ID" # 构造通用鉴权请求头 headers = { "Authorization": f"Bot {BOT_TOKEN}", "Content-Type": "application/json" } # 第一步:创建和目标用户的DM会话 dm_channel_resp = requests.post( "https://discord.com/api/v10/users/@me/channels", headers=headers, json={"recipient_id": TARGET_USER_ID} ) dm_channel_resp.raise_for_status() dm_channel_id = dm_channel_resp.json()["id"] # 第二步:向DM通道发送消息 send_msg_resp = requests.post( f"https://discord.com/api/v10/channels/{dm_channel_id}/messages", headers=headers, json={"content": "Hello World,这是一条私信通知"} ) send_msg_resp.raise_for_status() print("私信发送成功")
注意事项
- 你可以把创建DM通道拿到的
dm_channel_id缓存起来,不用每次发消息都重新创建会话,减少接口调用次数 - 接口调用需要遵守Discord的速率限制规则,短时间大量请求会被临时拦截
- 如果接口返回403错误,优先检查Bot是否和目标用户在共同服务器、目标用户是否开放了服务器成员私信权限
内容的提问来源于stack exchange,提问作者Tendekai Muchenje
相关产品推荐
相关产品推荐

