You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Discord Bot无法响应@client.command()定义的命令函数调用求助

解决Discord Bot命令无响应的问题

看起来你的dm命令没触发大概率是几个常见的配置或逻辑问题,我帮你逐一排查:

1. on_message() 阻塞了命令处理

因为你之前一直在on_message()里写命令逻辑,而discord.py的命令系统和on_message是互斥的——如果你自定义了on_message,默认不会自动处理@client.command()装饰的命令。

解决方法:在你的on_message()函数末尾加上这行代码,让Bot在处理完你的自定义消息逻辑后,再去处理命令:

@client.event
async def on_message(message):
    # 你原来的if-else分支逻辑
    await client.process_commands(message)  # 必须添加这一行!

2. 缺失关键的Intents配置

现在Discord要求Bot必须启用message_content权限才能读取消息内容,不然Bot根本看不到你发的命令前缀(.)和参数。

两步配置

  • 代码里开启Intents:
import discord
from discord.ext import commands

# 初始化Intents,开启消息内容权限
intents = discord.Intents.default()
intents.message_content = True

# 创建Bot实例时传入intents
client = commands.Bot(command_prefix='.', intents=intents)
  • 去Discord开发者门户(你的Bot页面),找到Privileged Gateway Intents,把Message Content Intent的开关打开,保存设置。

3. 检查命令函数的位置

确保你的dm命令函数是在client = commands.Bot(...)之后定义的,而且没有缩进错误(比如不小心缩进在其他函数里了)。

4. 优化异常排查

你当前的except块太宽泛,没法知道具体出错原因,建议改成捕获具体异常,方便调试:

@client.command()
async def dm(ctx, user_id=None, *, args=None):
    if user_id != None and args != None:
        try:
            target = await client.fetch_user(user_id)
            await target.send(args)
            await ctx.channel.send(f"'{args}' sent to: {target.name}")
        except discord.errors.NotFound:
            await ctx.channel.send("找不到这个用户,请检查ID是否正确。")
        except discord.errors.Forbidden:
            await ctx.channel.send("我没有权限给这个用户发私信(可能对方关闭了陌生人私信,或者把我拉黑了)。")
        except Exception as e:
            await ctx.channel.send(f"发送失败:{str(e)}")
    else:
        await ctx.channel.send("请提供用户ID和要发送的消息,格式:`.dm 用户ID 消息内容`")

最后验证命令格式

确保你调用命令的格式是正确的:比如.dm 123456789012345678 你好呀,用户ID必须是纯数字的Snowflake ID,不能是用户名或昵称。

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

火山引擎 最新活动