使用discord.py开发机器人:on_message无法检测消息求助
解决discord.py机器人仅能识别自身消息的问题
嘿,我来帮你搞定这个头疼的问题!你重构代码后机器人只能抓到自己发的消息,服务器里其他人的消息完全没反应,这种情况在discord.py里大概率是意图(Intents)配置出了问题,毕竟重构时很容易把这块关键配置给漏掉。下面给你一步步排查的思路:
1. 先检查Discord开发者平台的意图开关
从Discord官方的政策更新后,message_content这个意图默认是关闭的,你得先在开发者平台开启它:
- 打开Discord开发者门户,找到你的机器人应用
- 进入「Bot」页面,往下滑找到「Privileged Gateway Intents」,把Message Content Intent的开关打开
- 别忘了保存更改!
2. 代码里正确配置Intents
光在平台开了还不够,代码里必须初始化客户端的时候传入正确的Intents对象。比如:
import discord from command_list import * from resource_functions import grab_setting_from_category # 初始化Intents,开启消息内容权限 intents = discord.Intents.default() intents.message_content = True # 这行是核心!没有它就读不到消息内容 # 用Intents创建客户端 client = discord.Client(intents=intents) print("Main initialized") # 示例on_message事件 @client.event async def on_message(message): # 如果你想跳过机器人自己的消息,可以加这行(你说能识别自己的,所以也可以不加) if message.author == client.user: return # 测试用:打印收到的消息 print(f"收到来自 {message.author.name} 的消息: {message.content}") # 你的其他业务逻辑放这里 # 启动机器人 client.run("你的机器人令牌")
如果你用的是commands.Bot类,配置逻辑也是一样的:
bot = commands.Bot(command_prefix="!", intents=intents)
3. 检查事件监听的正确性
- 确认你的
on_message函数是用@client.event(或@bot.event)正确装饰的,函数名不能写错(比如写成on_messages就完全不会触发) - 如果你用了
commands.Bot并且自定义了on_message,一定要在函数末尾加上await bot.process_commands(message),否则不仅命令不会生效,还可能影响消息事件的触发
4. 服务器权限排查
最后确认机器人在目标服务器的角色拥有以下权限:
- 查看频道
- 读取消息历史
- 发送消息(如果需要回复的话)
权限不足也可能导致机器人接收不到消息事件。
重构代码的时候很容易把之前默认的配置给改丢,尤其是discord.py v2.x之后对Intents的要求更严格,先从上面这几点排查,应该就能解决问题啦!
内容的提问来源于stack exchange,提问作者LordyLordy
相关产品推荐
相关产品推荐

