You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PHP Socialite获取Discord令牌后,通过Curl获取服务器成员列表

如何通过Laravel Socialite + Curl获取Discord服务器用户列表

你已经通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:30:43