Discord bot响应非指定ping问题:如何实现删除ping服务器所有者消息功能
实现Discord Bot指定功能的方案
以下代码基于主流的discord.py v2.x库编写,可直接和你已有的基础运行代码整合。
1. 修复响应非针对性ping的问题
问题原因
默认用client.user.mentioned_in(message)判断会把所有包含bot提及的场景都触发,包括@everyone、@here、同时@多人、回复自动带提及的情况,不符合精准响应的要求。
解决代码
在on_message事件的开头加入以下判断逻辑:
@client.event async def on_message(message): # 先跳过所有bot自己发的消息,避免死循环 if message.author.bot: return # 精准判断是否仅@了bot的逻辑 is_target_ping = ( not message.mention_everyone # 排除@everyone/@here的情况 and len(message.mentions) == 1 # 仅提及1个用户 and message.mentions[0] == client.user # 提及的用户是bot本身 and len(message.role_mentions) == 0 # 没有同时提及任何角色 ) # 只有满足上述条件才执行你的ping响应逻辑 if is_target_ping: await message.channel.send("你在叫我?") # 替换为你自己的响应内容
如果需要支持「回复bot的消息也算有效触发」,把or (message.reference and message.reference.resolved.author == client.user)拼到is_target_ping的判断条件里即可。
2. 自动删除ping服务器所有者的消息
前置要求
给bot开通管理消息权限,否则无法删除其他用户的消息。
实现代码
在上述on_message事件里追加以下逻辑:
# 仅处理服务器内的消息,跳过私信场景 if message.guild: guild_owner = message.guild.owner # 排除所有者自己发的消息、bot发的消息 if message.author != guild_owner and guild_owner in message.mentions: await message.delete() # 可选:给触发规则的用户发提示,delete_after参数指提示消息3秒后自动删除,不需要可以删掉下一行 await message.channel.send(f"{message.author.mention} 请勿@服务器所有者", delete_after=3)
如果需要允许管理员/特定角色的用户@所有者不被拦截,在删消息的逻辑前加判断即可:
# 示例:允许名称为「管理员」的角色不受限制,可自定义调整 if any(role.name == "管理员" for role in message.author.roles): return
完整参考框架
import discord from discord.ext import commands # 必须开启对应意图,v2.x版本默认不开启消息和成员相关权限 intents = discord.Intents.default() intents.message_content = True intents.members = True client = commands.Bot(command_prefix="!", intents=intents) @client.event async def on_ready(): print(f"已登录为 {client.user}") @client.event async def on_message(message): if message.author.bot: return # 精准响应ping逻辑 is_target_ping = ( not message.mention_everyone and len(message.mentions) == 1 and message.mentions[0] == client.user and len(message.role_mentions) == 0 ) if is_target_ping: await message.channel.send("收到你的呼叫啦~") # 删除@所有者消息逻辑 if message.guild: guild_owner = message.guild.owner if message.author != guild_owner and guild_owner in message.mentions: await message.delete() await message.channel.send(f"{message.author.mention} 禁止@服务器所有者", delete_after=3) # 如果你有用前缀指令,保留这行保证指令正常生效,没有可以删掉 await client.process_commands(message) client.run("你的Bot Token")
注意事项
- 必须去Discord开发者后台的Bot设置页,打开
Message Content Intent和Server Members Intent两个开关,否则代码会报错 - 权限不足删消息会抛出异常,可以加
try-except块捕获处理避免程序崩溃
内容的提问来源于stack exchange,提问作者Lôops
相关产品推荐
相关产品推荐

