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

Discord.py中能否在私信(DM)中使用斜杠命令?及权限报错解决方案咨询

解决Discord机器人私信斜杠命令403 Missing Access问题

首先,你遇到的discord.errors.Forbidden: 403 Forbidden (error code: 50001): Missing Access报错,核心原因很明确:你给斜杠命令指定了guild_ids参数,这会把命令的生效范围严格限定在你指定的服务器内,而私信(DM)不属于任何服务器,所以机器人无法在DM环境中识别并执行这个命令

下面给你几个可行的解决方案,按推荐程度排序:

1. 移除guild_ids,将命令设为全局命令

这是最直接的解决方式,去掉guild_ids参数后,命令会变成全局命令,同步完成后就能在DM和所有服务器中使用。

修改后的代码示例(针对你当前用的discord_slash库):

from discord.ext import commands
from discord_slash import SlashCommand, SlashContext
from discord import Intents

bot = commands.Bot(command_prefix='$', intents=Intents.all())
slash = SlashCommand(bot, sync_commands=True)

# 移除guild_ids参数,让命令成为全局命令
@slash.slash(name="test")
async def test(ctx: SlashContext):
    await ctx.send("私信里的测试命令成功执行啦!")

注意:全局命令的同步需要时间,通常需要1小时左右才能在所有环境生效。如果是开发测试阶段,你可以先耐心等待,或者临时注册一个不带guild_ids的测试命令来验证DM功能。

2. 兼容服务器快速同步与DM使用(开发阶段可选)

如果你既想在特定服务器快速同步命令(避免全局同步的1小时等待),又想测试DM功能,可以注册两个相同名称的命令:一个绑定guild_ids用于服务器快速测试,一个不带参数用于DM全局使用。示例:

# 服务器快速同步版本
@slash.slash(name="test", guild_ids=[你的服务器ID])
async def test_server(ctx: SlashContext):
    await ctx.send("服务器里的测试命令!")

# DM可用的全局版本
@slash.slash(name="test")
async def test_dm(ctx: SlashContext):
    await ctx.send("私信里的测试命令!")

不过这种方式会产生重复命令,正式上线前建议合并成一个全局命令。

3. 权限与环境检查

除了代码修改,还要确认几个环境问题:

  • 确保用户没有拉黑你的机器人,且用户的Discord隐私设置允许接收机器人的私信(如果机器人和用户有共同服务器,通常默认允许;如果是用户主动添加机器人好友,也没问题)。
  • 机器人不需要额外的服务器权限来使用DM命令,只要机器人能正常和用户建立私信通道即可。

额外建议:切换到discord.py官方斜杠命令支持

你当前使用的discord_slash库已经不再维护,现在discord.py v2.0+版本已经内置了完整的斜杠命令支持,更稳定且官方维护。这里给你一个官方实现的示例,同样支持DM使用:

import discord
from discord import app_commands
from discord.ext import commands

intents = discord.Intents.all()
bot = commands.Bot(command_prefix='$', intents=intents)

@bot.tree.command(name="test")
async def test(interaction: discord.Interaction):
    await interaction.response.send_message("DM里的官方斜杠命令生效了!")

@bot.event
async def on_ready():
    await bot.tree.sync()  # 同步全局命令,若要快速同步到服务器可加guilds=[discord.Object(id=你的服务器ID)]
    print(f"已登录为 {bot.user}")

官方实现的逻辑和之前一致:只要命令没有绑定特定服务器,就能在DM中正常使用。

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

火山引擎 最新活动