Discord.js机器人本地可运行但在Azure Linux虚拟机上无法回复消息
排查解决步骤
1. 校验discord.js版本兼容性
首先确认虚拟机上安装的discord.js版本和本地开发环境一致,执行以下命令查看版本:npm list discord.js
如果虚拟机上安装的是v14及以上版本,原有代码存在两处不兼容问题:
- 旧版
Intents.FLAGS已被替换为IntentsBitField.Flags - 消息监听事件
message已被废弃,需改为messageCreate
2. 补全网关意图配置
你当前代码仅开启了GUILDS单意图,要实现消息监听和内容读取,必须额外开启两个权限:
- 代码中添加
GUILD_MESSAGES(接收服务器消息)和MESSAGE_CONTENT(读取消息文本内容)意图 - 前往Discord开发者后台对应机器人设置页,找到Privileged Gateway Intents板块,开启
Message Content Intent开关,该权限是Discord API v10之后强制要求的特权权限,仅代码配置不开启后台开关不会生效
3. 排查Azure网络限制
虽然机器人能正常登录说明网关连接正常,但仍有可能存在出站规则拦截消息发送请求:
- 在虚拟机内执行
curl https://discord.com/api/v10/gateway,确认可以正常返回JSON数据,无超时或拒绝访问报错 - 检查Azure网络安全组(NSG)的出站规则,确认443端口出站未限制Discord相关IP段,同时检查虚拟机内部防火墙(ufw/iptables)没有拦截对应请求
4. 校验机器人权限配置
确认当前使用的机器人账号:
- 邀请进服务器时已授予
查看频道、发送消息、读取消息历史基础权限 - 对应测试频道的单独权限配置没有拒绝机器人的发信权限
修正后兼容v14版本的测试代码
const {Client, IntentsBitField } = require('discord.js'); const client = new Client({ intents: [ IntentsBitField.Flags.Guilds, IntentsBitField.Flags.GuildMessages, IntentsBitField.Flags.MessageContent ] }); const token = "hidden"; client.on("ready", () => { console.log(`Logged in as ${client.user.tag}!`); }); client.on("messageCreate", message => { if (message.content === "ping") { message.reply("pong"); } }); client.login(token);
内容的提问来源于stack exchange,提问作者savant
相关产品推荐
相关产品推荐

