命令行云:gcalcli
如果您关注我在Linux Journal上的专栏,您可能已经知道我是命令行的忠实粉丝。当涉及到高效完成任务时,大多数时候命令行是无与伦比的。这促使我将即时通讯和 Twitter 等服务集成到 BitlBee 中,以便我可以将它们与我的命令行 IRC 客户端 Irssi 一起使用(这两者都在之前的LJ期刊中撰写过)。
您可能也意识到,与Linux Journal的其他一些作者(我看着你呢,Bill Childers)不同,我对云服务有点怀疑。话虽如此,在这个时代,似乎您无法逃避云服务,那么像我这样的人该怎么办呢?嗯,我已经弄清楚如何从我绿底黑字的终端舒适地使用云服务了。所以,我认为写几篇文章描述如何从命令行访问各种云服务可能会很有趣。
我想介绍的第一个云服务也是最流行的服务之一:Google 日历。虽然有很多日历选项,但在企业环境中,您通常谈论的是 Exchange(通常是规模较大、较老派的公司)或 Google Apps(通常是规模较小的初创公司)。Google 日历可以作为一个共享日历非常方便,特别是如果您在工作时获得了 Android 设备。此外,与所有主要的云服务一样,您可以与其他人(如 NSA)协作和共享您的数据。我对 Google 日历的主要问题一直是在每次我想查看我的日历时都必须打开浏览器。虽然我确信有些人整天都登录到 Gmail Web 界面并通过这种方式获得会议通知,但我不是。因为我通常专注于我的终端窗口,所以我经常看不到这些提醒。在错过几次会议后,我决定我需要找到某种方法将会议通知放在我的终端内。
对我来说有效的 Google 日历 CLI 是 gcalcli。它提供了一个命令行界面,可以以各种格式查看您的日历,还可以让您添加事件——所有这些都来自命令行。
安装 gcalcligcalcli 本身没有为我的发行版打包,因此安装需要我执行一些额外的步骤。首先,我将该项目的 git 存储库克隆到一个名为 src 的本地目录中,我用它来跟踪源代码(您可以随意将其替换为您用于相同目的的目录)。然后,我创建了一个指向包含的脚本的符号链接,以便我可以开始确定我需要的 Python 库
$ cd ~/src/
$ git clone https://github.com/insanum/gcalcli.git
$ sudo ln -s ~/src/gcalcli/gcalcli /usr/local/bin/gcalcli
此时,我尝试启动应用程序,但注意到我缺少一些必需的 Python 库,例如 gflags、dateutil、httplib2 和 google-api-python-client。前三个有 Debian 软件包,所以我能够使用以下命令安装它们
$ sudo apt-get install python-gflags python-dateutil
↪python-httplib2
最后一个 Python 库没有在 Debian 中打包。无论好坏,似乎几乎每种现代脚本语言都有自己对 Perl 的 CPAN 的实现,所以我退而求其次使用 Python 的 pip(我首先必须安装它)
$ sudo apt-get install python-pip
$ sudo pip install --upgrade google-api-python-client
初始设置
在所有库都安装到位后,您就可以设置 gcalcli 以使用您的 Google 帐户了。首次运行 gcalcli 时,它将设置您的帐户,但如果您不是从本地计算机运行它,您需要在首次启动它时添加一个额外的参数,以便它可以为您提供一个 URL 以在本地加载以授权 gcalcli
$ gcalcli agenda --noauth_local_webserver
设置完成后,您可以使用 agenda
命令查看您当前的日历议程(为了保护无辜者,事件已更改)
$ gcalcli agenda
Mon Jul 15 9:15am Space out and stare at screen
10:00am Meeting with the Bobs
11:00am Remodel Cubical Wall
11:45am Lunch at Flinger's
1:00pm Meeting with Michael
我发现 agenda
输出对于查看我今天要做的事情最有用;但是,您也可以分别使用 calw
和 calm
输出 ASCII 艺术风格的每周和每月日历(图 1)。

