Discord.js v12:如何实现机器人给服务器所有成员发私信?
如何用Discord.js v12给服务器所有成员发送私信
嘿,我来帮你搞定这个需求!用Discord.js v12实现给服务器所有成员发私信其实不难,但有几个关键细节要注意,不然机器人可能触发限流甚至被限制功能。下面一步步给你讲清楚:
首先确认权限
机器人需要在目标服务器拥有SEND_MESSAGES和VIEW_CHANNEL权限,另外要知道:无法给关闭了私信的用户发消息,这种情况会触发错误,咱们后面会处理。
核心实现代码
我直接给你写好可复用的函数,还有调用示例,你可以直接套进你的机器人代码里:
// 定义一个异步函数,负责给指定服务器的所有成员发私信 async function sendDMToAllMembers(guild, messageContent) { try { // 强制从Discord API拉取所有成员(避免缓存不全) const members = await guild.members.fetch({ force: true }); let successCount = 0; let failCount = 0; // 遍历所有成员 for (const [_, member] of members) { // 跳过所有机器人,没必要给机器人发私信 if (member.user.bot) continue; try { // 发送私信 await member.send(messageContent); successCount++; console.log(`✅ 成功给 ${member.user.tag} 发送私信`); } catch (error) { failCount++; console.error(`❌ 无法给 ${member.user.tag} 发送私信:`, error.message); } // 关键!加1秒延迟,避免触发Discord的速率限制 await new Promise(resolve => setTimeout(resolve, 1000)); } console.log(`\n📊 发送完成:成功 ${successCount} 条,失败 ${failCount} 条`); } catch (error) { console.error('❌ 获取成员列表失败:', error.message); } } // 示例:通过命令触发发送(比如输入!sendall) client.on('message', async message => { // 只响应指定命令 if (message.content.trim() === '!sendall') { // 检查命令发起者是否是管理员(避免随便谁都能触发) if (!message.member.hasPermission('ADMINISTRATOR')) { return message.reply('抱歉,你没有权限执行这个命令!'); } // 调用发送函数,这里替换成你要发的内容 await sendDMToAllMembers(message.guild, '这是机器人给你发送的批量私信内容哦!'); message.reply('开始给所有成员发送私信啦,请耐心等待~'); } });
必须注意的几个点
- 速率限制:Discord对API调用有严格限制,所以一定要加延迟(上面的1秒是比较保守的设置,如果你服务器成员很多,也可以适当调整,但别低于500毫秒),不然机器人会被暂时封禁发送消息的权限。
- 错误处理:每个发送操作都加了try/catch,就算某个用户无法接收私信,也不会影响整个批量发送的流程。
- 缓存问题:用
guild.members.fetch({ force: true })强制从API拉取成员,避免缓存里只有部分在线成员的情况。 - 跳过机器人:代码里跳过了所有机器人账号,节省资源的同时也避免不必要的错误。
内容的提问来源于stack exchange,提问作者user13746070
相关产品推荐
相关产品推荐

