使用 Shell - 通过命令行发推文
如果您像我一样在 Linux 和 UNIX 世界中待了很久(真的快 30 年了吗?怎么可能?),您会熟悉各种多人聊天的尝试,从简单的命令行工具到基于 curses 的“talk”程序,再到 Internet Relay Chat (IRC) 的混乱。偶尔有趣,但通常完全是浪费时间,与一群朋友和同事保持开放的联系仍然有一些吸引力。
几年前,Facebook 的状态栏承担了这一重任,硬核用户全天更新他们的状态,以反映他们正在参加的会议、参与的会议、与配偶或重要他人的约会、音乐会、与父母的争吵等等。问题是,只有当您圈子里的人也是狂热的 Facebook 狂热者时,这才有意义——当然,这是任何此类服务的缺点。
与此同时,快闪族的发起者发现基于 Web 的工具可以帮助他们组织活动,并创建了像 Dodgeball 这样的服务。(快闪族是由手机或短信组织起来的人群的自发聚会。)Dodgeball 被 Google 收购,然后逐渐衰落,但状态消息作为一种共享通信形式的概念继续发展,最新的发展是一种奇怪的,有时过于窥淫癖的在线服务,名为 Twitter(访问 twitter.com)。
在过去的几个月里,我发现 Twitter 异常引人入胜,这也许类似于吉米·斯图尔特在后窗中无法将目光从望远镜上移开(即使在令人叹为观止的格蕾丝·凯利照顾他时,但这完全是另一回事了)。如果一群人参加会议,Twitter 立即变得有用,让您可以轻松地聚餐、参加晚间活动、共享出租车等等,但记录您的行踪并了解您的朋友和同事在做什么也相当有趣。
Twitter 可以直接从网页工作,并且完全符合短消息服务 (SMS) 标准,因此它非常适合手机,大大提高了它的实用性。
好吧,历史课讲得不错。Dave,来点 shell 脚本怎么样?
Twitter 让我感兴趣的是,像许多现代 Web 服务一样,它有一个公共应用程序编程接口 (API),这使得破解和摆弄它既容易又有趣。虽然一些所谓的 Web 2.0 服务仍然是封闭的,但越来越多的服务正在使其后端可用于开放查询,为非常有趣的 shell 脚本和更复杂的软件和混合应用创造了许多可能性。
在本专栏中,我想向您展示从 Linux 命令行更新您的 Twitter 状态是多么容易,然后稍微思考一下如何将其用于有用的、有趣的或仅仅是平凡的任务。为了吸引您,想象一下,您可以启动一个大型软件构建,并在完成时通过短信通知您的手机,而不是让您坐在办公室里等待。
不过,首先,您可以在 twitter.com/help/api 找到 API。通读它,您会发现几乎所有的交互都是通过专门构造的 URL 完成的。这很好,因为在 shell 脚本中操作和调整字符串很容易。
Twitter API 最基本的使用是向您的帐户发送状态更新消息。这是一个如何做到这一点的例子
curl --basic --user "$user:$pass" --data-ascii \ "status=testing123" http://twitter.com/statuses/update.json
您已经可以看到将其编写为 shell 脚本的一大挑战。用户验证是通过发送帐户名和密码对来完成的,这意味着您可能会将密码嵌入到脚本中。这绝不是一个好主意。但是,每次您想发送更新时都提示输入密码也不是一个好主意。
在我们解决这个问题之前,请注意我是如何使用出色的 curl 实用程序的——这是您的 Linux 发行版必备的工具。如果您没有它,请从 curl.haxx.se 获取一份副本。curl 使通过命令行处理网页变得非常容易,我认为它是任何现代 shell 脚本程序员必不可少的工具。
回顾一下调用的命令,您会注意到我们要发送更新的 URL 是 status/update.json。阅读 API,您会注意到它支持四种不同的输出格式,不幸的是,所有这些格式在脚本中解析都很麻烦。其中一种是 json,它再次出现在这里作为接收更新的 URL 地址。
如果您已经从命令行使用过网站,您就会知道有很多非法字符不能包含在 URL 中,并且扩展到与 Web 交互的实用程序(如 curl)的命令行中。因此,我们的 send.twitter.update 脚本的任务之一是在将新状态消息发送到 Twitter 服务器之前进行所有必要的替换。
在像 Twitter 这样的轻量级服务上,我认为为了确保安全而经历太多繁琐的步骤可能很疯狂,所以我实际上会将帐户名和密码包含在脚本中。考虑到我们稍后将探讨的一些建议应用程序,为命令行更新创建一个新的 Twitter 帐户是有意义的,在这种情况下,共享密码无论如何都不是什么大问题。
这是对一个简单的 stu(发送 twitter 更新)脚本的初步尝试
#!/bin/sh user="DaveTaylor" pass="--mypw-- " curl="/usr/bin/curl" $curl --basic --user "$user:$pass" --data-ascii \ "status=`echo $@ | tr ' ' '+'`" \ "http://twitter.com/statuses/update.json" exit 0
在使用中,只需键入脚本名称和所需的状态更新
$ stu Writing makes me sleepy {"user":{"name":"Dave Taylor","description":"Blogger, entrepreneur, public speaker, dad!","screen_name":"DaveTaylor","profile_image_url":"http:\/\/s3.amazon aws.com\/twitter_production\/profile_images\/35534842\/dticon_normal.gif" ,"location":"Boulder, Colorado","url":"http:\/\/www.AskDaveTaylor.com\/","id":9973392,"protect ed":false},"created_at":"Sat Jan 12 21:31:37 +0000 2008","truncated":false,"text":"Writing makes me sleepy","source":"web","id":592217322} $
哎呀。这是一个可怕的输出,不是吗?因此,在结束本专栏之前,我强烈建议在调用 curl 之后立即附加>& /dev/null,这样您就可以丢弃输出。如果您想更花哨一点,请检查$?以查看它是否为非零,但让我们在下一专栏中讨论这种程度的改进。
Dave Taylor 是一位拥有 26 年 UNIX 经验的资深人士,The Elm Mail System 的创建者,也是畅销书Wicked Cool Shell Scripts和Teach Yourself Unix in 24 Hours的作者,这两本书只是他的 16 本技术书籍中的两本。他的主要网站是 www.intuitive.com,他还提供技术支持,网址是 AskDaveTaylor.com。如果您愿意,可以在 Twitter 上关注他:twitter.com/DaveTaylor。