用 Linux 命令行工具自动追踪车票信息

前一篇博客中说到我买票失败的经历,也充分表达了我想买一张二手座票的意愿。怎么办呢?只好到网上各二手火车票信息平台去找了。心肠不好的人肯定幸灾了祸地在想:“哈哈,这个倒霉的小伙儿该对着浏览器不停地按 F5 了!” 你才 F5 呢,你们全家都 F5。那是典型的 Windows 用户的想法,不要以为 Linux User 跟你一样傻。

前面都是玩笑话 :)本文只是想介绍一下在 Linux 下有什么更方便的方法来追踪网页发布的信息,以展示 Linux 的命令行工具有多强大(也响应一下 Eric 师兄的文章:完全用键盘工作-3:常用的命令行工具)。

我们就拿火车网为例,通常情况下 Windows 用户为了在火车网上找一张二手火车票信息,会不断地到查询页面刷新,看有没有自己需要的车票。而一个 Linux 用户的做法会有何不同呢?一般来讲他会用工具来做这件事情,而不是在那傻刷,浪费时间。

怎么做呢?有很多种方法,我这里来介绍一种比较好玩的方法,用脚本自动跟踪信息,如果有结果就发送一个 Gtalk 消息给自己。

首先,写一个命令行发送 Gtalk 消息的 Python 脚本。其实我本打算用 freetalk 来做这件事的,奈何咱学识浅薄,不懂 freetalk 脚本该怎么写,也不知道 scheme 语言为何物。没办法,只好用 Python 来做了。下面内容就是用 Python 发送 gtalk 消息的脚本(需要 Linux 上装有 python-xmpp):

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Usage: gtsent.py "SOMEBODY@gmail.com" "Message"

import xmpp
import sys

login = 'USERNAME' # without @gmail.com
pwd   = 'PASSWORD'

cnx = xmpp.Client('gmail.com', debug=[])
cnx.connect( server=('talk.google.com', 5223) )
cnx.auth(login, pwd, 'python')

cnx.send(xmpp.Message(sys.argv[1], sys.argv[2]))

将以上内容保存为 gtsend.py 文件,chmod u+x gtsend.py,修改 USERNAME 和 PASSWORD 为你的另一个非[常用] gmail 帐户名和密码。这样执行 ./gtsend.py SOMEBODY@gmail.com "Message" 就可以给 SOMEBODY@gmail.com 发送消息了(当然了,前提是 SOMEBODY@gmail.com 好友列表中有 USERNAME@gmail.com,请注意这里大写只是为了方便阅读)。

其次,写一个 Shell 脚本,用来追踪网页,过滤信息并发送 gtalk 消息。这个就更简单了,使用火车网提供的查询表单接口,用 wget 抓下来,再 grep 一下即可,bash 脚本如下:

#!/bin/bash
URL="http://www.huoche.com.cn/piao/2piaoserach.asp?ICheci=T65&type=0"
RESULT=`wget -O - $URL | iconv -f gbk -t utf8 | grep -i -e "t65.*南京.*硬座\
.*2008-9-28"`
if [ $(echo $RESULT | wc -c) -ge 5 ]
then
  /home/solrex/gtsend.py "YOURSELF@gmail.com" "$RESULT $URL"
fi

将该脚本保存为 get_tickt.sh,chmod u+x get_tickt.sh。这个脚本的工作流程是:wget 以 GET 方式提交对 T65 转让车票的查询,得到的结果输出到标准输出,然后将 GBK 编码转换为 UTF8 编码,再 grep 看是否含有“T65 南京 硬座 2008-9-28“关键词。如果有的话,用 gtsend.py 发送一个提醒消息给自己 gtalk 帐户;如果没有结果,什么都不做。

最后,将上面脚本加入 cron 列表每 10 分钟定时执行一次。 执行 crontab -e,添加下面一行即可(注意需要修改到该脚本的路径):

*/10 * * * * /home/solrex/get_ticket.sh

