Discord机器人?weight命令报错‘weight未定义’问题求助
问题原因及解决方法
核心问题1:命令未注册
你定义了weight_command函数,但未通过装饰器告知Discord.py这是一个可触发的命令,导致bot无法识别?weight指令。
核心问题2:混乱的on_message事件处理
代码存在多处on_message定义错误:
- 一个未添加
@bot.event装饰器的普通函数,无法被bot触发 - 嵌套在其他函数内的
@bot.event装饰器写法无效,会覆盖正常事件逻辑 - 日志打印相关变量(
username、user_message等)缩进错误,不在函数作用域内
修复后的完整代码
import os from dotenv import load_dotenv import random import discord from discord.ext import commands from discord import Message load_dotenv() DISCORD_TOKEN = os.getenv('DISCORD_TOKEN') intents = discord.Intents.default() intents.message_content = True bot = commands.Bot(command_prefix='?', intents=intents) def get_response(user_input: str) -> str: lowered_input = user_input.lower() if user_input != lowered_input: return "LOWERCASE ONLY -100000 Aura, +100000000 pounds." return "" @bot.event async def on_ready() -> None: print(f'{bot.user} is now running') @bot.event async def on_message(message: Message): if message.author == bot.user: return response = get_response(message.content) if response: await message.channel.send(response) # 打印消息日志 username = str(message.author) user_message = message.content channel = str(message.channel) print(f'[{channel}] {username}: "{user_message}"') # 必须调用此方法才能处理命令 await bot.process_commands(message) @bot.command(name='weight') async def weight_command(ctx): weight = random.randint(150, 1000000) await ctx.send(f"Your weight is {weight} pounds.") if __name__ == '__main__': bot.run(DISCORD_TOKEN)
关键修复点说明
- 给
weight_command添加@bot.command(name='weight')装饰器,明确绑定?weight命令 - 重构
on_message事件:仅保留一个带@bot.event装饰器的函数,将日志逻辑移至正确作用域,确保bot.process_commands(message)被调用(这是命令能被识别的核心) - 清理无用变量(如
get_response内未使用的weight),优化返回逻辑 - 修正缩进错误,确保所有代码块处于正确作用域
内容的提问来源于stack exchange,提问作者ThatCyclone
相关产品推荐
相关产品推荐

