Discord服务器批量修改全体成员昵称脚本报错问题问询
报错原因
- 核心错误是你错误将
members变量赋值为msg.guild.id,这是字符串类型的服务器ID,并非成员集合。你遍历字符串的单个字符调用setNickname方法,该方法不存在,因此抛出类型错误。 - 次要问题1:
await msg.guild.members.cache是无效写法,cache是本地已缓存的成员集合,默认只包含活跃/在线成员,要获取全量成员(含离线不活跃成员)需要调用members.fetch()接口拉取。 - 次要问题2:你提前定义了指定ID的服务器变量
guild但后续完全没有使用,逻辑不一致,如果你要固定修改指定ID服务器的昵称就使用该变量,修改消息所在服务器昵称可以删除冗余的guild定义。
修复后代码(适配discord.js v12/v13版本)
module.exports.run = async (client, msg, args, config) => { msg.delete(); // 校验机器人是否有管理昵称权限 if(!msg.guild.me.hasPermission("MANAGE_NICKNAMES")) return console.log('该命令需要管理昵称权限') const targetNick = args.join(" ") // 昵称长度校验 if (targetNick.length > 32) return msg.reply('昵称不能超过32个字符') // 拉取全量服务器成员,解决仅能获取活跃成员的问题 const allMembers = await msg.guild.members.fetch() console.log(`共需要修改 ${allMembers.size} 名成员的昵称,请稍候`) // 遍历所有成员修改昵称 for (const member of allMembers.values()) { // 跳过服务器所有者,Discord限制无法修改所有者昵称 if (member.id === msg.guild.ownerId) continue try { await member.setNickname(targetNick) } catch (err) { // 捕获权限不足的错误,避免脚本直接崩溃 console.log(`修改成员 ${member.user.tag} 的昵称失败:`, err.message) } } console.log(' [+] 服务器内所有可修改的成员昵称已全部修改完成'.green) }
额外注意事项
- 需要前往Discord开发者后台对应应用的Bot设置页,开启
Server Members Intent开关,否则无法拉取全量服务器成员。 - 机器人的角色排序需要高于所有你要修改昵称的成员的角色排序,否则会触发权限不足修改失败,脚本已加错误捕获,失败会打印日志不会崩溃。
- 若服务器成员数量较多,建议在循环中加入几十毫秒的延迟,避免短时间请求过多触发Discord速率限制。
内容的提问来源于stack exchange,提问作者1140
相关产品推荐
相关产品推荐