然后呢,你就可以高枕无忧,开着 Gtalk 等消息吧。当然,不一定能等得到 :( ,唉,对我们来说, No news is BAD news!

当然,根据不同情况,你可以把追踪的信息换成别的东西。比如追女孩子的时候,可以用上面方法来实时跟踪她的最新博客,实时跟踪她在 BBS 上的留言,永远保持自己沙发的地位,说不定人家就感受到了你的关心,然后...具体方法我就不教了哈...

分类: Linux 标签: , , , , ,
  1. 2008年9月19日18:33 | #1

    哈哈,我也做过类似的
    提个参考意见,可以加上短信提醒,
    有2种方式可以实现:
    1,通过google calendar的sms提醒。每查到一个新信息就在calendar上加个事件,提醒方式设置成sms
    2,通过移动的139邮箱push功能,我现在是gmail每来个email就forward给139邮箱,然后移动发短信通知到手机上

    最近2年春节买火车票时,这个短信提醒帮了我和几个朋友的大忙儿了:)
    来新票了,sms上就有卖家电话,直接在手机上就拨过去了

  2. 2008年9月19日18:57 | #2

    哈,没想到读我博客的还更有高手呀!
    这个思路蛮不错,只是 Google Calendar 的短信功能和 139 信箱我都没用过,也不知道接口该怎么做。
    Anyway,就是提供一个思路嘛,其实用 Libfetion 的库也可以直接用飞信发送 sms,只是那样要写的东西就多了...

  3. 2008年9月19日19:35 | #3

    呃,这篇blog让我想起了曾经的一件郁闷的事情……
    当初心血来潮,做了个定时POP3自动读取邮箱新邮件,然后通过当时有个可以每天免费发50条短信的网站,一旦有新邮件,邮件头就发到我手机上。
    刚还是还为自己的主意小高兴了一下……直到那年的除夕,我彻底后悔了,我的手机被一下子拥来的信春祝福邮件给搞得内存撑暴了>_<

  4. 2008年9月19日20:02 | #4

    "你才 F5 呢,你们全家都 F5。"
    这话有气势,哈哈!

  5. 2008年9月19日23:25 | #5

    不错啊
    有一个问题,要是涉及的cookies的有什么好办法?比如需要登录的论坛之类的

  6. 杏林小草
    2008年9月20日00:11 | #6

    很好很强大!
    文博兄果然是高人,学以致用!

  7. Solrex Yang
    2008年9月20日07:58 | #7

    [Comment ID #273880 Will Be Quoted Here]
    涉及 Cookies 的话,wget 有 Cookies 的参数:
    --load-cookies file
    --save-cookies file
    --keep-session-cookies
    相信这几个参数够用了,如果不够好用的话,你也可以用 python 写
    python 有 httplib,也非常好用

  8. 2008年9月20日08:49 | #8

    [Comment ID #273883 Will Be Quoted Here]

    受教了,谢谢啊!

  9. 2008年9月20日11:03 | #9

    "你才 F5 呢,你们全家都 F5。"
    似乎激进了点,而且语气中带有点歧视嫌疑……不过,打破了solrex兄的一向传统风格,堪称强调句中的经典。

  10. 2008年9月20日11:58 | #10

    我倒是把你的xmpp的脚本写成了从 sys.stdin 读的。这样的话,就可以管道了。

    我一般要存档的程序的运行结果,都是

    some_command | gpipe

    这样,就直接扔到gmail 聊天记录里面去了

    文本文件就cat 一下也就进去了 这样, 重要的信息在gmail 里面就有备份 也非常好查找

  11. 2008年9月22日10:39 | #11

    这个相当牛,十分受教。

  12. 2008年9月26日09:17 | #12

    哇 好用 实在太赞啦

  13. passerby
    2008年10月16日01:51 | #13

    既然都要动用python了,那后面用wget的地方用python不也一样吗?

    觉得Windows用户的用户都比他傻,这是典型的linux宗教狂热者的想法。可是你居然连scheme都不知道是何物,也只能算个盲目的狂热者了。

  14. 2008年10月16日08:00 | #14

    [Comment ID #275039 Will Be Quoted Here]
    后面 wget 的地方之所以不用 Python 是有考虑的,因为那个发送 Gtalk 消息的可以作为一个模块单独使用,而且 Python 的 httplib 用起来也不见得比 shell 方便。

    文章中的激进语句完全是噱头而已,看官可以不必在意。至于批评我不懂 Scheme,实在是本人才疏学浅,自觉汗颜 :)

    我很不明白的一个问题是:为什么留言批评我的人,从来就没有一个留下过真实的 email 和网址?难道用一个真实 email 的勇气都没有吗?

  15. passerby
    2008年10月17日22:11 | #15

    一个评论者的名字只是个称呼而已,你可以不必在意。我没网址,电子邮件只做公用,见谅。

  16. 2008年11月7日12:42 | #16

    好东西的说,有点意思。

  17. Yang
    2008年11月15日11:14 | #17

    前一篇博客中说到我买票失败的经历,也充分表达了我想买一张二手座票的意愿。怎么办呢?只好到网上各二手火车票信息平台去找了。心肠不好的人肯定幸灾了祸地在想:“哈哈,这个倒霉的小伙儿该对着浏览器不停地按 F5 了!” 你才 F5 呢,你们全家都 F5。那是典型的 Windows 用户的想法,不要以为 Linux User 跟你一样傻。

    -----------------------

    我觉得也是个盲目的狂热者,windows用户基本都是不懂计算机,是外行人,嘲笑外行人有意思吗?当你被一个物理学家嘲笑的时候你会觉得羞耻嘛?

    在windows用js或者vbs脚本也是可以的,用XMLHttprequest请求网页,然后用DOM分析,分析结果后,可以再发送给QQ,或者干别的事。。也用不着按f5啊~~更用不着在电脑面前蹲点,而且也在后台工作,不会妨碍你玩游戏。只能说那位仁兄只看到了windows就是窗口而已。。

  18. Solrex Yang
    2008年11月15日21:02 | #18

    @Yang
    哈哈,为了避免再有人在这里觉得受到侮辱,请有意见的同学看看这篇文章,好好想想后再来发言。
    另外,以后对这种莫名其妙对号入座并且不留下真实 Email 地址的评论,我就一个操作:删除。

  1. 2008年11月7日13:01 | #1
  2. 2008年12月16日14:01 | #2
  3. 2009年3月26日14:27 | #3
  4. 2009年4月1日17:41 | #4
  5. 2010年7月22日11:55 | #5
说明:点击回复/引用, 会发邮件给该用户, 请慎用; 填写非真实电邮地址, 评论可能会被自动过滤, 无法及时显示, 不要责怪我. 卡内基梅隆大学的 reCAPTCHA 计划使用验证码帮助辨认古老典籍扫描时无法识别的文字,输入验证码的同时,您也为保存人类知识做了一分贡献,谢谢!