基于Nextcord与WavelinkCord的Discord音乐Bot连接Lavalink报错求助
解决Nextcord+WavelinkCord音乐机器人无法连接Lavalink的问题
问题描述
我用Python开发了基于Nextcord和WavelinkCord的Discord音乐机器人,配置好Lavalink的application.yml文件后,运行时出现连接错误:无法连接localhost:2333,提示远程计算机拒绝网络连接,wavelinkcord 2.0会重试但始终失败。以下是相关代码、配置和错误信息:
Bot代码
import nextcord from nextcord.ext import commands from nextcord.shard import EventItem import os import wavelinkcord as wavelink BOT_TOKEN = 'Token' # the prefix is not used in this example intents = nextcord.Intents.all() client = nextcord.Client(intents=intents) bot = commands.Bot(command_prefix='$', intents=intents) @bot.event async def on_ready(): # evento para quando o bot estiver pronto print(f'Loggado como {bot.user.name} - {bot.user.id}') # imprime no console o nome e o id do bot print(f'Versão: {nextcord.__version__}') # imprime no console a versão da lib print('Bot operando com sucesso...!') # imprime no console que o bot está operando com sucesso bot.loop.create_task(on_node()) # cria uma task para o evento on_node async def on_node(): # evento para quando o node estiver pronto node: wavelink.Node = wavelink.Node(uri="http://localhost:2333", password="notpass") # cria um node await wavelink.NodePool.connect(client=bot, nodes=[node]) # conecta o node ao bot wavelink.Player.autoplay = True # ativa o autoplay @bot.slash_command(guild_ids=[]) async def play(interaction: nextcord.Interaction, search: str): # comando para tocar uma música query = await wavelink.YouTubeTrack.search(search) # pesquisa a música destination = interaction.user.voice.channel # pega o canal de voz do autor da interação if not interaction.guild.voice_client: vc: wavelink.Player = await destination.connect(cls=wavelink.Player) # conecta ao canal de voz else: vc: wavelink.Player = interaction.guild.voice_client if vc.queue.is_empty and not vc.is_playing: # verifica se a fila está vazia e se não está tocando await vc.play(query) # toca a música await interaction.response.send_message(f"Tocando agora {vc.current.title}!") # envia uma mensagem de confirmação else: await vc.queue.put_wait(query) # adiciona a música à fila await interaction.response.send_message("Música adicionada à fila!") # envia uma mensagem de confirmação @bot.slash_command(guild_ids=[]) async def skip(interaction: nextcord.Interaction): # comando para pular uma música vc: wavelink.Player = interaction.guild.voice_client # pega o voice client do servidor await vc.stop() # para a música await interaction.response.send_message("Música pulada!") # envia uma mensagem de confirmação @bot.slash_command(guild_ids=[]) async def pause(interaction: nextcord.Interaction): # comando para pausar uma música vc: wavelink.Player = interaction.guild.voice_client # pega o voice client do servidor if vc.is_playing(): await vc.pause() # pausa a música await interaction.response.send_message("Música pausada!") # envia uma mensagem de confirmação else: await interaction.response.send_message("Não estou tocando nada!") @bot.slash_command(guild_ids=[]) async def resume(interaction: nextcord.Interaction): # comando para pausar uma música vc: wavelink.Player = interaction.guild.voice_client # pega o voice client do servidor if vc.is_playing(): await interaction.response.send_message("Estou tocando uma música já") # envia uma mensagem de confirmação else: await interaction.response.send_message("Música tocando!") # envia uma mensagem de confirmação await vc.resume() @bot.slash_command(guild_ids=[]) async def disconnect(interaction: nextcord.Interaction): # comando para parar uma música vc: wavelink.Player = interaction.guild.voice_client # pega o voice client do servidor await vc.disconnect() # desconecta do canal de voz await interaction.response.send_message("Desconectado do canal de voz!") # envia uma mensagem de confirmação @bot.slash_command(guild_ids=[]) async def queue(interaction: nextcord.Interaction): # comando para ver a fila vc: wavelink.Player = interaction.guild.voice_client # pega o voice client do servidor if not vc.queue.is_empty: song_counter = 0 songs = [] queue = vc.queue.copy() embed = nextcord.Embed(title="Fila de músicas", color=nextcord.Color.blurple()) for song in queue: song_counter += 1 songs.append(song) embed.add_field(name=f"[{song_counter}] - {song.title}", value=f"Duração: {song.duration}", inline=False) await interaction.response.send_message(embed=embed) else: await interaction.response.send_message("Não há músicas na fila!") bot.run(BOT_TOKEN)
Lavalink配置文件(application.yml)
server: # REST and WS server port: 2333 # you can change this if u want address: 0.0.0.0 #you can change this too spring: main: banner-mode: log lavalink: server: password: "notpass" sources: youtube: true bandcamp: false soundcloud: false twitch: false vimeo: false mixer: false http: false local: true bufferDurationMs: 400 youtubePlaylistLoadLimit: 6 # Number of pages at 100 each gc-warnings: true metrics: prometheus: enabled: false endpoint: /metrics sentry: dsn: "" # tags: # some_key: some_value # another_key: another_value logging: file: max-history: 30 max-size: 100MB path: ./logs/ level: root: INFO lavalink: INFO
错误信息(中文翻译)
连接节点时发生错误:"Node: id="O2WrMwvqEFN1", uri="http://localhost:2333", status=NodeStatus.CONNECTING"。无法连接到主机localhost:2333 ssl:default [远程计算机拒绝网络连接]
wavelinkcord 2.0 无法连接,将在 "1.9059734030955238" 秒后重试连接。
解决方案
1. 确认Lavalink服务已启动
- Lavalink是独立Java服务,必须先通过
java -jar Lavalink.jar命令启动,再运行Discord机器人。 - 启动后查看控制台输出,确认Lavalink是否成功绑定2333端口,无启动报错。
2. 检查端口占用情况
- 确保本地无其他程序占用2333端口:
- Windows:执行
netstat -ano | findstr :2333 - Linux/macOS:执行
lsof -i :2333
- Windows:执行
- 若端口被占用,可终止占用程序,或修改Lavalink配置和机器人代码中的端口号为其他未被占用的端口。
3. 验证防火墙设置
- 本地防火墙可能阻止机器人访问2333端口,需添加规则允许Python程序或Lavalink服务通过防火墙。
- 若机器人与Lavalink不在同一服务器,需将机器人代码中的
localhost替换为Lavalink服务器的公网IP,并确保服务器安全组开放2333端口。
4. 检查版本兼容性
- 确认WavelinkCord 2.0与Lavalink版本匹配,推荐使用Lavalink v4.x版本(对应Wavelink v4系列),版本不匹配会导致连接失败。
5. 优化机器人代码(可选)
- 代码中同时创建了
client和bot实例,可删除多余的client = nextcord.Client(intents=intents),避免潜在冲突。 - 添加节点错误监听事件,方便排查问题:
@bot.event async def on_wavelink_node_error(node: wavelink.Node, error: Exception): print(f"Lavalink节点错误: {node.uri}, 错误信息: {error}")
内容的提问来源于stack exchange,提问作者Francis
相关产品推荐
相关产品推荐

