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

Discord.py cog中实现非管理员say命令禁用@everyone功能咨询

问题原因

你的代码存在3处核心错误,导致逻辑不生效:

  • 重复执行删除原消息逻辑:函数开头已经调用了一次await ctx.message.delete(),else分支又重复调用了一次,属于多余逻辑,极端情况会触发消息不存在的异常。
  • 错误地给字符串添加反应:你定义的antiping是普通文本字符串,不是Discord消息对象,无法调用add_reaction方法,必须接收ctx.send()返回的消息对象才能添加反应。
  • 自定义表情格式错误:添加自定义表情反应时,需要使用完整的<:表情名:表情ID>格式,你缺少了开头的<和结尾的>。

修复后代码

import discord
from discord.ext import commands

@commands.command()
async def say(self, ctx, *, message):
    # 仅执行一次原消息删除操作
    await ctx.message.delete()
    # 非管理员权限校验
    if not ctx.author.guild_permissions.administrator:
        if "@everyone" in message or "@here" in message:
            tip_msg = await ctx.send("你不能通过我艾特全体成员!")
            # 使用正确格式添加自定义反应
            await tip_msg.add_reaction(emoji='<:Canteveryone:890319257534103603>')
            return
        # 非管理员发送普通内容时主动禁用全体艾特,避免绕过检测
        await ctx.send(message, allowed_mentions=discord.AllowedMentions(everyone=False, here=False))
        return
    # 管理员直接发送内容
    await ctx.send(message)

可选优化

通过allowed_mentions参数可以彻底屏蔽全体艾特的触发,即使用户用零宽空格等方式绕过文本检测,也不会真的触发@everyone、@here的提醒,进一步降低滥用风险。

内容的提问来源于stack exchange,提问作者Red

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:36:03