【问题标题】:How do I use a cron job in order to insert events into google calendar?如何使用 cron 作业将事件插入谷歌日历?
【发布时间】:2020-06-30 01:16:27
【问题描述】:

借助 Google Calendar 的 API,我编写了一个 Python 脚本,允许我从外部连接的源检索日历事件并将它们插入到我的 Google 日历中。当我从命令行执行脚本时,它在本地工作,但我想让它自动发生,以便外部添加的事件自动弹出在我的 Google 日历中。

似乎 cron 作业是执行此操作的最佳方式,并且鉴于我使用了 Google 日历的 API,我认为将 Cloud Functions 与 Cloud Scheduler 结合使用可能会有所帮助。但是,我真的不知道从哪里开始,如果这甚至可能,因为访问 API 需要使用 Google 对我的个人 Google 帐户进行 OAuth,这是我认为服务帐户(我认为我需要)做不到的代表我。

我需要采取哪些步骤才能允许我手动运行并使用 Google 日历对我进行身份验证的脚本每 60 秒在云中运行一次,这样我就不需要一直打开计算机?

我尝试做的事情:

我创建了一个具有完全权限的服务帐户,并尝试创建一个 http-trigger 事件,理论上该事件会在点击创建的 URL 时运行脚本。但是,它只返回一个 HTTP 500 错误。 我尝试使用 Pub/Sub 事件目标来监听和执行脚本,但这也不起作用。

我很困惑:

使用任一帐户,都需要有一个credentials.json 文件才能登录;这个文件如何与主函数一起“部署”?以及首次进行身份验证时创建的token.pickle 文件。

【问题讨论】:

  • 我需要采取哪些步骤才能允许我手动运行并使用 Google 日历对我进行身份验证的脚本每隔 60 秒在云端运行一次,这样我就不需要了让我的电脑一直开着? 为什么不自己动手,遇到障碍才问问题呢?就目前而言,这太宽泛/模糊了。请参阅How to Askhelp center
  • @AMC 我已经编辑以包含我已经尝试过做的事情......已经为此努力了几个小时
  • 如果您希望它在云中运行,Apps Script 不适合您吗?它旨在与 Google 服务协同工作,甚至像 cron 一样具有 time-based triggers
  • @RafaGuillermo 可能并不不幸,因为 Apps Script 看起来像它在 JavaScript 中工作,而且我最初用来检索数据的 API 是用仅用于 Python 的包装器编写的
  • 这很容易。 1/扔掉python库,直接调用https端点。 2/ 请参阅stackoverflow.com/questions/19766912/… 了解如何创建和使用刷新令牌

标签: python google-cloud-functions google-calendar-api google-oauth google-cloud-scheduler


【解决方案1】:

服务帐户的工作方式是需要预先授权。您将获取服务帐户电子邮件地址并与其共享日历,就像与任何其他用户一样。这里的问题是您应该只使用开发人员控制的日历来执行此操作。如果这些日历归他人所有,则不应使用服务帐户。

Oauth2 的工作方式是向用户显示一个同意屏幕,以授予您的应用程序访问其数据的权限。一旦用户授予您访问权限并假设您请求离线访问,您应该拥有该用户帐户的刷新令牌。使用刷新令牌,您可以随时请求新的访问令牌。所以这里的技巧是将用户刷新令牌存储在您的脚本可以访问它的地方,然后当 cron 作业运行时,它需要做的第一件事就是使用其刷新令牌请求新的访问令牌。

因此,您能够作为 cron 作业执行此操作的唯一方法是,如果您为要访问的帐户存储了一个刷新令牌。否则,它将要求它打开网络浏览器以请求用户同意,而您不能通过 cron 作业来做到这一点。

【讨论】:

  • 感谢您的详细解答!如果我手动为我的帐户创建一个令牌(并将其保存在一个 pickle 文件中),我可以将它重复用于 cron 作业吗?
  • 是的,只要它是一个刷新令牌即可。只是测试一下,我不知道 Python 如何在运行时加载刷新令牌。该库可能旨在以某种方式做到这一点,您只需要弄清楚那部分。像这样的东西可能是stackoverflow.com/a/37418906/1841839 抱歉,我不是 python 开发人员,我在这方面的帮助是有限的。如果你不能让它工作,提出一个与使用客户端库加载刷新令牌相关的新问题
  • 我明白了。我想我仍然不明白的是,谷歌云函数似乎只部署了我在 main.py 文件中编写的函数,而令牌是一个单独的文件。我仍然不确定如何告诉它在它旁边部署令牌或类似的东西
  • 您应该能够将令牌作为变量存储在您的 mail.py 中,然后从中加载它。安全方面,可能有人会做噩梦,但我们不要谈论这个
  • 事实证明我想得太多了。即使它是一个单独的文件,它也可以很好地读取令牌,但是在函数本身中,我从未包含用于实际接受请求的参数,即使它从未在函数中使用过,即当我真正需要 @ 时我有 main() 987654323@。哦,好吧!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 2012-08-08
相关资源
最近更新 更多