Discord bot仅读取DM消息转发至日志频道出现无限刷屏问题求助
问题修复说明
问题根因
- 无限重复发送:未过滤bot自身发送的消息,bot转发到日志频道的消息会再次触发消息监听事件,形成无限递归循环,就会出现连发刷屏的情况。
- 未过滤服务器消息:未加私信渠道判断,所有符合监听规则的消息(包括服务器内发送的消息)都会被触发转发。
修复后的完整代码
const Discord = require("discord.js"); // 如果使用discord.js v14版本,需要额外引入ChannelType做渠道判断,v13及更早版本无需引入 // const { ChannelType } = require('discord.js'); const client = new Discord.Client({ intents:['DIRECT_MESSAGES', 'GuildMessages'], // 新增GuildMessages权限,保证bot可以往服务器内的日志频道发消息 partials: ['MESSAGE', 'CHANNEL'] // 新增CHANNEL partial,保证可以正常读取私信频道的信息 }); client.on('ready', () =>{ console.log('Bot Online!'); }); // 注意:discord.js v13及以上版本废弃了message事件,改为messageCreate,v12及更早版本可以改回监听message事件 client.on('messageCreate', async (message) => { // 过滤规则1:消息发送者是bot直接跳过,避免自身触发循环 if (message.author.bot) return; // 过滤规则2:仅处理私信消息,v14版本判断条件改为 message.channel.type === ChannelType.DM 即可 if (!message.guild) { // 替换为你自己的日志频道ID const logChannel = client.channels.cache.get('替换为实际日志频道ID'); if (logChannel) { // 可以自定义转发的消息格式,也可以直接传message.content await logChannel.send(`用户${message.author.tag}(ID:${message.author.id})发来私信:\n${message.content}`); console.log(`已转发私信:${message.author.tag} - ${message.content}`); } } return; }); client.login('替换为实际的bot token');
额外注意事项
- 代码里的频道ID、bot token需要替换为你自己的实际参数
- 要在Discord开发者后台的bot设置页开启
Message Content Intent权限,否则bot无法读取消息内容 - 如果日志频道在私有服务器内,需要先把bot邀请进对应服务器,且赋予频道的发消息权限
内容的提问来源于stack exchange,提问作者Ecstasyyy.
相关产品推荐
相关产品推荐

