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

discord.js如何校验用户提交的Discord Tag是否对应真实用户

问题根源

你当前的实现仅查询了Discord Bot本地的用户缓存,只有和Bot产生过交互、或Bot所在服务器内的用户才会被存入缓存,大量未进入缓存的真实用户会被误判为不存在,导致校验失效。

可行解决方案

方案1:拉取服务器全量成员校验(适用Bot和用户同属至少一个共同服务器的场景)

将请求处理逻辑改为异步,主动拉取指定服务器的所有成员信息后再匹配tag,修改后代码如下:

const fs = require("fs/promises")

module.exports = async (req, res, client) => {
  // 前置校验tag格式,不符合直接返回错误,无需调用API
  const tagFormatReg = /^.+\#\d{4}$/
  if (!tagFormatReg.test(req.body.user)) {
    return res.redirect("/feedback?msg=1")
  }

  // 自行读取JSON文件,避免require内置缓存导致读取到旧数据
  const dbRaw = await fs.readFile("./webserver/feedback.json")
  const db = JSON.parse(dbRaw)
  let verifyPass = true
  let targetUser = null

  try {
    // 替换为你的目标服务器ID
    const bindGuild = await client.guilds.fetch("YOUR_GUILD_ID")
    // 拉取服务器全量成员到缓存
    await bindGuild.members.fetch()
    // 匹配用户tag
    targetUser = bindGuild.members.cache.find(mem => mem.user.tag === req.body.user)?.user
  } catch (apiErr) {
    console.error("Discord API调用失败:", apiErr)
    verifyPass = false
  }

  // 校验用户是否存在
  if (!targetUser) verifyPass = false
  // 校验是否重复提交
  if (verifyPass && db.some(item => item.dcName === req.body.dcName)) verifyPass = false

  if (verifyPass) {
    db.push(req.body)
    await fs.writeFile("./webserver/feedback.json", JSON.stringify(db))
    res.redirect("/feedback?msg=0")
  } else {
    res.redirect("/feedback?msg=1")
  }
}

方案2:接入Discord OAuth2登录(无场景限制,安全性最高)

不需要用户手动填写tag,直接在网页加入Discord授权登录按钮,用户授权后你可以直接从OAuth返回结果中拿到用户的真实tag、ID等信息,从根源避免伪造身份提交,是校验用户身份的最优方案。

额外注意事项

  • 如果你的Bot使用discord.js v10及以上版本,需要先开启GUILD_MEMBERS网关意图,否则无法拉取服务器成员列表,开启入口在Discord开发者平台的Bot设置页。
  • 调用Discord API时要做好异常捕获,避免权限不足、请求频率超限等问题导致服务崩溃。

内容的提问来源于stack exchange,提问作者hi12167pies

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:51:01