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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:20:27