我正在使用Node.js开发Google API。我需要从谷歌联系人中检索所有联系人列表。列表中有超过2000个联系人,但页面大小限制为2000,所以我只使用“people.connections.list”方法获得2000个联系人。任何人都可以帮忙吗?如何获取所有联系人?
答案 0 :(得分:1)
我设法通过使用递归和一些ES6功能使它正常工作。
诀窍是在下一个请求中使用从上一个请求返回的nextPageToken
,因为根据文档,people.connections.list的最大限制为2000。
const getAllContacts = async (googleApi, current = [], pageToken = undefined) => {
const {
data: { connections, nextPageToken, totalItems }
} = await googleApi.connections.list({
resourceName: 'people/me',
pageSize: 2000,
personFields: 'emailAddresses,phoneNumbers', // or whatever personFields you want
...(pageToken ? { pageToken } : {})
});
// merge contacts from this request with data from your previous requests
const contacts = [...current, ...connections];
if (nextPageToken && contacts.length < totalItems) {
return getAllContacts(googleApi, contacts, nextPageToken);
}
return contacts;
}
要使用此方法,请确保googleAPI
是以下人员api的实例
const { people } = google.people({ version: 'v1' });
const contacts = await getAllContacts(people);
答案 1 :(得分:0)
这出乎意料的复杂,因此我正在与他人分享我的解决方案。可能有一种更简单的方法来执行此操作,但这就是我使其工作的方式。这是JavaScript ES6解决方案。
尝试了很多方法之后,异步递归最终对我有用。
这是我的基本提取联系人电话:
const fetchContacts = _gapi =>
_gapi.client.people.people.connections
.list({
resourceName: 'people/me',
pageSize: 2000,
personFields,
})
.then(async response => {
const { connections, nextPageToken } = response.result;
const contacts = [...connections];
if (contacts.length >= 2000) {
await getAllContacts(contacts, nextPageToken, _gapi);
}
return contacts;
}).catch(console.error)
在then块中,如果有超过2000个联系人,我有一个条件调用getAllContacts
。
getAllContacts
是一个异步递归函数,只要有更多要提取的联系人,它就会调用getContacts
。
const getAllContacts = async (_people, _token, _gapi) => {
if (_people.length < 2000) {
// terminal case
const result = await getContacts(_gapi, _token);
return _people.push(...result.people);
}
// block to execute
const { people, nextPageToken } = await getContacts(_gapi, _token);
_people.push(...people);
getAllContacts(people, nextPageToken, _gapi);
};
获取联系人只是gapi fetch调用的简单包装,该调用返回联系人和下一页令牌。
const getContacts = (_gapi, _nextPageToken) =>
_gapi.client.people.people.connections
.list({
resourceName: 'people/me',
pageSize: 2000,
personFields,
pageToken: _nextPageToken,
})
.then(response => {
const { connections, nextPageToken } = response.result;
return { people: connections, nextPageToken };
});
答案 2 :(得分:0)
我发现 pageSize 的限制为 1000 -> https://developers.google.com/people/api/rest/v1/people.connections/list#try-it
因此当联系人超过 1000 时,应采用上述建议。