discord.py中wait_for参数解析及DM用户输入采集代码优化
wait_for 参数含义说明 - 第一个位置参数
'message'是discord.py内置的事件类型标识:用于告诉wait_for方法需要监听「用户发送聊天消息」这一特定事件,而非按钮点击、表情回应、服务器成员变动等其他机器人可捕获的交互行为。对应事件触发时,方法会返回一个完整的discord.Message对象,包含消息内容、发送者、发送频道等全部属性。 check=check(ctx.author)是自定义的事件过滤规则:核心是传入一个校验函数,只有满足函数内判断条件的事件,才会被wait_for捕获。参考代码中传入的check(ctx.author)是开发者自行封装的工具函数,常规逻辑是校验触发事件的用户是否为指令发起者,避免将其他用户发送的无关消息误识别为目标输入,是交互流程防混淆的必要逻辑。
现有代码问题排查与优化方案
原有代码存在几个必现的运行错误,对应优化点如下:
- 未定义
check校验函数:check(ctx.author)并非discord.py内置方法,直接调用会触发名称未定义报错 set_footer传参格式错误:该方法要求必须通过text=关键字传入页脚文本,直接将字符串作为位置参数传入会触发类型错误- 消息接收范围不匹配:交互流程设定为用户在DM内回复,但未校验消息是否来自指定用户、是否为DM频道消息,极易误接收公屏上的无关内容
- 取值逻辑错误:
wait_for返回的是完整消息实例,并非用户输入的纯文本,直接将该实例作为发送内容,只会输出无意义的类实例字符串 - 无异常捕获:当用户在30秒内未回复时,
wait_for会抛出超时异常,直接导致指令运行崩溃
优化后可正常运行的完整代码:
import discord from discord.ext import commands import asyncio # 自定义校验函数:仅接收指定用户在DM频道发送的消息 def check_dm_reply(author: discord.User): def match_condition(message: discord.Message): # 两个判断条件:发消息的人是指令发起者,且消息发送在DM频道 return message.author == author and isinstance(message.channel, discord.DMChannel) return match_condition @client.command() async def event(ctx): try: await ctx.send("Prompt will continue in DMs.") embed = discord.Embed( title="Event Prompt", description="Please specify the type of event." ) # 修正set_footer传参格式,明确超时提示 embed.set_footer(text="Prompt will expire in 30 seconds") await ctx.author.send(embed=embed) # 等待用户的DM回复 received_msg = await client.wait_for( 'message', check=check_dm_reply(ctx.author), timeout=30 ) # 提取用户输入的纯文本内容 event_type = received_msg.content await ctx.send(f"Recorded event type: {event_type}") except asyncio.TimeoutError: # 捕获超时场景,给用户发送提示 await ctx.author.send("Prompt expired. Please re-run the command to try again.")
内容的提问来源于stack exchange,提问作者boredscripter
相关产品推荐
相关产品推荐

