Discord.js实现无需绑定ready/message事件的机器人持续修改昵称与头像
解决方案
1. 正确的修改昵称方法
你之前尝试的两个方法都不符合discord.js的API规范,对应两种不同的修改场景正确用法如下:
- 如果你要修改机器人的全局公开用户名:使用
client.user.setUsername('新用户名'),该操作有严格速率限制(每2小时最多修改2次),修改后所有用户都能在资料卡看到曾用名记录 - 如果你要修改机器人在单个服务器内的专属昵称:需要先拿到目标服务器的实例,再调用机器人在该服务器的成员对象方法:
该操作速率限制宽松,且普通用户无法查看该修改的历史记录,只有服务器管理员能在审计日志中查到操作记录。// 替换为你的目标服务器ID const targetGuild = client.guilds.cache.get('SERVER_ID'); // 修改昵称 await targetGuild.members.me.setNickname('新服务器昵称');
2. 不绑定事件回调的实现方式
你只需要保证修改逻辑在客户端完成登录、实例初始化完成后执行即可,不需要把逻辑耦合在事件回调内,可以把修改逻辑抽成独立函数,在客户端就绪后任意场景调用即可:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ // 必须开启对应网关权限 intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers] }); // 独立的修改昵称逻辑,无事件绑定 async function changeBotNickname(newNick) { const targetGuild = client.guilds.cache.get('你的服务器ID'); if (!targetGuild) return new Error('未找到目标服务器'); return await targetGuild.members.me.setNickname(newNick); } // 登录完成后触发执行,也可以在其他任意客户端已就绪的场景调用该函数 client.once('ready', async () => { await changeBotNickname('测试昵称'); // 要实现持续自动修改可以加定时器,建议间隔不小于1分钟避免触发速率限制 setInterval(async () => { const randomNick = `机器人${Math.floor(Math.random()*100)}`; await changeBotNickname(randomNick); }, 60000); }); client.login('你的机器人令牌');
3. 无变更记录的原理
你看到的点击资料无变更记录的效果,是因为对方修改的是单服务器内的专属昵称,Discord本身就不会把服务器内昵称的修改记录同步到公开资料卡,只有全局用户名的修改才会留下公开的曾用名记录。
内容的提问来源于stack exchange,提问作者Mr_Natsu
相关产品推荐
相关产品推荐

