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

Discord机器人定时发送!work命令无响应问题排查求助

排查Discord机器人发送命令无响应的问题

嘿,我来帮你拆解下这个问题:你的程序能正常往频道发!work,但目标机器人没反应,最常见的原因其实是大多数Discord机器人会默认忽略其他机器人发送的消息——这是开发者们常用的防护逻辑,防止机器人之间互相触发命令导致无限循环或者垃圾消息轰炸。

下面我们一步步排查和解决:

最可能的原因:目标机器人过滤了机器人消息

先做个简单测试:手动在目标频道发!work,如果目标机器人正常响应,那基本实锤它把你的机器人消息过滤掉了。

对应的解决办法:

  • 如果你能修改目标机器人的代码:可以在它的消息监听逻辑里加个白名单,允许你的机器人ID触发命令。比如:
    bot.on("message", msg => {
      // 允许你的机器人ID或者普通用户触发命令
      if (msg.author.id === "你的机器人账号ID" || !msg.author.bot) {
        // 原来的命令处理逻辑
        if (msg.content.trim() === "!work") {
          // 执行work对应的操作
        }
      }
    });
    
  • 如果你没权限改目标机器人:那只能换个思路,用普通用户账号(而非机器人账号)来发送消息。不过要注意,Discord的服务条款里对自动化用户账号有一定限制,谨慎操作哦。

代码里的小问题(虽然不是直接原因,但能让程序更健壮)

看你贴的代码,有几个可以优化的点,能避免后续可能出现的bug:

  1. 旧版discord.js里的guilds.get和channels.get已经被弃用了,新版本需要用异步的fetch方法
  2. work函数里引用的msg是外层message事件的参数,定时器触发时这个msg可能已经失效了

优化后的代码示例:

const prefix = "$Bot";

bot.on("message", msg => {
  if (msg.content.startsWith(`${prefix}_money`)) {
    console.log(`${new Date()}: 收到触发命令: ${msg.content}`);
    // 用箭头函数封装定时器逻辑,避免变量作用域问题
    setInterval(async () => {
      try {
        // 异步获取服务器和频道
        const guild = await bot.guilds.fetch('695350286516092968');
        const channel = await guild.channels.fetch('719889410149318696');
        // 发送命令
        await channel.send("!work");
        console.log(`${new Date()}: 已成功发送!work命令`);
      } catch (error) {
        console.error(`${new Date()}: 发送命令失败:`, error);
      }
    }, 120000); // 2分钟的毫秒数
  }
});

这个版本加了错误捕获,能帮你快速定位发送失败的问题,同时用了新的API,兼容性更好。

其他可能的小细节

如果上面的方法都没用,可以检查这几点:

  • 确认机器人发送消息的频道和你手动测试的频道是同一个(ID有没有输错)
  • 有些机器人的命令对大小写敏感,试试!Work或者!WORK
  • 目标机器人是否需要@它才能触发命令?比如@目标机器人 !work

先从第一个原因入手排查,这是最常见的情况,祝你顺利解决问题!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 21:22:33