
本文详解如何解决 Mineflayer 机器人在 AuthMe 插件保护的 Minecraft 服务器上因登录超时被踢出的问题,核心在于监听服务器提示消息、动态响应 /register 和 /login 指令,而非依赖固定延时发送命令。
本文详解如何解决 mineflayer 机器人在 authme 插件保护的 minecraft 服务器上因登录超时被踢出的问题,核心在于监听服务器提示消息、动态响应 `/register` 和 `/login` 指令,而非依赖固定延时发送命令。
AuthMe 是一款广泛使用的 Minecraft 登录验证插件,它会拦截未认证玩家的交互行为(如移动、聊天、破坏方块),并在首次连接时强制要求执行 /register
❌ 原方案问题分析
你的当前代码使用 setTimeout(..., 500) 在 spawn 事件后硬编码延迟发送认证指令,存在严重缺陷:
- spawn 事件仅在成功登录并生成实体后触发,但 AuthMe 会阻止未认证玩家进入游戏世界,因此 spawn 实际永远不会发生;
- 认证流程必须发生在 login 阶段(即连接建立后、世界加载前),此时应监听服务器广播的 AuthMe 提示消息,而非等待 spawn;
- 固定延时不可靠:网络波动、服务器响应延迟或 AuthMe 自定义提示文本变更都会导致指令错过窗口期。
✅ 正确解决方案:基于 message 事件的动态响应
AuthMe 会在玩家连接后立即通过系统消息(system 或 chat 类型)发送注册/登录引导。Mineflayer 提供了 message 事件(含完整 JSON 消息结构)和更易用的 chat 事件,推荐使用 bot.on('message') + 正则匹配 精准捕获 AuthMe 提示:
// 在 createBot() 内、bot 初始化后添加以下逻辑
let authCompleted = false;
bot.on('message', (jsonMsg) => {
if (authCompleted) return; // 避免重复认证
const msgText = jsonMsg.toString(); // 将 JSON 消息转为字符串便于匹配
const password = config.utils['auto-auth'].password;
// 匹配常见 AuthMe 提示(覆盖多数汉化/英文版本)
if (/register.*password/i.test(msgText)) {
console.log('[Auth] Detected register prompt → sending /register');
bot.chat(`/register ${password} ${password}`);
} else if (/login.*password/i.test(msgText) || /please.*login/i.test(msgText)) {
console.log('[Auth] Detected login prompt → sending /login');
bot.chat(`/login ${password}`);
}
});
// 可选:设置超时保护,防止卡死
setTimeout(() => {
if (!authCompleted) {
console.warn('[Auth] Warning: Auth timeout — no AuthMe prompt received within 45s');
}
}, 45000);
? 关键说明:
- bot.on('message') 监听的是原始服务端消息(包括非玩家聊天),比 chat 事件更早、更可靠;
- 正则 /register.*password/i 忽略大小写,匹配 "Please register using /register
" 等变体; - 添加 authCompleted 标志避免多次触发,提升健壮性;
- 超时提醒有助于调试(如服务器未启用 AuthMe 或提示格式异常)。
⚙️ 其他必要调整
移除 bot.once('spawn') 中的认证逻辑
完全删除原 setTimeout(..., 500) 及相关 bot.chat() 调用,避免干扰。-
确保账号凭据配置正确
你的 settings.json 中 "password": "" 为空字符串,需填入真实密码:"bot-account": { "username": "User123", "password": "Mypassword", // ← 此处必须填写! "type": "mojang" } -
启用 keepAlive 防止心跳丢失
AuthMe 服务器可能对空闲连接更敏感,在 createBot() 的选项中添加:const bot = mineflayer.createBot({ // ...原有配置 keepAlive: true, // 发送定期心跳包 pingInterval: 30000 // 每30秒ping一次(可选) });
✅ 最终验证步骤
- 启动 Bot 并观察控制台日志:应看到 [Auth] Detected ... → sending ... 日志;
- 若成功认证,后续将触发 spawn 事件(此时才真正进入世界);
- 如仍被踢出,请检查:
- 服务器 config.yml 中 timeout 值是否过短(建议 ≥45s);
- 是否启用了 forceRegister: true(强制注册,需先发 /register);
- 使用 bot.on('kicked', ...) 输出的 reason 字段定位具体失败原因。
通过消息驱动的响应式认证,你的 Mineflayer 机器人将稳定接入 AuthMe 服务器,为自动化采矿、挂机等任务提供可靠基础。











