使用Python从Gmail获取所有联系人

0 投票
1 回答
2355 浏览
提问于 2025-04-18 14:14

我正在使用 Django 社交认证来从 Gmail 获取联系人。我在获取授权时没有任何问题。我发出请求后,使用 lxml 来提取电子邮件地址。

问题是,它并没有显示所有的联系人。例如,我只能获取到 30 个联系人,而我的 Gmail 账户里有超过 300 个联系人。

这是我的视图:

def get_email_google(request):
    social = request.user.social_auth.get(provider='google-oauth2')
    url = 'https://www.google.com/m8/feeds/contacts/default/full' + '?access_token=' + social.tokens['access_token']
    req = urllib2.Request(url, headers={'User-Agent' : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Ubuntu/11.04 Chromium/12.0.742.112 Chrome/12.0.742.112 Safari/534.30"})
    contacts = urllib2.urlopen(req).read()  
    contacts_xml = etree.fromstring(contacts)

    contacts_list = []

    for entry in contacts_xml.findall('{http://www.w3.org/2005/Atom}entry'):
        for address in entry.findall('{http://schemas.google.com/g/2005}email'):
            email = address.attrib.get('address')
            contacts_list.append(email)

我搞不清楚为什么通过那个网址我不能获取到所有的联系人。

有没有什么办法可以让我获取到所有的联系人呢?

非常感谢你的帮助!

1 个回答

1

根据联系人API的文档

联系人API对一次能返回的结果数量有严格限制,即使你明确请求所有可能的结果。如果请求的内容包含的字段超过了单次响应能返回的数量,API会截断内容,并添加一个“下一页”链接,让你可以请求剩下的结果。

所以你需要通过这些“下一页”链接逐页查看联系人,直到你获取到所有的联系人(你可以通过查看是否有“下一页”链接来判断是否还有更多结果)。

如果你不想做额外的解析,可以尝试使用start-index参数来请求额外的联系人(比如你的程序已经获取了30个联系人,那么在下一个查询中就把start-index设置为31)。那部分还提到你可能能够覆盖返回结果的限制:

如果你想获取所有联系人,而不仅仅是默认的最大数量,你可以为max-results指定一个非常大的数字。

不过我不会感到惊讶,如果这并不成立,你还是得用分页的方法。

撰写回答