Discord JS v13:如何通过用户标签获取用户内部ID
解决思路
从服务器成员集合中查找,而非全局用户缓存
原来的代码依赖client.users.cache全局缓存,但这个缓存不一定包含目标服务器的成员。直接从目标服务器的成员列表里查找更可靠,毕竟用户已经加入服务器:await guild.members.fetch(); const targetMember = guild.members.cache.find(member => member.user.tag === userTag); if (targetMember) { const userID = targetMember.user.id; // 执行赋予频道权限的逻辑 }处理缓存未命中的情况
如果缓存里找不到,直接调用服务器成员搜索接口,不用依赖缓存:try { const searchResult = await guild.members.search({ query: userTag, limit: 1 }); const targetMember = searchResult.first(); if (targetMember) { const userID = targetMember.user.id; // 后续操作 } } catch (err) { console.error("查找成员出错:", err); }检查特权网关意图和权限
Discord.js v13开始,获取服务器成员列表需要开启Server Members Intent:- 登录Discord开发者门户,进入你的Bot页面
- 在"Privileged Gateway Intents"下开启"Server Members Intent"
同时确保你的Bot在服务器内拥有GUILD_MEMBERS权限,否则无法获取成员数据。
尽量避免仅依赖用户标签
虽然旧标签系统里#后缀是唯一的,但用户改名后可能出现标签重复的极端情况。如果可以,建议让用户提供用户ID,或者找到成员后结合其他信息验证,避免出错。
内容的提问来源于stack exchange,提问作者MDoom
相关产品推荐
相关产品推荐

