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

如何在Google People API中获取nextPageToken实现联系人分页?

Google People API 分页获取联系人解决方案

问题核心

你无法获取nextPageToken是因为没有从API返回的$connections对象中提取该参数,且原代码中存在方法名大小写错误(会导致无法正确读取联系人信息)。以下是修复后的完整代码,实现自动分页获取所有联系人:

修复后的代码

session_start();

require __DIR__ . '/vendor/autoload.php';

$client = new Google_Client();

$client->setAuthConfig('MyloginKey.json');
// 修正redirect_uri为完整合法的URL,比如你的域名路径
$redirect_uri = 'https://' . $_SERVER['HTTP_HOST'] . '/';
$client->setRedirectUri($redirect_uri);

$client->setApprovalPrompt("force");
$client->addScope('profile');
$client->addScope('email');
$client->addScope('https://www.googleapis.com/auth/contacts.readonly');

if (isset($_GET['oauth'])) {
    // 启动授权流程
    $auth_url = $client->createAuthUrl();
    header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else if (isset($_GET['code'])) {
    // 交换授权码获取AccessToken
    $client->authenticate($_GET['code']);
    $_SESSION['access_token'] = $client->getAccessToken();
    header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
} else if ($_SESSION['access_token']) {
    $client->setAccessToken($_SESSION['access_token']);
    $service = new Google_Service_PeopleService($client);

    $nextPageToken = null;
    // 循环分页获取所有联系人,直到没有下一页token
    do {
        $optParams = array(
            'pageSize' => 1000, // API允许的最大单页数量,提升请求效率
            'personFields' => 'names,emailAddresses,phoneNumbers',
            'sortOrder' => 'FIRST_NAME_ASCENDING',
        );
        // 如果有下一页token,添加到请求参数中
        if ($nextPageToken) {
            $optParams['pageToken'] = $nextPageToken;
        }

        $connections = $service->people_connections->listPeopleConnections('people/me', $optParams);

        // 处理当前页的联系人数据
        foreach ($connections as $connection) {
            if (!empty($connection->getNames()[0])) {
                echo $connection->getNames()[0]->getDisplayName() . '<br>';
                // 修正方法名大小写:getPhoneNumbers、getCanonicalForm
                if (!empty($connection->getPhoneNumbers()[0])) {
                    echo $connection->getPhoneNumbers()[0]->getCanonicalForm() . '<br>';
                } else {
                    echo "0<br>";
                }
                // 修正方法名大小写:getEmailAddresses、getValue
                if (!empty($connection->getEmailAddresses()[0])) {
                    echo $connection->getEmailAddresses()[0]->getValue() . '<br>';
                } else {
                    echo "0<br>";
                }
            }
            echo '<hr>'; // 分隔每个联系人
        }

        // 获取下一页token,用于下一次请求
        $nextPageToken = $connections->getNextPageToken();
    } while ($nextPageToken);

} else {
    $redirect_uri = 'https://' . $_SERVER['HTTP_HOST'] . '/?oauth';
    header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

关键修改说明

  1. 获取nextPageToken:通过$connections->getNextPageToken()从API响应中提取分页token,当该值为null时表示已获取所有联系人。
  2. 循环分页请求:使用do-while循环,每次请求带上上一页返回的nextPageToken,直到没有下一页为止。
  3. 修正方法名大小写:Google API的方法采用驼峰命名,原代码中的getphoneNumbers、getcanonicalForm、getvalue均为小写开头,会导致无法读取数据,已修正为getPhoneNumbers()、getCanonicalForm()、getValue()。
  4. 优化pageSize:设置为API允许的最大值1000,减少请求次数,提升效率。
  5. 修正redirect_uri:原代码中设置为localhost不合法,改为完整的HTTPS URL,符合OAuth2.0规范。

内容的提问来源于stack exchange,提问作者Coenie Janse van Rensburg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:48:14