我正在使用django social auth来从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)
我无法弄清楚为什么我没有与该网址进行任何接触。
关于如何获得每个联系人的任何想法?
非常感谢你的帮助!
答案 0 :(得分:1)
作为Contacts API documentation says:
即使您明确请求所有可能的结果,Contacts API也会对一次返回的结果数量进行硬性限制。如果请求的Feed包含的字段多于单个响应中可返回的字段,则API会截断Feed并添加" Next"链接,允许您请求其余的响应。
因此,您必须浏览联系人,然后按照"下一步"链接,直到您拥有所有联系人(您可以通过查找没有'下一步'链接的结果来检测到这些联系人)。
如果您不想进行额外的解析,可以尝试using the start-index
parameter要求额外的联系人(即您的程序已检索到30,因此您将设置start-index
到下一个查询的31)。该部分还建议您可能能够覆盖返回结果的限制:
如果您希望接收所有联系人,而不是仅接收默认最大值,则可以为
max-results
指定一个非常大的数字。
但如果这是错误的,我不会感到惊讶,你必须使用分页方法。