如何在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)); }
关键修改说明
- 获取nextPageToken:通过
$connections->getNextPageToken()从API响应中提取分页token,当该值为null时表示已获取所有联系人。 - 循环分页请求:使用
do-while循环,每次请求带上上一页返回的nextPageToken,直到没有下一页为止。 - 修正方法名大小写:Google API的方法采用驼峰命名,原代码中的
getphoneNumbers、getcanonicalForm、getvalue均为小写开头,会导致无法读取数据,已修正为getPhoneNumbers()、getCanonicalForm()、getValue()。 - 优化pageSize:设置为API允许的最大值1000,减少请求次数,提升效率。
- 修正redirect_uri:原代码中设置为
localhost不合法,改为完整的HTTPS URL,符合OAuth2.0规范。
内容的提问来源于stack exchange,提问作者Coenie Janse van Rensburg
相关产品推荐
相关产品推荐

