如何在PHP中通过Discord用户ID获取对应徽章名称?
解决Discord用户ID转徽章名称的问题
Discord返回的public_flags是位掩码数值,每个徽章对应一个2的幂次常量,通过位运算可以判断用户拥有哪些徽章。以下是实现步骤和修改后的代码:
核心思路
- 定义官方公开的徽章与位掩码映射表
- 解析API返回的用户数据,提取
public_flags字段 - 通过位与运算判断每个徽章是否被启用,收集对应名称
- 将徽章数组加入结果并输出JSON
修改后的完整PHP代码
<?php error_reporting(0); // Discord public_flags 与徽章名称的官方映射表 $badgeMap = [ 1 << 0 => 'DISCORD_EMPLOYEE', 1 << 1 => 'PARTNERED_SERVER_OWNER', 1 << 2 => 'HYPESQUAD_EVENTS', 1 << 3 => 'BUGHUNTER_LEVEL_1', 1 << 6 => 'HOUSE_BRAVERY', 1 << 7 => 'HOUSE_BRILLIANCE', 1 << 8 => 'HOUSE_BALANCE', 1 << 9 => 'EARLY_SUPPORTER', 1 << 10 => 'TEAM_USER', 1 << 14 => 'BUGHUNTER_LEVEL_2', 1 << 16 => 'VERIFIED_BOT', 1 << 17 => 'EARLY_VERIFIED_BOT_DEVELOPER', 1 << 18 => 'DISCORD_CERTIFIED_MODERATOR', 1 << 22 => 'ACTIVE_DEVELOPER', ]; $discordId = $_GET["discord_id"]; $token = ""; // 填入你的Bot Token $url = "https://discord.com/api/users/{$discordId}"; $options = [ 'http' => [ 'header' => "Authorization: Bot {$token}\r\n", 'method' => 'GET', // 修正原代码拼写错误:methods → method ], ]; $context = stream_context_create($options); $response = file_get_contents($url, false, $context); if ($response === false) { die('Error fetching data from Discord API'); } // 解析用户数据并提取徽章 $userData = json_decode($response, true); $badges = []; foreach ($badgeMap as $flagValue => $badgeName) { if (($userData['public_flags'] & $flagValue) === $flagValue) { $badges[] = $badgeName; } } // 加入徽章数组并输出 $userData['badges'] = $badges; header('Content-Type: application/json'); echo json_encode($userData, JSON_PRETTY_PRINT); ?>
关键说明
- 修正了原代码中HTTP请求方法的拼写错误(
methods改为method),避免请求失败 - 位与运算
&用于判断用户的public_flags是否包含对应徽章的位标识 - 输出结果会包含你期望的
badges数组格式,例如:"badges": [ "HOUSE_BRAVERY", "EARLY_VERIFIED_BOT_DEVELOPER", "ACTIVE_DEVELOPER" ]
内容的提问来源于stack exchange,提问作者paulita
相关产品推荐
相关产品推荐

