使用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
相关产品推荐
相关产品推荐

