使用Wavelink实现斜杠命令遇类型注解不支持报错求助
解决Wavelink结合斜杠命令时的
unsupported type annotation <class 'wavelink.tracks.YouTubeTrack'>错误 问题根源
Discord斜杠命令的参数解析器仅支持原生基础类型(如字符串、数字等),无法直接识别wavelink.YouTubeTrack这类自定义类型,直接将其作为参数注解会触发类型不支持的报错。
解决方案
将参数类型改为str接收用户的搜索关键词,在命令内部手动调用Wavelink的搜索接口获取曲目对象,同时修复原代码中的逻辑问题:
async def play(self, interaction: Interaction, search: str): # 检查用户是否在语音频道 if not interaction.user.voice: return await interaction.response.send_message("你得先加入一个语音频道!") # 延迟响应,避免长操作导致交互超时 await interaction.response.defer() # 搜索目标曲目 try: tracks = await wavelink.YouTubeTrack.search(search) if not tracks: return await interaction.followup.send("没找到匹配的曲目!") target_track = tracks[0] except Exception as e: return await interaction.followup.send(f"搜索出错:{str(e)}") # 获取或创建当前服务器的语音客户端 vc = interaction.guild.voice_client if not vc: custom_player = ZbotPlayer vc: ZbotPlayer = await interaction.user.voice.channel.connect(cls=custom_player) # 构造消息嵌入 embed = discord.Embed( title=target_track.title, url=target_track.uri, description=f"已添加到队列:{target_track.title} | 频道:{vc.channel.name}" ) embed.set_author(name=interaction.user.display_name, icon_url=interaction.user.display_avatar.url) # 处理播放/入队逻辑 if vc.is_playing(): vc.queue.put(item=target_track) await interaction.followup.send(embed=embed) else: await vc.play(target_track) await interaction.followup.send(embed=embed)
关键修改说明
- 把
search参数的类型注解从wavelink.YouTubeTrack改为str,让斜杠命令能正常接收用户输入 - 新增用户语音频道检查,提前拦截无效请求
- 使用
interaction.response.defer()延迟响应,避免搜索操作超时导致交互失败 - 手动调用
wavelink.YouTubeTrack.search()获取曲目对象,同时处理搜索失败的异常情况 - 修复原代码中**重复调用
interaction.response.send_message()**的错误(交互仅能被响应一次,后续消息需用followup.send()) - 调整语音客户端的获取逻辑,从当前服务器(
guild)获取,确保对应正确的语音频道
内容的提问来源于stack exchange,提问作者Zeph108
相关产品推荐
相关产品推荐

