自从在Google上启用双因素身份验证(又称为两步验证)后,我的Google export scripts不再有效。计算机已经过验证和信任,但不知何故,脚本不是。实际上,每次运行cron作业时,我都会收到一个新的" Google验证码"并且脚本失败了。我认为使用wget
或curl
一次性对这些脚本进行身份验证应该是一件简单的事情,但我无法找到有关如何执行此操作的任何文档。
Google身份验证方案经历了多次迭代,我似乎无法再使用curl
或mechanicalsoup
登录。我尝试使用https://accounts.google.com/ServiceLogin?continue=https://calendar.google.com/calendar/exporticalzip&Email=username@gmail.com&Passwd=application-specific-password
之类的网址,并且我总是被重定向到登录页面,通常会显示消息"请使用您的帐户密码而不是应用专用密码。"
答案 0 :(得分:4)
您是否确定要在shell脚本中使用双因素身份验证?如果是这样,您不需要尝试将您的计算机或脚本视为“受信任”。每次运行脚本时,您只需执行完整的双因子身份验证。
如果目标是跳过手动的第二个因子身份验证,我建议使用特定于应用程序的密码(正如其他答案所建议的那样)。 只是假装您没有使用双因素身份验证并使用您的真实登录名,但将密码设置为https://accounts.google.com/b/0/IssuedAuthSubTokens?hl=en生成的密码(https://www.google.com/settings/security的子网页)。< / p>
目的是将特定于应用程序的密码“Name”设置为对您有意义的值。例如,我的密码标记为“工作中的Pidgin”,“我的Android手机”,“工作中的Thunderbird Google地址簿扩展”等。您可以使用“日历和阅读器导出脚本”。如果您认为此特定于应用程序的密码已被泄露(“泄露”),只需点击同一页面上的“撤销”链接,然后为您的脚本生成新密码。
对于代码,只需使用适用于Google single factor auth的最新版本。 更新,因为原始问题使用了网址https://accounts.google.com/ServiceLogin
来启动会话登录,实际上是伪造浏览器登录。但是,谷歌并没有正式支持这一点,因为我写这篇文章时,似乎使用特定于应用程序的密码进行正常登录会出现错误消息“请使用您的帐户密码而不是应用专用密码”。
了解Google双因素身份验证和“可信计算机”的一件事是,实际实施只是为您的浏览器添加了30天到期时间的永久Cookie。受信任的计算机并不意味着您的IP地址受信任或创建了其他一些神奇的连接。除非您的脚本从您选择的浏览器中捕获“可信计算机”cookie,否则如果您将计算机标记为受信任,则根本不重要。 (谷歌表格不应该说“记住这台电脑30天”,但“相信这个浏览器和用户帐户组合30天(保存永久性cookie)”。但是,我想这被认为太技术性了......)
更新:(从我下面的评论中复制){} {3}}记录了唯一官方支持的方法(服务器到服务器应用程序)。它需要OAuth / JWT对请求进行编码并使用在https://developers.google.com/accounts/docs/OAuth2ServiceAccount创建的服务帐户私钥。作为替代方案,您可以使用ClientLogin身份验证(在2015年之前已弃用,尽力服务)。
如果您决定使用OAuth,可能需要查看https://code.google.com/apis/console和http://blog.yjl.im/2010/05/bash-oauth.html
答案 1 :(得分:0)
答案 2 :(得分:0)
使应用程序专用密码适用于我的脚本,您只需创建密码,然后在您拥有Google帐户密码的脚本中输入应用程序专用密码。
有关应用程序特定密码的详情,请参阅此处:
Application Specific Passwords
希望这会有所帮助!!
答案 3 :(得分:0)
我的python脚本停止发送电子邮件,因此我生成了应用程序特定的密码,将脚本实用程序gmail帐户(例如myscriptutility@gmail.com)更改为该密码,然后成功使用了该密码(例如'applicationpassw')通过以下python脚本片段(抱歉,没有完整的示例)。
email = SMTPHandler(mailhost=('smtp.gmail.com',587),
fromaddr='anyaddress@mail.homeserver',
toaddrs=['whoiwanttomailto@gmail.com'],
subject= webSite + ' not working',
credentials=('myscriptutility@gmail.com','applicationpassw'),
secure=())
logger.addHandler(email)
因此,至少在Windows 10上使用python 3.6.5看来,所有需要做的就是更改为在帐户和应用程序中使用16个char应用程序专用密码。