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
相关产品推荐
相关产品推荐

