You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord Py Bot触发!add命令时未等用户回复就批量发问题如何解决?

Discord Bot !add 命令重复发问题故障修复方案

故障原因

  • 调用client.wait_for()时未传入check参数,会捕获全服务器任意场景的新消息(包括其他用户发的消息、其他频道的消息),只要有新消息触发就会被判定为当前用户的回复,直接进入下一轮循环发送下一个问题
  • 自定义的check函数逻辑错误且未传入wait_for方法,完全未生效:原check的判断逻辑m.content != element in report存在语法逻辑问题,既未校验消息发送者身份,也未校验消息来源频道,无法过滤出目标用户的有效回复
  • 未限制消息来源为触发!add命令的用户的私聊频道,容易把其他场景的消息误判为用户答复,甚至会把Bot自己发送的问题内容当成用户输入写入列表,导致出现RP N取值为“Name:”这类问题

修复代码

import discord # 确保已导入discord库

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    
    if message.content.startswith('!add'):
        target_user = message.author
        await target_user.send("`Fill in the blanks by replying, then the bot will give a confirmation message.`")
        
        for element in report:
            await target_user.send(f"**{element}**")
            # check函数放在循环内部,可正确捕获当前循环的上下文变量
            def check(m):
                # 同时满足三个条件才判定为有效回复:1.发送者是触发命令的用户 2.消息来自私聊频道 3.回复内容不属于预设的问题列表
                return m.author == target_user and isinstance(m.channel, discord.DMChannel) and m.content not in report
            
            # 给wait_for传入校验规则
            response = await client.wait_for('message', check=check)
            var(response.content)

核心改动说明

  • 将check函数移到循环内部,可正确捕获当前循环的问题内容、目标用户等上下文变量
  • 修正check校验逻辑,新增发送者身份、消息来源频道的校验规则,完全过滤无关消息
  • 给wait_for传入check参数,只有符合规则的消息才会被判定为用户的有效答复,确保每发送一个问题后都会等待用户的正确回复再进入下一轮
  • 优化字符串格式化写法,用f-string替代拼接逻辑,可读性更高

内容的提问来源于stack exchange,提问作者Feris Daou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:36:04