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

Discord.js中Distube音乐机器人无法加入语音频道且无报错问题求助

解决Distube机器人无法响应带歌曲名的play命令问题

从你的描述和代码来看,核心问题大概率出在DisTube实例初始化错误或者权限缺失,还有可能是错误未被正确捕获导致你看不到报错。下面是一步步的排查和解决方法:

1. 修复DisTube实例的创建方式

你的主文件里创建DisTube实例的写法有误,distube模块默认导出的是包含DisTube类的对象,而不是直接的类本身。你需要修改初始化代码:

// 主文件修正后的代码
const { DisTube } = require('distube'); // 解构获取DisTube类
client.distube = new DisTube(client, { 
  searchSongs: true, 
  emitNewSongOnly: true 
});

// 保持事件监听不变
client.distube
 .on('playSong', (message, queue, song) => message.channel.send(
 `Playing \`${song.name}\` - \`${song.formattedDuration}\`\nRequested by: ${song.user}\n${status(queue)}`,
 ))
 .on('addSong', (message, queue, song) => message.channel.send(
 `Added ${song.name} - \`${song.formattedDuration}\` to the queue by ${song.user}`,
 ))
 .on('error', (message, e) => { 
   console.error("Distube Error:", e); // 同时在控制台打印错误
   message.channel.send(`An error occurred: ${e.message}`); 
 });

之前的写法new distube(client, ...)实际上没有创建有效的DisTube实例,导致调用play方法时没有任何反应。

2. 为play命令添加错误捕获

你的play命令里没有错误捕获逻辑,即使调用play时出错,你也看不到任何提示。修改play命令代码,添加try/catch:

// play命令文件修正后的代码
const { DisTube } = require("distube");
module.exports = {
 name: 'play',
 aliases: ['p'],
 description: 'play a song!',
 async execute(client, message, args) {
  try {
    const VC = message.member.voice.channel;
    if(!VC) return message.reply('Join VC or no music!');
    const music = args.join(" ");
    if(!music) return message.reply("Please provide me a song name");
    
    // 提前检查机器人的语音权限
    const permissions = VC.permissionsFor(client.user);
    if(!permissions.has('CONNECT')) {
      return message.reply("我没有权限加入这个语音频道!");
    }
    if(!permissions.has('SPEAK')) {
      return message.reply("我没有权限在这个语音频道说话!");
    }

    await client.distube.play(message, music);
  } catch (e) {
    console.error("Play Command Error:", e); // 控制台打印详细错误
    message.channel.send(`播放失败:${e.message}`);
  }
 }
}

这样如果有任何错误,你可以在控制台看到详细信息,同时用户也能收到提示。

3. 检查机器人权限

确保你的机器人在服务器上拥有以下必要权限:

  • 连接(Connect):允许机器人加入语音频道
  • 说话(Speak):允许机器人在语音频道播放音频
  • 发送消息(Send Messages):允许机器人在文本频道发送提示
  • 嵌入链接(Embed Links):如果DisTube的提示使用了嵌入消息,需要这个权限

你可以在Discord服务器的「设置」→「角色」里找到机器人的角色,确保这些权限被勾选。

4. 检查依赖版本兼容性

Distube和Discord.js的版本需要对应:

  • 如果使用Discord.js v14,需要安装Distube v4(执行npm install distube@latest)
  • 如果使用Discord.js v13,需要安装Distube v3(执行npm install distube@3)

你可以通过npm list discord.js distube查看当前安装的版本,确保两者兼容。

5. 验证FFmpeg和Opus的安装

虽然你已经安装了相关依赖,但可以重新安装一次确保没有安装错误:

npm uninstall ffmpeg-static @discordjs/opus
npm install ffmpeg-static @discordjs/opus

做完以上这些步骤后,重新启动机器人,再测试play命令应该就能正常工作了。

内容的提问来源于stack exchange,提问作者The Infinite Star

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:28:14