You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:50:23