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

Discord.py开发猜数字Bot不响应反馈并报错的解决求助

问题根源及修复方案

现有代码的核心错误

  • 误将ctx.send()返回的Message消息对象当作猜测的数值:你调用await ctx.send(random.randint(low, high))返回的是Discord消息结构体,不是你发送的数字本身,直接用这个变量拼接字符串就会输出你报错里的<message id=xxx...内容
  • 没有接收用户的反馈输入:你定义了check校验函数但从未调用wait_for获取用户回复,feedback变量全程为空,循环永远不会根据用户输入调整边界,也不会停止
  • 重复生成猜测值:你在高低边界判断后又额外生成了一次猜测值,覆盖了之前的结果,边界判断完全失效
  • 未处理用户输入的大小写:用户如果输入大写的H/L/C会匹配不到判断逻辑

修复后的完整代码

import random
import discord
from discord.ext import commands
from discord.ext.commands import Bot

# 命令前缀设置为. 可自行修改
client: Bot = commands.Bot(command_prefix='.')

@client.command(aliases=['botguess'])
async def botg(ctx):
    low = 1
    high = 20
    feedback = ''
    await ctx.send('我将尝试猜测你选的1-20之间的数字')
    # 校验:仅接收触发指令的用户在当前频道发送的H/L/C类回复
    def check(message):
        return message.author == ctx.author and message.channel == ctx.channel and message.content.lower() in ['h','l','c']
    
    while feedback != 'c':
        # 先生成猜测数字,再发送消息,避免把消息对象当作数字
        if low != high:
            guess_num = random.randint(low, high)
        else:
            guess_num = low # 高低边界重合时只有这一个可能的数字
        # 发送猜测询问
        await ctx.send(f'我猜是{guess_num}?过高请回复H,过低请回复L,猜对请回复C')
        # 等待用户回复,超时时间30秒可自行调整
        feedback_msg = await client.wait_for('message', check=check, timeout=30)
        feedback = feedback_msg.content.lower()
        # 根据用户反馈调整猜测边界
        if feedback == 'h':
            high = guess_num - 1
        elif feedback == 'l':
            low = guess_num + 1
    # 猜对后输出结果
    await ctx.send(f'我猜对啦!你的数字就是{guess_num}')

# 此处填入你自己的机器人Token后启动
client.run('你的机器人Token')

额外注意事项

  • 你需要在Discord开发者后台开启机器人的消息内容权限(Message Content Intent),否则机器人无法读取用户发送的消息内容,会继续无响应
  • 可自行添加try...except捕获wait_for的超时异常,处理用户超时未回复的场景,避免代码抛出错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:36:09