Discord机器人实现hello自动回复hi时触发AttributeError报错
问题定位
报错核心是你混淆了Discord.py里的两类实例对象:
bot.get_channel(931570478915657790)返回的是TextChannel(文本频道)实例,这个对象只存储频道名称、ID、权限配置这类频道维度的属性,根本不存在content字段- 消息内容、发送者、发送频道这类消息维度的信息,全部存在
on_message事件回调传入的message参数里,从频道对象里找消息内容必然触发属性不存在的错误
除此之外原代码还有两个隐藏逻辑问题:
- 没有过滤机器人自身发送的消息,一旦触发回复,机器人发出的"hi!"会再次被
on_message事件捕获,陷入无限发消息的死循环 - 没有做目标频道校验,逻辑上无法实现仅指定频道触发回复的需求
正确实现代码
@bot.event async def on_message(message): # 过滤机器人自身发送的消息,避免无限循环 if message.author.bot: return # 校验消息来自目标频道、内容完全匹配"hello" if message.channel.id == 931570478915657790 and message.content == "hello": # 回复触发消息的用户,不需要@用户的话可以换成await message.channel.send("hi!") await message.reply("hi!") # 如果后续要给机器人加前缀/斜杠命令,必须保留这行,否则命令会失效 await bot.process_commands(message)
关键改动说明
- 移除了多余的
get_channel调用,直接从事件传入的message对象取频道ID、消息内容、作者信息,避免调用不存在的属性,同时减少不必要的接口请求 - 增加机器人自身消息过滤逻辑,从根源避免无限循环问题
- 补充
process_commands调用,兼容后续机器人的命令扩展能力
内容的提问来源于stack exchange,提问作者StormaS
相关产品推荐
相关产品推荐

