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

Discord Bot无报错但不发送Minecraft服务器状态通知求助

问题排查与解决

核心问题分析

你的代码存在几个关键问题,导致无法触发消息发送逻辑:

1. Axios请求URL缺少协议头

你直接使用monkecraftsmp.feathermc.gg作为请求地址,Axios会将其视为相对路径而非完整URL,导致请求始终失败。但初始状态isServerOnline为false,所以catch块里的下线通知逻辑不会执行,自然没有任何日志或消息输出。

2. 频道获取依赖缓存可能失效

client.channels.cache.get()依赖Discord.js的本地缓存,如果机器人启动后频道缓存未加载完全,会返回undefined,调用send()时会静默失败(v12中未捕获的Promise错误不会直接抛出到控制台)。

3. 错误处理不完整

catch块中仅处理了服务器从在线变离线的情况,未记录请求失败的具体原因,无法排查请求本身的问题。

4. 错误的MC服务器状态检测方式

通过请求网页状态判断MC服务器是否在线并不准确——网页服务和MC游戏服务是独立的,网页上线不代表MC服务器正在运行。

修改后的代码

const Discord = require('discord.js');
const client = new Discord.Client();
const net = require('net'); // 用TCP连接检测MC服务器状态,更准确

const CHANNEL_ID = '917953832431026276';
const MC_SERVER_HOST = 'monkecraftsmp.feathermc.gg';
const MC_SERVER_PORT = 25565; // MC默认端口,若有修改请替换
let isServerOnline = false;

client.on('ready', () => {
  console.log(`Bot is ready!`);
  // 启动时先检测一次状态
  checkServerStatus();
});

// 用TCP连接检测MC服务器状态,比网页请求更准确
function checkServerStatus() {
  const socket = new net.Socket();
  let status = false;

  socket.setTimeout(3000); // 3秒超时

  socket.on('connect', () => {
    status = true;
    socket.destroy();
  });

  socket.on('timeout', () => {
    socket.destroy();
  });

  socket.on('error', () => {
    status = false;
  });

  socket.on('close', () => {
    updateServerStatus(status);
  });

  socket.connect(MC_SERVER_PORT, MC_SERVER_HOST);
}

async function updateServerStatus(newStatus) {
  if (newStatus !== isServerOnline) {
    isServerOnline = newStatus;
    const message = newStatus ? '✅ Server is online' : '🛑 Server has stopped';
    console.log(message);
    
    // 用fetch确保获取到频道,避免缓存问题
    try {
      const channel = await client.channels.fetch(CHANNEL_ID);
      await channel.send(message);
    } catch (err) {
      console.error('发送消息失败:', err);
    }
  }
}

// 每6秒检测一次
setInterval(checkServerStatus, 6000);

// 别忘了登录机器人
client.login('你的机器人令牌'); // 确保这里已正确填入令牌

关键修改说明

  • 替换状态检测方式:使用Node.js内置的net模块通过TCP连接检测MC服务器端口,这是判断MC服务器是否在线的标准方法。
  • 修复URL问题:移除了不准确的Axios网页请求,改用TCP连接。
  • 确保频道获取成功:用client.channels.fetch()替代cache.get(),强制从Discord API拉取频道信息,避免缓存缺失问题。
  • 完善错误处理:添加了消息发送失败的错误日志,便于排查权限或频道存在性问题。
  • 启动时初始化检测:机器人就绪后立即检测一次服务器状态,避免初始状态延迟。

额外检查项

  1. 确保机器人具有发送消息的权限,且目标频道未设置权限阻止机器人发言。
  2. 确认MC服务器端口正确(默认25565,若服务器修改过端口需同步调整)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:25:50