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

Discord机器人YouTube搜索无法返回视频URL及发送消息问题排查

解决Discord机器人a!play命令带搜索词无响应的问题

我一眼就揪出了核心问题——你的命令匹配逻辑只认**完全等于a!play**的消息!当用户输入带搜索词的a!play 某某歌曲时,这个条件根本不成立,代码直接跳过了所有后续逻辑,这就是为什么控制台没输出、机器人也不发消息的原因。下面一步步帮你修复:

1. 修复命令匹配逻辑

原来的判断只处理了纯命令的情况,我们改成用前缀分割命令和参数,这样不管有没有搜索词都能触发命令:

const { MessageEmbed } = require('discord.js'); // 确保导入MessageEmbed
const opts = { maxResults: 25, key: '(youtube api key)', type: 'video' };
const search = require('youtube-search');
const prefix = 'a!';

bot.on('message', async message => {
  if(message.author.bot) return;
  if(!message.content.startsWith(prefix)) return;

  // 分割命令和参数
  const [command, ...args] = message.content.slice(prefix.length).trim().split(/\s+/);
  if(command.toLowerCase() !== 'play') return;

  // 处理无参数情况:提示用户输入搜索词
  let query;
  if(args.length === 0) {
    const embed = new MessageEmbed()
      .setColor("#73ffdc")
      .setTitle("YouTube Search API")
      .setDescription("Please enter a search query. Remember to narrow down your search.");
    await message.channel.send(embed);

    const filter = m => m.author.id === message.author.id;
    const collectedQuery = await message.channel.awaitMessages(filter, { max: 1, time: 60000, errors: ['time'] });
    query = collectedQuery.first().content;
  } else {
    // 有参数时直接用参数作为搜索词
    query = args.join(' ');
  }

  // 执行YouTube搜索
  try {
    const results = await search(query, opts);
    if(!results || results.results.length === 0) {
      return message.channel.send("No results found for your query!");
    }

    const youtubeResults = results.results;
    let i = 0;
    const titles = youtubeResults.map(result => {
      i++;
      return `${i}) ${result.title}`;
    });

    console.log(titles);
    // 发送可选列表
    await message.channel.send({
      embed: {
        title: 'Select which song you want by typing the number',
        description: titles.join("\n")
      }
    });

    // 等待用户选择数字
    const selectFilter = m => {
      const num = parseInt(m.content);
      return m.author.id === message.author.id && num >= 1 && num <= youtubeResults.length;
    };
    const collectedSelect = await message.channel.awaitMessages(selectFilter, { max: 1, time: 60000, errors: ['time'] });
    const selectedIndex = parseInt(collectedSelect.first().content) - 1;
    const selected = youtubeResults[selectedIndex];

    // 发送选中视频的Embed
    const resultEmbed = new MessageEmbed()
      .setTitle(selected.title)
      .setURL(selected.link)
      .setDescription(selected.description || "No description available")
      .setThumbnail(selected.thumbnails.default.url);
    await message.channel.send(resultEmbed);
  } catch(err) {
    console.error("Error during search or selection:", err);
    message.channel.send("An error occurred while processing your request. Please try again later.");
  }
});

2. 其他关键修复点

  • 修正awaitMessages参数:原来的maxMatches是错误的,Discord.js中正确的参数是max;同时加上了time限制,避免用户不输入时机器人一直挂起。
  • 完善错误处理:用try/catch包裹异步逻辑,捕获搜索超时、用户未输入等错误,同时给用户反馈。
  • 处理空结果:如果搜索不到视频,及时告知用户,避免后续逻辑报错。
  • 参数兼容:支持用户直接在命令后带搜索词,也支持先输入命令再补充搜索词两种方式。

3. 测试验证

现在你可以测试两种场景:

  • 输入a!play:机器人会发送提示,等待你输入搜索词;
  • 输入a!play 你的搜索词:机器人直接执行搜索,返回可选列表,等待你选择数字后发送视频信息。

内容的提问来源于stack exchange,提问作者diceGD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:37:59