如何让discord.js开发的机器人发送的命令被其他机器人正常识别?
问题解决方法
根因说明
Rhythm等所有主流Discord机器人均内置了忽略其他机器人发送的消息的拦截逻辑,目的是防止不同机器人循环触发命令导致频道刷屏、资源耗尽等异常,和你的机器人权限、发送的命令文本格式无关:你手动发送的消息属于用户身份会被Rhythm正常识别,机器人发送的消息属于Bot身份会被Rhythm直接过滤,所以永远无法通过机器人发命令的方式触发Rhythm的功能。
最优解决方案:自行实现Rhythm消息清理
不需要依赖Rhythm的prune命令,直接用discord.js原生的消息管理接口筛选删除Rhythm的消息即可,稳定性和可控性更高,修改后可运行的代码如下:
// Run dotenv require('dotenv').config(); // 导入依赖 const Discord = require('discord.js'); // 注意:discord.js v14+需要显式指定Intents,这里开启需要的权限 const client = new Discord.Client({ intents: [ Discord.Intents.FLAGS.Guilds, Discord.Intents.FLAGS.GuildMessages, Discord.Intents.FLAGS.MessageContent ] }); // 替换为你服务器内Rhythm机器人的实际用户ID const RHYTHM_BOT_ID = '替换为Rhythm的ID'; // 标记当天是否已经执行过清理,避免重复执行 let hasClearedToday = false; client.on('ready', () => { console.log(`Logged in as ${client.user.tag}!`); }); // 定时器每分钟执行一次,降低不必要的性能消耗 setInterval(function() { const date = new Date(); // 每天凌晨1点执行清理,且当天未执行过 if (date.getHours() === 1 && !hasClearedToday) { client.channels.cache.forEach(async (channel) => { // 只处理文本频道,兼容不同discord.js版本的频道type枚举 if (channel.type === 'GUILD_TEXT' || channel.type === 'text') { try { // 拉取频道内最近100条消息(可根据需求调整数量,接口上限100) const messages = await channel.messages.fetch({ limit: 100 }); // 筛选出Rhythm发送的消息 const rhythmMessages = messages.filter(msg => msg.author.id === RHYTHM_BOT_ID); // 批量删除筛选出的消息 await channel.bulkDelete(rhythmMessages, true); console.log(`频道${channel.name}清理了${rhythmMessages.size}条Rhythm消息`); } catch (err) { console.error(`频道${channel.name}清理失败:`, err); } } }); // 标记当天已执行 hasClearedToday = true; } // 跨天重置执行标记 if (date.getHours() === 0) { hasClearedToday = false; } }, 60 * 1000); // 每分钟执行一次即可,不需要每秒跑 client.login(process.env.DISCORD_TOKEN);
注意事项
- 你需要先在Discord Developer平台的Bot设置页面,找到
Privileged Gateway Intents分组,开启Message Content Intent权限,否则机器人无法拉取频道历史消息。 bulkDelete接口仅支持删除发送时间在14天以内的消息,超出14天的消息需要单条调用删除接口,日常清理场景下14天限制足够覆盖需求。- 代码中的
RHYTHM_BOT_ID需要替换为你服务器中Rhythm机器人的实际ID,你可以开启Discord开发者模式后右键Rhythm头像选择「复制用户ID」获取。
内容的提问来源于stack exchange,提问作者treyBake
相关产品推荐
相关产品推荐

