通过命令行发推
从命令行向您的手机发送持续不断的状态更新?当然可以,只需借助 curl 和 Twitter。
如果您像我一样在 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(您也可以在 Twitter 上关注 Linux Journal,twitter.com/LinuxJournal)。