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

使用discord.py Client创建Slash Command不显示问题求助

问题分析与修复方案

核心问题点

  • 服务器匹配逻辑错误:你从环境变量获取的是GUILD_ID(服务器数字ID),但代码里用guild.name == GUILD去匹配服务器名称,类型完全不对应,导致找不到目标服务器,命令同步失败。
  • Slash命令回调参数错误:Slash命令的回调函数第一个参数必须是interaction(discord.Interaction对象),而非message,参数不匹配会导致命令注册异常。
  • 未处理重复同步:on_ready事件可能在客户端重连时多次触发,重复同步命令可能引发不必要的问题。

修复后的完整代码

import os
import discord
from discord import app_commands
from dotenv import load_dotenv
load_dotenv()

TOKEN = os.getenv("TOKEN")
GUILD_ID = int(os.getenv("GUILD_ID"))  # 将ID转为整数类型

intents = discord.Intents.all()
client = discord.Client(intents=intents)
slash = app_commands.CommandTree(client)

# 标记是否已完成命令同步,避免重复执行
synced = False

@client.event
async def on_ready():
    global synced
    if synced:
        return
    print(f"已登录为 {client.user}")
    # 直接通过ID获取目标服务器,无需遍历
    guild = client.get_guild(GUILD_ID)
    if not guild:
        print("无法找到目标服务器,请检查GUILD_ID是否正确")
        return
    print(f"正在同步命令到服务器: {guild.name} (ID: {guild.id})")
    await slash.sync(guild=discord.Object(id=GUILD_ID))
    synced = True
    print("命令同步完成")

@client.event
async def on_close():
    print(f"{client.user} 已断开连接")

# 修正回调参数,第一个参数为Interaction对象
@slash.command(name="ticket", description="创建新工单")
async def create_ticket(interaction: discord.Interaction, tag: str, title: str, content: str, level: str):
    # 必须回复交互,否则Discord会判定命令超时
    await interaction.response.send_message(
        f"工单已创建:\n标签:{tag}\n标题:{title}\n内容:{content}\n级别:{level}",
        ephemeral=True  # 仅命令发起者可见
    )
    print(f"用户 {interaction.user} 创建工单:\n标签:{tag}\n标题:{title}\n内容:{content}\n级别:{level}")

client.run(TOKEN)

额外注意事项

  • 权限验证:确保机器人在目标服务器拥有使用应用程序命令和发送消息的权限。
  • 环境变量检查:确认.env文件中的TOKEN和GUILD_ID填写正确,GUILD_ID是纯数字,不要添加引号。
  • 生效延迟:命令同步后,Discord客户端可能需要几秒到1分钟才会显示新命令,无需立即刷新判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 05:42:23