又是一年一度的春运抢票季,不管你是北上、南下或者东进,在外漂泊了一年,有钱没钱总是要回家过年的。

【图片来源于网络】

吐槽:12306抢票的悲伤

据说12306改版了,新版本里面除了UI这些面儿上的改动,还加入了自动刷票、自动提交订单等实用的功能,并且推出了手机购票软件,当真是下了一番真功夫!这里对12306订票系统的工程师们表示感谢!

但是,等你真的去订票的时候,你遇到的错误可能是这样的:

也可能是这样的:

或者是这样的:

运气好点的能见到购票失败的提示:

这里真心的恭喜那些抢票成功的同学们!恭喜发财!红包拿来!

吐槽:奇葩的验证码校验

先听我讲一下今天抢票的亲身经历:打开12306购票页面,满心欢喜的登陆(我对自己的网速还是有信心的,迅雷下载2MB以上,平常看视频都只看高清),结果今天在登陆的时候就出了岔子,先是验证码没有显示,等到验证码显示出来以后我赶紧去输入,输完四个字符以后就卡死了,真的是卡死了……

直觉告诉我,12306的验证码校验肯定是同步请求,于是打开开发者工具,想来一窥究竟。

真正的调用在这里:

首先看一下common.js,点看以后发现是压缩过的,从注释上面可以看到里面包含了jquery 1.9、Sizzle CSS Selector Engine(这个没有用过)、jqPagination、jQuery Form Plugin、jQuery Validation Plugin 1.11.1以及一些ajax的封装,而真正执行请求的地方是在login.js里面。

我把login.js下载了下来,然后格式化了输出,找到了checkRandCode的定义:

checkRandCode: function() {
var d;
var c = $("#randCode").val();
$.ajax({
url: ctx + "passcodeNew/checkRandCodeAnsyn",
type: "post",
data: {
randCode: c,
rand: "sjrand"
},
async: false,
success: function(e) {
if (e.data == "N") {
d = false;
$("#i-ok").css("display", "none")
} else {
d = true;
$("#i-ok").css("display", "block")
}
}
});
return d
}

看到了吧,async:false,果然是走的同步请求,在12306超负载的时候,这个请求会一直挂起,于是就出现了浏览器卡死、浏览器崩溃等问题,这个跟浏览器真没关系。

怎么破?一行代码搞定:

jQuery.extend({ checkRandCode: function () { return true; } });

把这句代码放在console里面执行:

直接覆盖12306的checkRandCode方法,不去服务器走一遭,马上返回true。

如果你觉得同步请求还能够忍受,那么看看下面的经历:我一个不小心我输错了字母,验证码校验告诉我错误了,我也知道看到了错误的地方,然后我去挪动光标,奇葩的事情再次发生,它居然又执行了上面那个同步的验证!!!感情12306监听的是键盘事件啊(后来看代码发现是keyup):

$("#randCode").on("keyup", function (c) {
c = c || window.event;
$("#error_msg").hide();
if ($("#randCode").val() != "" && $("#randCode").val().length == 4) {
if (!$.checkRandCode()) {
$("#error_msg").html(login_messages.randCodeError).attr("class", "error").css("margin-left", "70px");
$("#error_msg").show();
return false
} else {
$("#i-ok").css("display", "block");
if (c.keyCode == 13) {
$("#loginSub").click()
}
}
} else {
$("#i-ok").css("display", "none")
}
b = $("#randCode").val()
})

看到了吧,人家是监听的keyup,只要里面够四位,你放开键盘就去验证,放开键盘就去验证……网速好不好咱先不说,每次都去服务器同步走一遭就够你受的……

这个怎么破呢?其实只要把验证的破了以后,这个自然就没有什么影响了。如果你执意要破,那我也给你一句代码:

$("#randCode").unbind("keyup")

这句话稍微有点jquery功底的人就能看懂,直接移除keyup事件,不去监听就一了百了了。

当然,移除了keyup事件以后,你再去按enter键是不能够登陆的,需要你去点击登陆按钮,这是一个副作用。

给12306的几点建议

只是一个简单的登陆页面,就已经让我忍不住开始吐槽了(这可能是因为我今天没有买到车票吧)。下面是给12306开发人员的几个建议:

第一,不要去服务器校验验证码,不管是异步还是同步

第二,如果非要去校验,请不要使用keyup事件去验证,可以使用onchange来代替

第三,如果非要去检验,请将用户名和密码一并传给服务器,数据量不会大多少,但是请求数量最少能够减少一倍,还减去了点击登陆按钮的麻烦

使用12306抢票攻略

去年抢票的时候有一个抢票的插件,很方便我们程序员购票,今年不一样了,12306集成了,虽然依然很方便,但是很多细节却不如去年。那么怎样才能保证买到回家的车票呢?

第一步,模拟购票流程。为了今天的购票,我做了充足的准备:前一天下午走了一遍购票流程,一直到付款环节(拿着票源充足的临客测试)。

第二步,提前登陆。最起码要在抢票开始前十分钟登陆的到系统,然后设置好自己要订的车次、乘车人和席别。如果你信得过自动提交订单功能,就让系统一直刷着,有票了只需要输入一个验证码就可以了。

第三步,多开浏览器,使用不同的浏览器登陆抢票。我的机器上面本身已经装了IE、chrome和firefox,买票前将三个都打开,分别登陆,即使你只有一个账号也可以同时在三个浏览器里面登陆。

第四步,使用插件。虽然今年插件不像去年那样火热,但是想猎豹浏览器还是除了抢票专版,今天下午我已经测试了一下,可以买到票。不知道明天早上还可不可以(12306有夜里发布系统的习惯)。

第五步,使用手机客户端。12306官方有一个购票的客户端,虽然已到抢票的时候就卡的要死,老提示网络异常,但也算是一种途径吧。

