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
相关产品推荐
相关产品推荐

