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

如何让Discord.py机器人不响应私信仅在服务器频道生效?

当然有更简便的实现方式!全局检查就是你要找的最优解

你现在的方法虽然能生效,但每个命令都要重复写判断逻辑,确实有点繁琐。用全局检查的话,只需要配置一次,所有命令就会自动拒绝私信场景,非常省心。

步骤1:添加全局检查函数

用@client.check装饰一个异步函数,判断当前上下文的guild(新版本Discord.py已替代旧版的server)是否不为None——私信场景下ctx.guild会是None,服务器频道则会返回对应的服务器对象。

from discord.ext import commands

# 初始化机器人
client = commands.Bot(command_prefix="你的命令前缀")

# 全局检查:仅允许在服务器频道执行命令
@client.check
async def only_allow_in_guild(ctx):
    return ctx.guild is not None

步骤2:添加友好的错误提示(可选但推荐)

默认情况下,用户在私信触发命令会静默失败,体验不太好。你可以添加错误处理逻辑,给用户明确的提示:

@client.event
async def on_command_error(ctx, error):
    # 捕获检查失败的异常
    if isinstance(error, commands.CheckFailure):
        await ctx.send("抱歉,这个命令只能在服务器频道中使用哦!")
    # 其他类型的错误可以按需处理,比如打印日志或者抛出
    else:
        raise error

额外说明

  • 配置完成后,所有用@client.command装饰的命令都会自动应用这个检查,不用再逐个命令写if判断了。
  • 如果有个别命令需要允许私信使用,可以给该命令单独添加检查,比如用@commands.check装饰器覆盖全局规则,或者用@commands.check_any同时满足多个检查条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:31:01