在独立的Python脚本中向Google进行身份验证的正确机制是什么?
作者:互联网
我有一些代码可用于将Gmail联系人的电子邮件地址提取到文本文件中.这是一个简单的Python脚本,可在cron作业中运行,基于Python gdata library(当前为v2.0.18).
从本月初开始,由于Google deprecating the ClientLogin protocol,该功能不再起作用.产生的错误如下所示:
{'status': 401, 'body': '<?xml version="1.0" encoding="UTF-8"?>\n<errors xmlns="http://schemas.google.com/g/2005">\n <error>\n <domain>GData</domain>\n <code>required</code>\n <location type="header">Authorization</location>\n <internalReason>Login Required</internalReason>\n </error>\n</errors>\n', 'reason': 'Unauthorized'}
我知道这即将到来,并在其他地方(例如AppEngine应用程序)进行处理,但是忘记了我必须转换此脚本.现在我在这里,我发现我不知道该如何进行这项工作.
我找到的所有参考,例如Google Apps Developer博客上的here或StackOverflow上的here和here,都建议解决方案是使用OAuth2Token.但是,这需要Google API控制台提供的客户端ID和客户端密码(与应用程序绑定).我没有申请.我只想从我的脚本进行身份验证.
有人可以建议在独立脚本中执行此操作的正确方法吗?还是我不走运,没有其他机制可以完成此任务?
这是现有联系人代码的勇气:
from gdata.contacts.service import ContactsService, ContactsQuery
user = "myuser@gmail.com"
password = "mypassword"
addresses = set()
client = ContactsService(additional_headers={"GData-Version":"2"})
client.ssl = True
client.ClientLogin(user, password)
groups = client.GetGroupsFeed()
for group in groups.entry:
if group.content.text == "System Group: My Contacts":
query = ContactsQuery()
query.max_results = 9999 # large enough that we'll get "everything"
query.group = group.id.text
contacts = client.GetContactsFeed(query.ToUri())
for contact in contacts.entry:
for email in contact.email:
addresses.add(email.address.lower())
break
return addresses
理想情况下,我正在寻找将client.ClientLogin()替换为使用gdata保留其余代码的其他机制.或者,如果使用gdata不能真正做到这一点,我愿意转换为其他提供类似功能的库.
解决方法:
Can someone please suggest the proper way to do this in a standalone script? Or am I out of luck and there’s no mechanism to accomplish this any more?
没有任何一种机制与您正在使用的机制一样.您将必须设置Cloud Developer project并使用OAuth2,然后重写脚本.
为了使它尽可能地面向未来,您可以切换到最新的Contacts API.使用此API,您可以使用OAuth2 Device flow,这对于您的用例而言可能更简单.
我知道,这不是您希望听到的答案,但我认为这是唯一的答案.
标签:gdata,google-oauth,google-contacts,python 来源: https://codeday.me/bug/20191028/1951021.html