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

discord.py中Slash命令无法同步到指定服务器问题求助

Discord机器人Slash命令同步异常问题解决

问题1:/sync命令未在主测试服务器显示

你的代码存在几个关键问题导致该命令无法显示:

  1. 未定义的guilds变量:on_ready函数里的for g in guilds中,guilds未赋值,需替换为client.guilds才能遍历机器人已加入的服务器。
  2. 测试服同步逻辑缺陷:即使找到目标测试服,tree.sync(guild=...)仅同步当前已注册的服务器专属命令;若global_synced设为True后机器人重启,不会重新同步后续新增的/sync命令。
  3. 装饰器对象复用问题:@tree.command的guild参数重复创建discord.Object(id=TEST_GUILD_ID),建议提前定义测试服对象并复用,避免识别异常。

问题2:/run_bot命令出现在次级测试服务器

/run_bot是未指定guild参数的全局命令,只要你的机器人曾经执行过不带guild参数的tree.sync()(哪怕是旧代码版本),Discord会将该全局命令推送到所有机器人加入的服务器。即使当前未调用全局同步,Discord的服务器缓存不会自动删除旧命令,需主动覆盖或删除。

修复方案

步骤1:修正on_ready同步逻辑

替换原有on_ready函数,确保测试服专属命令能正确同步,同时避免意外全局同步:

@client.event
async def on_ready():
    await client.wait_until_ready()
    global global_synced
    if not global_synced:
        # 提前定义并复用测试服对象
        test_guild = discord.Object(id=TEST_GUILD_ID)
        try:
            # 同步测试服专属命令
            await tree.sync(guild=test_guild)
            print(f"已同步测试服{TEST_GUILD_ID}的命令")
            global_synced = True
        except Exception as e:
            print(f"测试服同步失败: {e}")

步骤2:调整/sync命令实现

让/sync命令既能同步全局,也能重新同步测试服,同时添加管理员权限验证:

# 提前定义测试服对象,全局复用
TEST_GUILD = discord.Object(id=TEST_GUILD_ID)

@tree.command(name="sync", description="同步机器人命令", guild=TEST_GUILD)
async def sync_commands(interaction: discord.Interaction):
    # 仅允许管理员执行
    if not interaction.user.guild_permissions.administrator:
        await interaction.response.send_message("你没有权限执行此命令", ephemeral=True)
        return
    
    await client.wait_until_ready()
    # 同步全局命令
    await tree.sync()
    # 重新同步测试服专属命令
    await tree.sync(guild=TEST_GUILD)
    await interaction.response.send_message("命令同步完成", ephemeral=True)

步骤3:清理残留的全局/run_bot命令

如果想让/run_bot仅在测试服可用,修改其装饰器添加guild参数,再执行一次/sync覆盖全局缓存:

@tree.command(name="run_bot", description="运行机器人", guild=TEST_GUILD)
async def run_bot(interaction: discord.Interaction):
    # 你的命令逻辑
    await interaction.response.send_message("机器人已运行")

若确实需要它作为全局命令但不想在次级服务器显示,可:

  • 手动在次级服务器删除该命令(路径:服务器设置→集成→机器人→命令)
  • 执行一次tree.sync(),确保当前代码无多余全局命令,Discord会自动更新缓存(生效需1-2小时)

额外注意事项

  • 全局同步tree.sync()易触发Discord限流,仅在命令更新后执行,不要放入on_ready中。
  • 全局命令同步生效需1-2小时,服务器专属命令通常几分钟内生效。
  • 确保TEST_GUILD_ID正确,且机器人已加入该服务器并拥有applications.commands权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:35:15