图 1. 来自官方项目页面的 gcalcli 屏幕截图
Screen 中的会议通知从命令行访问我的日历很方便,但这仍然没有完全解决我获取通知以免错过重要会议的问题。我确信很多人只是依赖浏览器中的弹出通知,但我通常不看我的浏览器,而且当我查看浏览器时,我没有登录 Gmail。但是,我几乎总是查看 screen 会话,所以我发现对我来说最好的方法是将通知放在那里。
我在 2011 年 2 月的 Hack and / 专栏中写了如何设置 screen 通知,因此如果您尚未设置您的 hardstatus 行,我建议您阅读该专栏。因为 screen 中的通知只是输出简短文本行的脚本,所以我想做的是告诉 gcalcli 显示我今天议程中尚未开始的下一个会议,或者如果今天没有更多会议,则不显示任何内容。这样,我可以一目了然地看到下一个会议是什么。
第一步是在我的本地 ~/bin/ 目录中创建一个名为 gagenda 的基本 shell 脚本,该脚本使用额外的参数调用 gcalcli,然后解析结果
$ gcalcli --nocolor --nostarted agenda "`date`" 11:59pm |
↪grep -v 'No Events' | head -2 | tail -1 | grep -v '^$'
使用这个长长的单行命令,我告诉 gcalcli 显示我议程中所有尚未开始(--nostarted
)的事件,时间范围从现在("`date`"
)到晚上 11:59。然后,如果没有事件,我 grep 掉它,以便获得空输出。如果有结果,我使用 head 和 tail 提取我想要的行。最后,如果该行是空的,我也 grep 掉它。最终结果是适合 screen 的单行输出。
当然,我不想就此止步。我想要的是让常规事件在我的输出中以白色显示,但是随着会议临近,我认为如果它变成黄色,然后最终变成红色会很好。此外,当您的 screen hardstatus 行中的命令运行时间过长时,整个 screen 会话可能会停顿,因此我的解决方案是让我的 gagenda 脚本将输出重定向到几个临时文件。使状态看起来会改变颜色的关键是在同一位置显示不同的反引号命令,每个命令都分配了自己的颜色。然后,只要您确保任何时候只有一个命令会显示输出,您就会产生只有一个状态在改变颜色的错觉。以下是实现此目的的最终 gagenda shell 脚本
#!/bin/bash
# first look for urgent events occurring
# in the next five minutes
gcalcli --nocolor --nostarted agenda "`date`" "`date -d
↪'now + 5 minutes'`" | grep -v 'No Events' | head -2 |
↪tail -1 | grep -v '^$' > /tmp/gagenda-urgent
# if there are no urgent events, look for warning
# events in the next 10 minutes
if [ ! -s /tmp/gagenda-urgent ]; then
gcalcli --nocolor --nostarted agenda "`date`" "`date -d
↪'now + 10 minutes'`" | grep -v 'No Events' | head -2 |
↪tail -1 | grep -v '^$' > /tmp/gagenda-warning
# if there are no warning events, just grab the next
# event for the day
if [ ! -s /tmp/gagenda-warning ]; then
gcalcli --nocolor --nostarted agenda "`date`" 11:59pm |
↪grep -v 'No Events' | head -2 | tail -1 |
↪grep -v '^$' > /tmp/gagenda
else
cat /dev/null > /tmp/gagenda
fi
else
cat /dev/null > /tmp/gagenda-warning
cat /dev/null > /tmp/gagenda
fi
现在我使用 crontab -e
编辑了我的本地用户的 crontab 以添加 gagenda
* * * * * /home/greenfly/bin/gagenda
要配置 screen,我使用三个新的反引号命令更新了我的 .screenrc,这些命令只是 cat 临时文件的输出
backtick 111 37 37 cat /tmp/gagenda
backtick 112 37 37 cat /tmp/gagenda-warning
backtick 113 37 37 cat /tmp/gagenda-urgent
最后,我在我的 hardstatus 行中用适当的颜色引用了这些反引号命令
hardstatus string '%{= w}%Y-%m-%d %c%{= w}|%{= w}%111`%{+b
↪y}%112`%{+b r}%113`%{-}%{= w}|%= |%{+b g}%108`%{-}|%{+b
↪b}%105`%{-}|%{= y}%107`%{= w}'
这些命令的 hardstatus 行的相关部分是
|%{= w}%111`%{+b y}%112`%{+b r}%113`%{-}%{= w}|
一旦我重新加载我的 .screenrc 文件,图 2 显示我有一个紧急会议在几分钟后。

图 2. 紧急会议
在本文中,我只是简单介绍了如何使用 gcalcli 从命令行访问您的议程,但在我的下一篇专栏文章中,我将扩展该主题,讨论如何添加新事件以及如何在不离开终端的情况下使用 Google 日历做更多事情。