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

基于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
  • 若端口被占用,可终止占用程序,或修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 09:07:47