Shell 技巧 - FilmBuzz 电影问答游戏上线

作者:Dave Taylor

我上个月还确信我们会结束这个电影问答 Twitter 游戏,但是,正如您所回忆的那样,我在上一篇专栏的结尾写道:“哦。我们的空间又用完了。”

本月,我将跳过序言,直接进入正题。您应该在 twitter.com/FilmBuzz 上关注 triviabot,如果您需要了解最新进展,可以在 Linux Journal 网站上找到之前的专栏。

命令行推文

上个月,我最后向您展示了一个在命令行上发送推文的初步解决方案,如下所示:

#!/bin/sh
# tweet - command line twitter interface
user="filmbuzz"; pass="acctpasswd"
msg=$(echo $@ | sed 's/+/%2B/g;s/ /+/g')
$curl --silent --user "$user:$pass" --data-ascii \
  "status=$msg" "http://twitter.com/statuses/update.json" \ 
  > /dev/null

有了这个,发送 Twitter 更新就像输入一样简单:

$ tweet "My favorite film? Probably Lawrence of Arabia"

然后,它就进入了以太(图 1)。

Work the Shell - FilmBuzz Trivia Goes Live

图 1. 注意中间的推文。那是我们!

所以,显然您可以从命令行发送推文消息。在之前的专栏中,我们还整合了所有部分,以便能够将问答题输出到标准输出 (stdout)。

让我们把它整合起来

我们有两个命令行 shell 脚本需要整合在一起:一个将其输入作为消息发送到 Twitter,另一个实际上生成一个问答题。这是后者的运行示例:

$ generate-trivia-question.sh 
Film Trivia! Was the movie "Schindler's List"
 released in 1993, 1994 or 1996?

有很多方法可以将它们组合在一起,但我偏爱使用 $( ) 表示法的子 shell。所以,这是我如何将第一个真正的、以编程方式生成的问答题输出到 FilmBuzz Twitter 帐户的方法:

$ ./tweet $(bash generate-trivia-question.sh)

图 2 显示了输出。

Work the Shell - FilmBuzz Trivia Goes Live

图 2. 最上面的条目是我们的问答题。

太棒了!终于。

使其成为 Cron 任务

现在我们有了一种基于命令行的、通过 Twitter 生成和传播电影问答题的方法,我们需要自动化这个过程,因为我不会每隔几个小时登录并输入命令行!

当然,任何类型的自动化的首选工具都是 crontab。如果您正在阅读 Linux Journal,我想您已经熟悉它了,但如果不是,请阅读这个强大实用程序的 man 手册(man crontab).

尽管 crontab 有很多优点,但它要求您有一个简单的调用,而且我通常喜欢编写一个专门针对该 crontab 条目的脚本——像这样:

#!/bin/sh
# film trivia crontab job
tweet="/home/filmbuzz/trivia/tweet"
generateq="/home/filmbuzz/trivia/generate-trivia-question.sh"
question="$(/usr/local/bin/bash $generateq)"
$tweet "$question"
exit 0

很简单。当然,这可以从命令行运行以进行测试,但我们真正想做的是从 crontab 运行它,以查看所有路径和文件权限是否正确,以便它可以无人值守地运行。

要创建或编辑 crontab 文件,请输入:crontab -e。我每天只发送两个问答题:一个在上午 11 点,一个在下午 3 点。crontab 条目的格式有点棘手,因为时间和日期重复要求被指定为分钟、小时、月份中的日、月份和星期几,然后是命令本身。您不想指定的字段可以保留为星号(通配符)。所以,如果我想每周七天在上午 11 点和下午 3 点运行此命令,我可以最简单地将其指定为:

0 11,15 * * *     trivia-cronjob

但这不太对,因为通常您可以指望 cron 任务的 PATH 比您交互使用时使用的 PATH 要短得多,因此应该指定每个路径(包括在任何执行的脚本中)。这是我实际在我的 crontab 中拥有的:

0 11,15 * * *  $FBDIR/trivia/trivia-cronjob

哦,还有一个小问题。我的服务器在 UTC(协调世界时,又称格林威治标准时间)中运行,所以当科罗拉多州这里是上午 11:22 时,我的服务器认为现在是 2008 年格林威治标准时间 17:22:41。

因为 crontab 使用系统时间,所以我需要调整我指定的时间以满足我的期望,从 11,15 移动到 17,21。否则,我们就可以进行测试了!

嗯……什么也没发生。快速查看我的电子邮件揭示了原因:

/home/filmbuzz/trivia/trivia-cronjob: permission denied

这很容易通过 chmod 调用来修复(图 3)。

Work the Shell - FilmBuzz Trivia Goes Live

图 3. 参见最上面的条目。它活了!

正如您在图 3 中看到的那样,这解决了问题,现在我们有了一个实时的问答题注入系统,它可以抓取 Internet 电影数据库,找出正确的和两个可能但错误的发行年份,并将其发布到 Twitter 上。

下个月,我们将最终转向一个新的脚本主题。同时,如果您想享受我们长期劳动的成果并尝试您的电影问答技巧,请在 Twitter 上关注 @FilmBuzz:twitter.com/filmbuzz

Dave Taylor 是 UNIX 领域 26 年的资深人士,Elm 邮件系统的创建者,也是畅销书 Wicked Cool Shell ScriptsTeach Yourself Unix in 24 Hours 等 16 本技术书籍的作者。他的主要网站是 www.intuitive.com,他还通过 AskDaveTaylor.com 提供技术支持。通过 twitter.com/DaveTaylor 在 Twitter 上关注 Dave。

加载 Disqus 评论