`
limu
  • 浏览: 321206 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
其实这篇也可以叫:《那些年,我们一起刷酷讯》。

每年春运买火车票这事儿都能让京飘的同学们愁上个把月,其实每年也没看到谁回不去。04、05想找一张二手票很难,263跳蚤市场,水木,贴吧到处去淘。到了06春节前,事情有了转机,出现了这么个网站kooxoo.com,发迹于水木清华bbs,做的事情就是垂直搜索二手火车票转让信息,这个网站就是如今大名鼎鼎的酷讯。

刷酷讯也不那么容易,往往刷到了二手信息要不电话打不通,要不加价高的离谱。于是,就有了刷票脚本v1.0。从06到11年这小脚本一直升级到了v6.0,而功能其实很简单,开一个网页每隔三五分钟刷下酷讯的页面,和上次的结果做比较,发现新的信息就弹出个提示。这样就不用一直盯着网页看,又能第一时间拿到信息。那些有能量的人,经常会从多个渠道拿到重复的车票,他们并不屑于冒风险赚个几百差价,这就是最理想的交易对象。

这个小脚本见证了酷讯的变化,也记载了一次次爬与被爬之间小小的博弈。今年火车票全面实名制,我想我和酷讯都可以好好歇歇了,回忆这几年写脚本的过程,还是有些技术点蛮有意思的,特别这个小脚本一直使用JavaScript实现,而JS在浏览器端受到了诸多限制,趁着还没全忘,在此记录一下。

不过先说明下这个小脚本的使用者除了我,也就是部门内的一些同事,刷新频率也一直没有改的过于频繁,对酷讯的影响绝不会超过半个QPS,若说我攻击还是省省哈。

【跨域XHR】
脚本的实现方案主要分为两种:跨域XHR和第三方脚本潜入。06、07年,我用的是前面一种。

我首先想到的是用iframe或者frameset把kx的页面潜入到我的页面中,然后我的页面访问kx页面的内容,我们当时的系统中成天这样干。但很快发现这不可能,这是我的前端技术生涯中第一次遇到了跨域问题。现在回顾一下各种跨域解决方案,在酷讯无法控制的情况下,这个问题依然是无解的(或许通过加入信任站点?)。好在当时也没有纠结太久,就转向了另一个方案。

通过XHR获取页面的内容,然后解析文本。大家马上会想到,依然会有域名大山存在,不过幸运的是,在IE6里边,从文件系统直接打开本地html文件,在允许脚本运行后,是可以发送跨域XHR请求并拿到响应体的。基于这个事实,后面的一切就简单的多了,通过XHR获取数据,然后把数据抽取出来结构化,过一段时间再抽取一次,做比较,有新的,弹出alert提示。

【Firefox GreaseMonkey插件 脚本潜入】
到07进入阿里,不再做IEOnly,开始接触兼容性开发。我发现了Firefox非常牛X的插件GreaseMonkey,传说中的“油猴”。GreaseMonkey的作用就是可以指定在某种类型的url中,自动潜入一个本地脚本运行。这相当于在我的浏览器里我可以控制其他域名的网页了。所以在08年,刷票脚本的技术方案改为脚本潜入。相对与前一个方案,这个方案因为可以直接访问对方页面的Dom树,不用解析文本,而且从之前分析prototype.js源码得知Firefox浏览器还支持XPath,XML里类似CSS选择器,一下子获取数据变得容易且稳定许多。

后来油猴成为了我的大玩具,最成功的插件是开心网停车脚本,全自动停车,十分钟换地方,想贴条那是没门。当然还有自动贴条脚本,太伤人品,没有扩散,呵呵。

【GreaseMonkey本地存储和GlobalStorage】
改为脚本潜入也不是一点障碍没有,在跨域XHR方案中,多次获取的页面数据统一在内存中,比较起来非常方便。而改为脚本潜入的模式的V3.0,每次刷新页面,如何保持数据成了一个重要问题,存在cookie中有些丑陋,而且暴露给对方服务器了。好在GreaseMonkey插件提供了本地存储功能,用它记录前一个页面的信息,以备后面比较。我不记得API是什么了,暂且叫他GMStorage吧,和Html5本地存储接口差不多。而在09年的v4.0我就直接使用了本地存储,当时还叫GlobalStorage,而不是LocalStorage。

【GreaseMonkey的安全改进DomWrapper】
GreaseMonkey越来越流行,其潜在的安全问题也是巨大的,随意安装GM脚本,你的所有网页浏览行为,键盘输入都可能被监听记录。
09年V4.0开发时,我发现油猴做了一些改变,油猴脚本里拿到的document,不在是真是的document,很多操作变的没有效果。
这必须Hack一下,我尝试了几种办法,发现在油猴脚本里边使用DomScriptElement方法创建一个script节点,另载入一个外部脚本,另外一个脚本的运行不受任何GM的安全限制
其实我觉得GM的DomWrapper还不如不做,它迫使人们引入另外一个远程脚本,也使得脚本开发者更容易的通过改变另外一个脚本的内容神不知鬼不觉的做些坏事。

【酷讯的变化:从堵到疏】
记得07年阿里第一届网侠大会,酷讯的哥们分享他们如何爬到数据,就神秘的提了一下,借助前端脚本抓取,我在下边听着暗笑~,大家手法是一样一样一样的啊。
随着年复一年的口碑相传,用酷讯淘票的人越来越多。我估计类似我的小脚本的各式各样工具也越来越多。面对这类问题,酷讯明显的经历了一个由堵到疏的过程。
某一年,酷讯在请求时带上了两个参数,记录鼠标点击位置相对搜索按钮左上角的像素差。
某一年,酷讯不再使用顺序的id,每条信息的ID都是一个随机串,这样判断是否有新信息变得麻烦。

但是客户端没有秘密而言,这些小手段都可以被轻易化解,估计效果并不是很好。

再后来酷讯可能也注意到没有太好的办法堵,就改为疏导,改为本身提供这类自刷新功能,有新信息气泡提示,这样方便的控制刷新频率(似乎间隔越来越长),降低服务器的压力。

在10年的V5.0中,脚本只是简单的控制自刷新频率,做更醒目的提示。且更多的利用本地存储,记录以往的搜索信息供比对。

【Bookmarklet 脚本潜入】
我最早发现Bookmarklet应用是CSDN的一个转帖插件,Bookmarklet的核心是构造一个连接,连接内容是javascript:伪协议,把这个链接拖入收藏夹,在任意页面上点击这个连接,都会运行js为协议里包含的脚本内容,脚本内容常常是通过DomScriptElement引入一个远程脚本,这样也达到了脚本潜入的目的。这个技术后来被广泛应用于各种云输入法当中而被大家熟知。
因为Bookmarklet不限制浏览器,酷讯提供了Ajax获取新信息接口(不用刷整个页面),IE8支持了LocalStorage,10年的V5.0版本脚本即支持GM也支持BM,刷票脚本再次回归IE怀抱。不过BM需要每次点一下,这个还是比GM要麻烦一点点。


【其他网站的分流】
11年的V6.0是脚本效果最差的一年,因为酷讯的效果感觉不那么即时了,58这类的网站分流了酷讯的客流。今年大家都不用做这一块了,不过真心希望业界丰富建站经验的高手们,能够承担12306.cn的建设工作,这个站的体验和稳定性太次了,其实俺觉得包给淘宝做就挺好,呵。

前面就是这几年写刷票脚本的流水账,不用再做了,大家都释然吧。
特别感谢酷讯,多年来行善举造福大家。
祝新老朋友今年顺利拿到平价车票,开开心心过大年。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics