使用PHP Socialite获取Discord令牌后,通过Curl获取服务器成员列表
你已经通过Laravel Socialite成功发起Discord授权请求,代码如下:
return Socialite::driver('discord')->scopes(['email', 'identify', 'connections', 'guilds', 'rpc.api', 'guilds.join'])->redirect();
并且已经拿到回调返回的信息,但由于Discord没有开放好友列表API,转而尝试通过Curl获取服务器用户列表。我帮你完善代码并补充几个关键要点:
完整Curl实现代码
首先注意Discord API版本已更新至v10,v6早已废弃,所以先调整API地址,然后补全Curl逻辑:
// 替换为你从Socialite回调中获取的access token $authToken = "YOUR_DISCORD_ACCESS_TOKEN"; // 获取当前用户加入的所有服务器 $guildsUrl = "https://discord.com/api/v10/users/@me/guilds"; $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $guildsUrl, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer {$authToken}", "Content-Type: application/json" ], CURLOPT_SSL_VERIFYPEER => true, // 生产环境必须开启,保障安全 ]); $guildsResponse = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode === 200) { $guilds = json_decode($guildsResponse, true); // 遍历每个服务器,获取成员列表 foreach ($guilds as $guild) { $guildId = $guild['id']; // 注意:获取成员列表需要guilds.members.read权限,且服务器需开启服务器成员隐私设置 $membersUrl = "https://discord.com/api/v10/guilds/{$guildId}/members?limit=1000"; $membersCh = curl_init(); curl_setopt_array($membersCh, [ CURLOPT_URL => $membersUrl, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer {$authToken}", "Content-Type: application/json" ], ]); $membersResponse = curl_exec($membersCh); $membersHttpCode = curl_getinfo($membersCh, CURLINFO_HTTP_CODE); curl_close($membersCh); if ($membersHttpCode === 200) { $members = json_decode($membersResponse, true); // 这里可以处理成员数据,比如存入数据库或返回前端 // var_dump($members); } else { echo "获取服务器 {$guild['name']} 成员失败,状态码:{$membersHttpCode},响应:{$membersResponse}"; } } } else { echo "获取服务器列表失败,状态码:{$httpCode},响应:{$guildsResponse}"; }
关键注意事项
- 权限补充:你当前的Socialite scopes里缺少
guilds.members.read,必须添加这个权限才能获取服务器成员列表,否则会返回403权限不足错误。修改后的scopes应为:['email', 'identify', 'connections', 'guilds', 'guilds.members.read', 'rpc.api', 'guilds.join'] - API版本:Discord已经废弃v6版本API,强制使用v10,旧版本请求会被拒绝或返回弃用警告。
- 速率限制:Discord API有严格的限流规则,单IP每分钟最多请求50次,遇到429状态码时需要添加重试逻辑(带
Retry-After头指定的等待时间)。 - 服务器隐私设置:部分服务器开启了“服务器成员隐私”设置,即使你有
guilds.members.read权限,也无法获取成员列表,这种情况只能获取服务器基本信息。
内容的提问来源于stack exchange,提问作者Mehran
相关产品推荐
相关产品推荐

