You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:24:03