如何使用People API从Google通讯录中获取所有(超过2000个)联系人

时间:2018-06-14 04:20:13

标签: node.js oauth-2.0 google-api

我正在使用Node.js开发Google API。我需要从谷歌联系人中检索所有联系人列表。列表中有超过2000个联系人,但页面大小限制为2000,所以我只使用“people.connections.list”方法获得2000个联系人。任何人都可以帮忙吗?如何获取所有联系人?

3 个答案:

答案 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 时,应采用上述建议。