如何开发Discord机器人:删除无指定角色用户的带附件消息
修复Discord机器人的附件消息过滤逻辑
看起来你已经抓准了核心需求,但代码里的条件判断逻辑出了问题,还有一些API使用的细节需要调整。我帮你梳理并修正一下:
首先,你的原代码逻辑写反了——你想要的是当用户既没有「机器人」角色,也没有「可信用户」角色时删除带附件的消息,但原条件的运算符和判断逻辑完全不符合这个需求。另外,Discord.py的旧版API已经被弃用,我们得用当前版本的标准写法。
修正后的完整代码
# 先替换成你服务器里实际的角色ID BOT_ROLE_ID = "你的机器人角色ID" TRUSTED_ROLE_ID = "你的可信用户角色ID" @client.event async def on_message(message): # 避免机器人处理自己的消息,防止循环触发 if message.author == client.user: return # 检查消息是否包含附件 if message.attachments: # 把用户的角色ID转成集合,提升查找效率 user_role_ids = {role.id for role in message.author.roles} # 核心判断:用户同时缺失两个授权角色时执行操作 if BOT_ROLE_ID not in user_role_ids and TRUSTED_ROLE_ID not in user_role_ids: await message.delete() await message.channel.send("Sorry mate only trusted members or bots can attach things to prevent spam") # 必须保留这句,否则机器人的其他命令会失效 await client.process_commands(message)
关键修正说明
- 逻辑判断修复:用
and替代原代码的or,确保只有当用户同时没有两个授权角色时才触发删除操作,原逻辑会导致判断完全失效 - API版本适配:用
message.delete()和message.channel.send()替代旧的client.delete_message和client.send_message(Discord.py v2.x及以上版本要求) - 角色ID优化:把硬编码的角色ID抽成变量,方便后续维护;用集合存储角色ID比列表查找更快
- 自我消息过滤:添加了对机器人自身消息的判断,避免它删除自己发送的提示消息
这样调整后,你的机器人就能准确拦截未授权用户的带附件消息了。
内容的提问来源于stack exchange,提问作者nbrammer_
相关产品推荐
相关产品推荐

