我从Gmail中提取了一些电子邮件地址。这是一个在cron作业中运行的简单Python脚本,基于Python gdata library(当前为v2.0.18)。在
截至本月早些时候,由于Googledeprecating 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应用程序),但忘记了我必须转换这个脚本。现在我在这里,我发现我不知道我该怎么做。在
我找到的所有参考资料,比如googleapps开发者博客上的here,或者StackOverflow上的here和{a5},都表明解决方案是使用OAuth2Token。但是,这需要来自googleapi控制台的客户机id和客户机机密,后者与应用程序绑定在一起。我没有申请。我只想验证一下我的脚本。在
有人能建议在一个独立的脚本中正确的方法吗?或者是我运气不好,再也没有办法完成这个任务了?在
这是现有联系人代码的核心:
^{pr2}$理想情况下,我希望用其他机制替换client.ClientLogin()
,该机制使用gdata保留其余代码。另外,如果gdata不能真正做到这一点,我愿意转换成其他提供类似功能的库。在
最终,使用curl编写一个shell脚本要比使用curl简单得多 搞乱gdata库。正如预期的那样,我能够 根据 OAuth2 Device Flow instructions。在
在完成验证过程后,我获得了所需的4个证书: 客户端id、客户端机密、访问令牌和刷新令牌。 根据谷歌的文档,访问令牌最终会过期。你可以 通过请求令牌管理器刷新令牌来获取新的访问令牌。 当您这样做时,您显然得到了一个新的访问令牌,但是不是一个新的刷新 令牌。在
我在
CREDENTIALS
中存储客户机id和机密以及刷新令牌 JSON格式的文件。由于访问令牌会随着时间而变化,因此它存储在ACCESS
文件中,也是JSON格式。在脚本的重要部分如下所示:
这不是世界上最漂亮的东西,但我想找些又快又脏的东西,这很管用。在
再也没有像你现在使用的那种机制了。您必须设置一个Cloud Developer project并使用OAuth2,然后重写脚本。在
为了使它尽可能的面向未来,您可以切换到最新的Contacts API。有了这个API,您可以使用OAuth2 Device flow,这对您的用例来说可能更简单。在
不是你希望听到的答案,我知道,但我认为这是唯一的答案。在
相关问题 更多 >
编程相关推荐