Discord价格机器人调用client.user.edit报错:修改用户名过于频繁
Discord机器人修改昵称触发频率限制问题(间隔5分钟仍报错)
问题描述
开发的Discord价格机器人通过API获取价格后更新机器人昵称,反复收到以下报错:
discord.errors.HTTPException: 400 Bad Request (error code: 50035): Invalid Form Body In username: You are changing your username or Discord Tag too fast. Try again later.
调用间隔约5分钟,已确认机器人拥有修改昵称权限,且Discord通用API限制为每分钟50次,远低于当前调用频率,但问题仍存在。相关代码:
@client.event async def on_ready(): while True: response = await getPrice() priceChange = response['priceChange']['h24'] if(priceChange > 0): await client.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name=f'24H ↗ {priceChange}%')) else: await client.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name=f'24H ↙ {priceChange}%')) await client.user.edit(username = '$' + str(response['priceUsd'])) print(response) await asyncio.sleep(300)
问题原因
你混淆了Discord的两种限制:
- 通用API调用限制(每分钟50次)和全局用户名修改的专属限制是独立的。全局用户名属于账号级别的标识,Discord为防止滥用设置了远严格于普通API的冷却时间(通常是几小时甚至更久),即使间隔5分钟,多次修改后依然会触发该限制。
解决方案
1. 改用服务器内昵称更新(推荐)
放弃修改全局用户名,改为更新机器人在目标服务器内的昵称。服务器昵称的修改限制宽松很多,适合频繁更新价格的场景:
- 先获取目标服务器的对象,再获取机器人在该服务器的成员实例,最后调用
edit(nick=...)修改昵称。
修改后的示例代码:
@client.event async def on_ready(): # 替换为你的目标服务器ID target_guild_id = 123456789012345678 target_guild = client.get_guild(target_guild_id) if not target_guild: print("未找到目标服务器,请检查服务器ID是否正确") return while True: response = await getPrice() priceChange = response['priceChange']['h24'] # 合并状态设置代码,简化逻辑 activity_name = f'24H ↗ {priceChange}%' if priceChange > 0 else f'24H ↙ {priceChange}%' await client.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name=activity_name)) # 修改服务器内昵称 bot_member = target_guild.get_member(client.user.id) if bot_member: await bot_member.edit(nick=f'${response["priceUsd"]}') else: print("无法获取机器人在服务器中的成员实例") print(response) await asyncio.sleep(300)
2. 若必须修改全局用户名
- 大幅拉长更新间隔(比如每6小时以上更新一次)
- 仅当价格变动超过设定阈值(比如±1%)时才触发更新,减少修改次数
注意事项
确保机器人在目标服务器中拥有修改昵称的权限,可在服务器设置的「角色权限」中开启「更改昵称」选项。
内容的提问来源于stack exchange,提问作者Utsav Patel
相关产品推荐
相关产品推荐

