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

目录 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 上的留言,永远保持自己沙发的地位,说不定人家就感受到了你的关心,然后...具体方法我就不教了哈...

长按识别二维码关注《边际效应》
长按识别二维码关注《边际效应》

29 条评论

  • zeaster
    2008-09-19

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

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

  • Solrex Yang
    2008-09-19

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

  • Iron_Feet
    2008-09-19

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

  • Rei
    2008-09-19

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

  • Duo
    2008-09-19

    我觉得还是继续教一下吧,下一步最难了

  • Chunhao
    2008-09-19

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

  • 杏林小草
    2008-09-20

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

  • Solrex Yang
    2008-09-20

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

  • Chunhao
    2008-09-20

    [Comment ID #273883 Will Be Quoted Here]

    受教了,谢谢啊!

  • shuge.lee
    2008-09-20

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

  • You Xu
    2008-09-20

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

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

    some_command | gpipe

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

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

  • prince
    2008-09-22

    这个相当牛,十分受教。

  • 颜小诗
    2008-09-26

    哇 好用 实在太赞啦

  • passerby
    2008-10-16

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

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

  • Solrex Yang
    2008-10-16

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

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

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

  • passerby
    2008-10-17

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

  • 麦田符号
    2008-11-07

    好东西的说,有点意思。

  • 麦田符号 » Blog Archive » XMPP有点启发
    2008-11-07

    [...] 事实上,不要说对于不是学计算机的人来说,就算是我们所谓的学计算机的,一些基本的应用也只是拿过来用,一般情况下都不会去想哪怕稍微再深一点的背景。比如今天,在看Solrex的一篇关于linux命令行的工具的文章来实现车票更新自动查找的功能,有一个扩展的只是XMPP,因为最近经常在眼前闪过这个词,今天就扩展性的google了一下,简单的说,就是一个针对即时通讯领域,比如QQ,MSN,网易泡泡之类的通讯工具的一个通用标准。为什么要有这个标准,不是QQ用得好好的么? [...]

  • Yang
    2008-11-15

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

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

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

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

  • Lee’s Weblog » Blog Archive » FUCK Banks of China
    2008-12-16

    [...] 心肠不好的人肯定幸灾了祸地在想:“哈哈,这个倒霉的小伙儿该对着文本

  • Life is different » use python to track friends’ status on xiaonei
    2009-03-26

    [...] Although I am not very interested in xiaonei.com. I just want to write a program to know the status of my friends and classmates. Through this program, you can receive the status infomation of your friends in gtalk. The post_status section (to login to a gtalk account and send a message using xmpp) of the code is referred from solrex.(the exact post is here) [...]

  • Mashup不能更疯狂一些吗? | 林健的BLOG
    2009-04-01

    [...] Mashup不能更疯狂一些吗? 2009/04/01 | 17:41 | 分类:Web与移动平台 | 标签:googleIMmashuptwitter网络 | 1次阅读   我不知道用mashup这个词是否合适,也许有歧义吧。我这里指的是将已有的网络或本地应用无缝地整合(不编程或只写很少的程序),来实现一些有趣的应用。   先说几个简单的例子:我们可以用Gmail的POP3接收+过滤器+139邮箱的短信通知,实现对任意POP3邮箱来信的短信通知;使用Linux shell脚本+libfetion/Google日历/python-xmpp实现对选课人数或火车票信息的实时追踪;使用freetalk+schema脚本+X10协议实现用IM控制电器;还有基于twitter+GroupTweet+IM机器人的跨协议IM群聊等等。   mashup的实现模式大致可以用下图说明。对于普通用户,Gmail、Google日历、twitter等通用网络工具常常充当了邮件、IM和短信之间的网关,帮助用户实现简单的信息整合。从这里也可以看出,twitter之所以成功,很重要的一个原因是它开放了简单通用的API,允许第三方充分发挥想像来mashup它,同时鼓励第三方开放接口给“第四方”mashup。对于有开发能力的用户,运行于服务器端的脚本可以最大程度地满足各式各样的mashup需求,特别是Google App Engine等服务的推出,大大降低了提供小规模公众web服务的成本。再geek一点的朋友,有可能加入一些外设,利用网络控制或监控计算机以外的实体。但编程这件事在提升应用价值的同时,减少了mashup本身的乐趣。在简单的mashup与编程的mashup之间折衷的,就是把mashup作为一种专门的服务。例如Yahoo Pipes,它以RSS为主要的接口,允许用户使用图形化的编程方式组合各类网络资源,加以计算、过滤,最终生成用户所需的RSS输出。这类服务权衡了mashup的技术门槛与灵活性,可能是将来web应用发展的一个方向。   以前觉得很cool的一些mashup应用,现在看上去也有点太保守、太沉稳了,我好久没有见到什么新奇的创意了。我在想,有什么创意可以基于现有的架构但突破现有的框框?就像AJAX/web 2.0那样,开拓一片不算新也不算旧的小领域。大家也想想吧! 相关文章闲扯Gtalk我与IE的二三事选择一个独具特色的域名——中国特色的Domain hack我也发明个概念——abandonweb杞人忧天也罢–写在我的Windows Live ID启用三周年 [...]

  • Simple GTalk Bot — 无限零一 | 李蠡
    2010-07-22

    [...] 《用 Linux 命令行工具自动追踪车票信息》 , 杨文博 [...]

  • 一疒亻
    2013-01-05

    现在这个方法还好用吗?可不可以针对现在的订票网调整一下文章?

  • 一疒亻
    2013-01-05

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

  • 一疒亻
    2013-01-05

    比如说针对“http://www.12306.cn/mormhweb/kyfw/ypcx/” 这个地址中的余票查询链接进行一个类似本文的脚本处理,例如查询北京到南京的火车票。期待你的文章更新。

    • Solrex Yang
      2013-01-05

      不行,输验证码那块过不了。

      • 一疒亻
        2013-01-06

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

发表评论

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