Discord机器人能否互发私信?测试机器人收不到主机器人私信的解决方案咨询
解决Discord.js机器人无法接收另一个机器人私信的问题
嘿,我之前在做机器人互测的时候也碰到过一模一样的问题!两个机器人都能正常收用户私信,但互相发的私信就是收不到,大概率是这几个地方没配置对,给你一步步排查:
1. 检查测试机器人的网关权限(Intents)
Discord从v14版本开始,对消息内容的读取做了严格的权限限制,尤其是私信内容。你需要确保测试机器人在开发者门户开启了必要的intents:
- 登录Discord开发者门户,找到你的测试机器人
- 进入「Bot」标签页,滚动到「Privileged Gateway Intents」区域
- 必须开启
DirectMessages和MessageContent这两个权限(v13及更早版本可能不需要MessageContent,但v14是强制要求的) - 保存设置后,重启测试机器人,让新的权限生效
2. 检查测试机器人的消息监听逻辑
很多开发者会在代码里加一句if (message.author.bot) return;来过滤机器人发送的消息,避免重复触发命令——但这也会直接忽略掉主机器人发来的私信!你需要调整这段逻辑:
- 如果只是不想处理机器人的命令,可以针对性过滤,而不是直接跳过所有机器人消息
- 比如只在检测到命令前缀时才跳过机器人,或者单独允许主机器人的消息
举个调整后的代码例子:
// 测试机器人的消息监听代码 client.on('messageCreate', async (message) => { // 只跳过非主机器人的其他机器人消息,或者根据需求调整 const mainBotId = '你的主机器人ID'; if (message.author.bot && message.author.id !== mainBotId) { return; } // 处理私信逻辑 if (message.channel.type === 'DM') { console.log(`收到来自${message.author.tag}的私信:${message.content}`); await message.reply('已收到测试私信!'); } });
3. 确认主机器人发送私信的代码正确性
有时候问题出在发送方,而不是接收方:
- 确保主机器人是通过正确的方式获取测试机器人的用户对象,比如用
client.users.fetch()来拉取,而不是直接用缓存(缓存可能不存在) - 发送私信的代码要正确处理异步操作,避免因为未等待Promise完成导致发送失败
示例代码:
// 主机器人发送私信的代码 async function sendTestDM() { const testBotId = '你的测试机器人ID'; try { const testBot = await client.users.fetch(testBotId); await testBot.send('这是主机器人发来的测试私信,请查收!'); console.log('测试私信发送成功'); } catch (error) { console.error('发送私信失败:', error); } }
4. 排除机器人屏蔽问题
虽然机器人默认不会屏蔽其他机器人,但可以手动确认一下:
- 用你的个人账号登录Discord,找到测试机器人的资料页
- 检查「隐私设置」里是否开启了「允许来自服务器成员的直接消息」(机器人属于服务器成员范畴)
- 如果之前不小心设置过屏蔽,取消屏蔽即可
按照这几步排查下来,基本就能解决机器人之间收不到私信的问题了!
内容的提问来源于stack exchange,提问作者Jim Factor
相关产品推荐
相关产品推荐

