使用discord.py开发机器人无法接收Discord消息求助
Discord机器人无法接收消息的排查与解决
一、确认Intents配置的完整性
- 先进入Discord开发者门户的Bot页面,找到
Privileged Gateway Intents,必须开启Message Content Intent——这是获取消息内容的核心开关,代码设置再正确,门户没开也无法生效。 - 代码里的Intents要同步配置:
import discord intents = discord.Intents.default() intents.message_content = True # 必须开启此项 intents.messages = True # 确保消息事件意图启用 bot = discord.ext.commands.Bot(command_prefix="!", intents=intents)
二、检查消息监听逻辑
- 确保
on_message事件函数没有逻辑漏洞:
@bot.event async def on_message(message): if message.author.bot: # 跳过机器人自身发送的消息 return print(f"用户消息:{message.content}") # 直接打印消息内容用于排查 await bot.process_commands(message) # 使用命令系统时必须添加此行,否则命令无法生效
- 如果使用的是新的斜杠命令(
discord.Bot),要改用@bot.slash_command()装饰器,on_message不会触发斜杠命令事件。
三、权限与角色验证
- 确认机器人在服务器的角色位置高于其他成员角色,避免权限被服务器设置覆盖
- 检查服务器权限:确保机器人拥有
读取消息历史、发送消息、查看频道这些基础权限(哪怕给了管理员权限,也手动确认一遍) - 若需要处理用户信息,需开启成员缓存意图:
intents.members = True
四、代码结构与导入检查
main.py要正确初始化并启动机器人:
# main.py from bot import bot if __name__ == "__main__": bot.run("你的机器人TOKEN")
- 确认
responses.py的函数调用正确,比如在bot.py中:
import responses @bot.event async def on_message(message): if message.author.bot: return reply = responses.generate_reply(message.content) await message.channel.send(reply)
五、常见排查点
- 不要漏写
await bot.process_commands(message),否则基于@bot.command()的命令不会被处理 - 验证机器人TOKEN是否正确,有没有过期或输入错误
- 测试时发送普通文本消息,斜杠命令需要对应监听逻辑,不会触发
on_message事件
内容的提问来源于stack exchange,提问作者Mayank Aggarwal
相关产品推荐
相关产品推荐

