discord.py如何实现等待用户私信回复后继续发送消息
discord.py 私信场景等待用户回复实现方案
要实现机器人发私信后暂停流程、等用户回复再继续执行的逻辑,直接用框架自带的wait_for协程方法即可,不需要额外写状态存储。
实现要点
- 用
wait_for('message')监听消息事件,传入自定义校验函数,过滤掉无关消息 - 校验规则必须同时匹配「消息发送者是触发命令的用户」「消息发送渠道是和该用户的私信频道」两个条件,避免收到其他频道/其他用户的消息导致流程错乱
- 建议配置超时时间,避免机器人无限等待造成资源浪费
- 提前捕获私信发送失败的异常,处理用户屏蔽机器人私信的场景
完整修改后的代码
import discord from discord.ext import commands # 你原有client初始化逻辑保持不变即可 @client.command() async def order(ctx): # 公域回复提示 await ctx.reply("Check your dm's") # 提前创建私信频道,捕获私信权限异常 try: dm_channel = await ctx.author.create_dm() except discord.Forbidden: await ctx.reply("无法向你发送私信,请先调整隐私设置允许服务器成员发私信后重试") return # 发送第一条私信 await dm_channel.send("hi") # 定义消息校验规则 def check_valid_msg(msg): return msg.author.id == ctx.author.id and msg.channel.id == dm_channel.id try: # 等待用户回复,timeout为等待超时时间,单位秒,可自行调整 user_reply = await client.wait_for("message", check=check_valid_msg, timeout=120) except TimeoutError: await dm_channel.send("等待回复超时,本次订单流程已终止,需要的话请重新触发/order命令") return # 到这一步已经成功拿到用户的私信回复,后续写自己的业务逻辑即可 # 示例:打印用户回复内容、发送后续引导消息 print(f"收到用户{ctx.author.id}的订单回复:{user_reply.content}") await dm_channel.send(f"已收到你发送的内容:{user_reply.content},接下来请完成下一步操作")
扩展说明
- 如果需要多轮对话等待用户多次回复,重复调用
wait_for、复用校验规则即可 - 如果要等待的不是普通文本消息,是按钮点击、下拉选择等交互,把
wait_for的第一个事件名换成对应的交互事件名、调整校验规则即可 - 超时时间根据业务需求设置即可,比如订单类场景可以设2-5分钟,快速交互场景设30秒即可
内容的提问来源于stack exchange,提问作者Stack.py
相关产品推荐
相关产品推荐

