使用Python从Gmail获取所有联系人
我正在使用 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
指定一个非常大的数字。
不过我不会感到惊讶,如果这并不成立,你还是得用分页的方法。