如何接收Discord DMChannel中用户发送的消息?
获取DM频道中用户的消息并打印
一、批量拉取历史消息
在你创建DM并发送通知后,直接调用DM频道的history()方法就能获取已有的消息,遍历后筛选出用户发送的内容打印:
在await dm.send(embed=embed)之后添加这段代码:
# 拉取DM频道内最多100条消息(可修改limit值,设为None则获取全部) async for msg in dm.history(limit=100): # 只打印目标用户发的消息,排除机器人自己的消息 if msg.author == user: print(f"用户消息:{msg.content}")
二、实时监听新消息
如果需要实时获取用户后续发送的消息,分两种场景:
场景1:只等用户下一条消息
适合单次交互的场景,在创建DM后用wait_for等待:
import asyncio try: # 等待用户在这个DM里发消息,超时时间设为10分钟(600秒) msg = await aclient.wait_for( 'message', timeout=600, check=lambda m: m.channel == dm and m.author == user ) print(f"用户实时消息:{msg.content}") except asyncio.TimeoutError: print("等待用户消息超时")
注意:如果是在按钮交互里使用,记得先给交互发送响应(比如
await interaction.response.send_message("已创建工单,请注意查收DM")),避免交互超时。
场景2:持续监听该用户的所有DM消息
如果要长期监听这个用户的DM,在你的客户端代码里加全局消息监听事件:
@aclient.event async def on_message(message): # 判断消息是否是目标用户的DM if isinstance(message.channel, discord.DMChannel) and message.author.id == user.id: print(f"用户DM消息:{message.content}") # 如果你用了命令框架,别忘处理命令 await aclient.process_commands(message)
关键注意点
- 确保机器人开启了
message_content权限:在Discord开发者平台的Bot设置里开启该权限,并且邀请机器人时带上这个权限。 - 拉取历史消息时,
limit不要盲目设为None,否则可能触发Discord的速率限制,建议按需设置数量。
内容的提问来源于stack exchange,提问作者deverphz
相关产品推荐
相关产品推荐

