如何在Discord自机器人中缓存成员以给服务器全员发消息?
问题:Discord自机器人如何缓存服务器所有成员?
我正在开发一款Discord自机器人,知晓这违反Discord服务条款(ToS),仍愿意承担相关风险。目前机器人仅能给已开启私信(DM)通道的用户发消息,推测原因是成员未被缓存。我希望实现给服务器所有成员发送消息的功能,请问如何在自机器人中缓存成员?
当前代码
const guild = client.guilds.cache.get("id"); if(!guild) return; guild.members.fetch(); guild.members.cache.random().createDM().then((dm => { dm.send("Dont forget to verify !").catch(e => console.log('error')) })).catch(() => {}); console.log("message sent");
解决方案
你当前代码的核心问题是guild.members.fetch()是异步操作,但你没有等待它完成就直接访问缓存,导致缓存还没填充就读取,自然只能拿到已缓存的少数成员(比如之前互动过的、开了私信的用户)。要缓存所有成员,需正确处理异步逻辑:
- 把代码放在异步函数中,用
await等待fetch()完成 - 不带参数的
guild.members.fetch()会请求服务器所有成员数据,并自动填充到guild.members.cache中
修改后的代码示例:
// 封装为异步函数 async function sendToRandomMember() { const guild = client.guilds.cache.get("你的服务器ID"); if (!guild) { console.log("未找到目标服务器"); return; } // 等待所有成员数据被获取并缓存 try { await guild.members.fetch(); } catch (e) { console.log("获取成员列表失败:", e); return; } const randomMember = guild.members.cache.random(); if (!randomMember) { console.log("服务器中无可用成员"); return; } // 尝试发送私信 try { const dmChannel = await randomMember.createDM(); await dmChannel.send("Dont forget to verify !"); console.log("消息发送成功"); } catch (e) { console.log(`给用户 ${randomMember.user.tag} 发送消息失败:`, e); } } // 执行函数 sendToRandomMember();
额外注意事项
- Discord API有严格的限流机制,如果服务器成员数量大,批量获取可能触发限流,需合理处理错误和重试逻辑
- 即使缓存了成员,部分用户可能关闭了私信权限,发送失败属于正常情况,务必捕获这类错误
- 再次明确:自机器人违反Discord服务条款,使用过程中账号可能被封禁,风险自负
内容的提问来源于stack exchange,提问作者El_3mperor
相关产品推荐
相关产品推荐

