discord.py开发Discord moderation bot反spam功能出现roles属性错误求解
错误原因
报错指向guild.roles调用,此时guild变量为None,不存在roles属性。on_message事件会响应所有触发的消息,包含用户给bot发送的私信消息,私信场景下message.guild不存在对应服务器对象,返回值为None,直接赋值给guild变量后后续调用就会触发该报错。
修复方案
在事件逻辑最开头增加过滤规则,跳过私信和bot自身发送的消息即可:
@client.event async def on_message(message): # 过滤bot自身消息 + 私信消息 if message.author == client.user or not message.guild: return # 后续保留你原有逻辑即可 guild = message.guild counter = 0 # 剩下的原有代码...
额外优化建议
- 当前用txt文件累计计数没有时间窗口规则,只要用户累计发满6条消息就会触发禁言,不符合反垃圾按频率检测的需求,建议改用内存字典存储用户ID和对应时间窗口内的消息时间戳列表,每次检测固定时间段内的消息数量
- 逻辑中直接使用
asyncio.sleep(20)会阻塞整个bot的事件循环,休眠期间所有其他消息都会无响应,建议改用异步后台任务处理禁言到期解除逻辑
内容的提问来源于stack exchange,提问作者realbob988
相关产品推荐
相关产品推荐

