用 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 命令行工具自动追踪车票信息》上有29条评论

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

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

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

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

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

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

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

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

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

    some_command | gpipe

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

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

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

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

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

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

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

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

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

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

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

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

  12. 现在的火车票已经是实名制了,所以二手票的情况没有了,也就是说不会有转让的方式了,火车网也关闭了这个。

      1. 验证码?? 日了,这玩意儿关键时刻还是真烦人呀 那能不能找个别的贴近生活的例子呢? 比如携程网的飞机票 我记得它们的网站好像没有验证码。再说——如何看一个网站是否提供查询接口呢?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注