最后,祝所有朋友都能顺利的买到回家的车票……

欢迎分享购票经验……

抢到票的朋友快来分享你们的购票经验吧,帮助更多的人买到回家的车票。

抢票季:吐槽12306 & 分享抢票经验的更多相关文章

  1. 归心似箭,IT达人分享抢票攻略

    [51CTO专稿]随着春节一天天临近,“购票难”的问题也愈发凸显,猎豹.火狐.360等“春运抢票神器”占领了各大网站的重要版面,“技术抢票”成为炙手可热的话题,看看身为程序员的邓以克是如何抢到回家的票 ...

  2. 12306订票助手.net版如何抢指定过路某一地点的火车票

    12306订票助手.net版如何抢指定路过某一地点的火车票? 直接举例: 广州到武汉,很多高铁,经过清远,衡阳,郴州,长沙等地.需要从清远上车.操作步骤如下: 1.先查询清远-武汉,打开右下角的自动预 ...

  3. 实际例子描述和分析“猎豹抢票跨站推荐功能有票刷不到”的疑似bug

    前言 快过年了,又到了一年抢票时.今年douba和douma计划要带着doudou回姥姥家.昨天在家用抢票软件居然发现了一个bug,那就是在猎豹抢票中跨站推荐的车票几天里一直是没有,但是在12306手 ...

  4. python之12306自动查票

      一.导读 本篇文章所采用的技术仅用于学习.研究,任何其他用途请自行承担后果. 12306自动查票使用到的python库主要是splinter,同时也涉及到查票的城市编码,具体的城市编码请在网络上搜 ...

  5. Python实现12306自动查票程序

    这是在网上扒拉过来的,原文链接: http://blog.csdn.net/An_Feng_z/article/details/78631290 目前时间2018/01/04 文中各种接口均为可用,亲 ...

  6. 利用Python实现12306爬虫--查票

    在上一篇文章(http://www.cnblogs.com/fangtaoa/p/8321449.html)中,我们实现了12306爬虫的登录功能,接下来,我们就来实现查票的功能. 其实实现查票的功能 ...

  7. 【java下午茶】12306的双人票

    明天下午就要和客户谈需求了,今天还在列车上假象着明天的情景,由于这是一个旅游的项目,所以想尽可能设计得人性化一些. 不过有件很不爽的事情就是和老公的位子是分开的,虽然我们订的是连坐号.就这个问题也是我 ...

  8. java抓取12306火车余票信息

    最近在弄一个微信的公众帐号,涉及到火车票查询,之前用的网上找到的一个接口,但只能查到火车时刻表,12306又没有提供专门的查票的接口.今天突然想起自己直接去12306上查询,抓取查询返回的数据包,这样 ...

  9. 12306火车票余票查询&Python实现邮件发送

    查询余票接口 打开12306官网,并进入余票查询页面,同时开启chrome浏览器F12控制台,以北京到上海为例,搜索2018年10月1日的余票信息,点击搜索按钮,可以在控制台发送了一条GET请求,请求 ...

随机推荐

  1. Angular 快速学习笔记(1) -- 官方示例要点

    创建组件 ng generate component heroes {{ hero.name }} {{}}语法绑定数据 管道pipe 格式化数据 <h2>{{ hero.name | u ...

  2. 【LOJ】#2492. 「BJOI2018」二进制

    题解 每次开这样的数据结构题感想都大概是如下两点 1.为什么别人代码长度都是我的1/2???? 2.为什么我运行时间都是他们的两倍???? 简单分析一下,我们关注一个区间是否合法只关注这个区间有多少个 ...

  3. InnoDB的锁机制浅析(一)—基本概念/兼容矩阵

    InnoDB锁的基本概念 文章总共分为五个部分: InnoDB的锁机制浅析(一)-基本概念/兼容矩阵 InnoDB的锁机制浅析(二)-探索InnoDB中的锁(Record锁/Gap锁/Next-key ...

  4. Java Object part1

    java中Object是所有类的父类,这句话就不多做解释.但是Object中到底有哪些我们常用的方法呢? 1. public native int hashCode();     这个方法是一个nat ...

  5. Typecho-Material主题不支持Kotlin代码高亮的解决方案

    Typecho-Material主题不支持Kotlin代码高亮的解决方案 Overview 最近通过Typecho搭建了一个Blog,采用了 Material主题,其他的都挺好,也挺喜欢这个主题,但是 ...

  6. JDBC之 大数据内容的传输

    JDBC之 大数据内容的传输 什么是大数据内容? 在数据库中,有一条一条的记录,记录中很多字段都是几个字符就够的,假如现在要把一部小说存入数据库,这本小说当然不是几个字符组成,而是由几万字组成,这本小 ...

  7. hdu 3534 树形dp ***

    题意:统计一棵带权树上两点之间的最长距离以及最长距离的数目 链接:点我 首先统计出结点到叶子结点的最长距离和次长距离. 然后找寻经过这个点的,在这个为根结点的子树中的最长路径个数目. #include ...

  8. 吴恩达-coursera-机器学习-week9

    十五.异常检测(Anomaly Detection) 15.1 问题的动机 15.2 高斯分布 15.3 算法 15.4 开发和评价一个异常检测系统 15.5 异常检测与监督学习对比 15.6 选择特 ...

  9. 【转载】VC IME 通信

    文本输入框作为一个最基本的UI控件,被众多UI框架默认支持.Windows下最简单的就是CEdit(WTL封装),也有更为复杂的CRichEdit(WTL封装).文本输入框是基本控件中最难实现的控件之 ...

  10. Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem C. Cargo Transportation 暴力

    Problem C. Cargo Transportation 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed ...