Discord机器人修改服务器昵称提示权限缺失(错误50013)求助
解决Discord API修改机器人服务器昵称的403权限问题
问题概述
使用PHP cURL调用Discord API修改机器人的服务器昵称时,尽管机器人已配置管理员权限且拥有服务器最高角色,仍返回403错误(错误码50013,提示Missing Permissions)。已核对guild_id、bot_id正确,重置过机器人Token,启用了所有Privileged Gateway Intents,网站登录范围为identity、guild,问题仍未解决。
错误信息
Failed to change bot name. Code: 403
返回内容:{"message": "Missing Permissions", "code": 50013}
现有代码
$bot_token = '...'; // Only for this article $guild_id = $_GET['guild_id']; if (!empty($_POST['bot_name'])) { $botName = $_POST['bot_name']; $ch = curl_init("https://discord.com/api/v10/users/@me"); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bot ' . $bot_token, 'Content-Type: application/json', 'User-Agent: YourBotName/1.0', ]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $bot_info_response = curl_exec($ch); curl_close($ch); $bot_info = json_decode($bot_info_response, true); $bot_id = $bot_info['id']; $change_nickname_url = "https://discord.com/api/v10/guilds/{$guild_id}/members/{$bot_id}"; $data = [ 'nick' => $botName, ]; $ch = curl_init($change_nickname_url); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bot ' . $bot_token, 'Content-Type: application/json', 'User-Agent: Sentinel/1.0', ]); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH'); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $change_nickname_response = curl_exec($ch); if ($change_nickname_response === false) { echo 'Curl error: ' . curl_error($ch); } else { $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($http_code === 200) { echo 'Bot name changed successfully.'; } else { echo 'Failed to change bot name. Code: ' . $http_code; var_dump($change_nickname_response); } } curl_close($ch); } else { $botName = null; }
解决方案
1. 确认机器人权限配置
修改机器人自身的服务器昵称,需要机器人角色拥有CHANGE_NICKNAME权限(管理员权限ADMINISTRATOR已包含该权限,但需确保实际生效):
- 进入服务器设置 → 角色
- 找到机器人对应的角色,检查
更改昵称权限是否勾选 - 确保机器人角色在服务器角色列表中的位置不低于其他可能限制权限的角色(虽对修改自身昵称影响极小,但需确认)
2. 优化API调用逻辑
无需通过/users/@me接口获取机器人ID,可直接从Discord开发者面板复制机器人ID,减少不必要的API请求,避免潜在错误。
3. 修正API成功响应判断
Discord API修改成员昵称成功时,可能返回204 No Content而非200 OK,需同时判断这两种状态码。
4. 规范请求参数
确保User-Agent格式符合要求(虽非核心问题,但规范设置可避免潜在限制),示例格式:YourBotName/1.0。
修正后的代码示例
<?php $bot_token = '你的机器人Token'; $guild_id = $_GET['guild_id']; $bot_id = '你的机器人ID'; // 直接从Discord开发者面板复制 if (!empty($_POST['bot_name'])) { $botName = $_POST['bot_name']; $change_nickname_url = "https://discord.com/api/v10/guilds/{$guild_id}/members/{$bot_id}"; $data = ['nick' => $botName]; $ch = curl_init($change_nickname_url); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bot ' . $bot_token, 'Content-Type: application/json', 'User-Agent: Sentinel/1.0', ]); curl_setopt($ch, CURLOPT_PATCH, true); // 替换CURLOPT_CUSTOMREQUEST,更直观 curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $change_nickname_response = curl_exec($ch); if ($change_nickname_response === false) { echo 'Curl error: ' . curl_error($ch); } else { $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 同时判断200和204状态码 if ($http_code === 200 || $http_code === 204) { echo 'Bot name changed successfully.'; } else { echo 'Failed to change bot name. Code: ' . $http_code; var_dump($change_nickname_response); } } curl_close($ch); } else { $botName = null; } ?>
内容的提问来源于stack exchange,提问作者Wow
相关产品推荐
相关产品推荐

