discord.py机器人无法读取消息的问题求助
问题分析与修复方案
核心问题总结
你的代码存在多个关键错误,导致机器人无法读取消息:
- 同时初始化
commands.Bot和discord.Client两个实例,两者冲突,最终仅运行了client实例,但该实例未正确配置消息监听逻辑 on_message函数缺少事件装饰器,无法触发消息监听- 未开启
message_content意图,Discord默认禁用该意图,导致机器人无法获取消息内容 start命令中错误引用message.author,命令上下文应使用ctx.author- TOKEN未正确从配置文件加载,硬编码的无效值无法让机器人正常连接
修复后的完整代码
import datetime import os import discord from timeit import default_timer as timer from dotenv import load_dotenv from discord.ext import commands load_dotenv() # 配置意图:开启成员管理和消息内容权限 intents = discord.Intents.default() intents.members = True intents.message_content = True # 仅初始化一个Bot实例,整合命令与消息监听功能 bot = commands.Bot(command_prefix="!", intents=intents) # 从.env文件读取TOKEN(需确保.env文件中存在DISCORD_TOKEN字段) TOKEN = os.getenv('DISCORD_TOKEN') @bot.event async def on_ready(): print(f'{bot.user} 已连接到Discord!') @bot.event async def on_message(message): # 跳过机器人自身发送的消息,避免循环触发 if message.author == bot.user: return print(f'用户 - {message.author} 发送了 - {message.content}') # 必须调用此方法,否则自定义on_message会拦截命令 await bot.process_commands(message) @bot.command() async def start(ctx): await ctx.channel.send("你已启动") # 使用ctx.author获取命令发起者,用f-string正确拼接角色名 await ctx.guild.create_role(name=f"{ctx.author}w") bot.run(TOKEN)
关键修复说明
- 移除冗余实例:
commands.Bot是discord.Client的子类,包含所有客户端功能并支持命令系统,只需保留一个Bot实例即可 - 开启消息内容意图:需先在Discord开发者门户的机器人设置中开启"Message Content Intent"权限,再在代码中启用该意图
- 添加事件装饰器:给
on_message添加@bot.event装饰器,确保Bot实例能监听消息事件 - 修复命令变量引用:命令中通过
ctx.author获取发起者,用f-string正确拼接角色名称 - 处理命令拦截:自定义
on_message时,必须调用bot.process_commands(message),否则命令会被消息监听逻辑拦截 - 正确加载TOKEN:通过
os.getenv从.env文件读取TOKEN,保证配置安全且符合规范
内容的提问来源于stack exchange,提问作者Petee
相关产品推荐
相关产品推荐

