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
相关产品推荐
相关产品推荐

