zoukankan      html  css  js  c++  java
  • 2014新版12306接口分析

    源地址:http://www.xuebuyuan.com/2054032.html

    文章只做技术研究 如果通过此技术违反国家法律,一切后果自负,作者不承担任何责任。

    好吧,先来唠叨,唠叨。这几天大家都沉浸在抢票中,当然我也不例外。

    最后总结一句,有抢票软件不一定能抢到票,没抢票软件一定是抢不到票,网页一点就死了。

    往年,还能弄个小工具抢抢,今年12306换了件新衣服,更加跑不动了,最后独留下孤单在心里。

    好吧 ,进入正题:玩转新版12306抢票

    订火车票无非是如下几个流程:

    登录 - 查询 - 点预定按钮 - 提交订票用户 - 确认订单 或者是 自动所谓的自动刷票 登录 - 查询 - 输入验证码提交

    下面一起分析分析这两套流程:

    首先准备抓包工具

    登录拆分为:

    https://kyfw.12306.cn/otn/ 抓cookie

    https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand 获取验证码

    https://kyfw.12306.cn/otn/passcodeNew/checkRandCodeAnsyn 预验证验证码

    https://kyfw.12306.cn/otn/login/loginAysnSuggest 登录

    https://kyfw.12306.cn/otn/login/userLogin 正式登录(没有这个请求是无法登录的)

    订票流程

    查票 https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2014-01-04&leftTicketDTO.from_station=SZQ&leftTicketDTO.to_station=BHQ&purpose_codes=ADULT

    注意这个请求的cookie 这个cookie会伴随抢票流程的始终。有时候有些人会返回-10等等一些奇怪的错误,我这里想说 get请求参数是可以验证先后顺序的,注意顺序就好了。

    点击预定按钮

    https://kyfw.12306.cn/otn/confirmPassenger/initDc 这个请求主要是获取订单提交时候的2个令牌值(REPEAT_SUBMIT_TOKEN,key_check_isChange)

    获取提交订单验证码

    https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=passenger&rand=randp&0.4528230968713445

    预验证验证码

    https://kyfw.12306.cn/otn/passcodeNew/checkRandCodeAnsyn

    检查订单

    https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo

    有人会想问 oldPassengerStr和passengerTicketStr是什么,这里给一段代码把

    [java] view
    plaincopy在CODE上查看代码片派生到我的代码片


    /**
    * 获取OldPassengerStr
    *
    * @param userInfo
    * @return
    */
    public static String getOldPassengerStr(List<UserInfo> userInfo) {
    String oldStrs = "";
    for (int i = 0; i < userInfo.size(); i++) {
    String oldStr = userInfo.get(i).getName() + "," + userInfo.get(i).getCardType() + "," + userInfo.get(i).getCardID() + "," + userInfo.get(i).getType();
    oldStrs += oldStr + "_";
    }
    return oldStrs;
    }

    /**
    * 获取PassengerTicketStr
    *
    * @param userInfo
    * @return
    */
    public static String getPassengerTicketStr(List<UserInfo> userInfo) {
    String oldStrs = "";
    for (int i = 0; i < userInfo.size(); i++) {
    String oldStr = "";
    if ("WZ" == userInfo.get(i).getSeatType()) {
    } else {
    oldStr = userInfo.get(i).getSeatType();
    }
    String bR = oldStr + ",0," + userInfo.get(i).getTickType() + "," + userInfo.get(i).getName() + "," + userInfo.get(i).getCardType() + "," + userInfo.get(i).getCardID() + ","
    + (userInfo.get(i).getPhone() == null ? "" : userInfo.get(i).getPhone()) + ",N";
    oldStrs += bR + "_";
    }
    return oldStrs.substring(0, oldStrs.length() - 1);
    }

    其实把 这两个参数怎么拼接的 可以在js里面找到答案。

    获取时时余票

    https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount

    确认订单

    https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue

    其实 说到这个应该也就快完了 剩下的刷票流程短一点,大家可以自己抓包分析。曾经这里出现过无须验证码提交订票信息的漏洞,最近这两天好像修复好了。

    其实吧,技术只是一方面,重要的是理解流程。

  • 相关阅读:
    项目开发基础概念
    django 对接elasticsearch实现全文检索
    win10安装docker
    Mac VMware Fusion 中修改 centos7 虚拟机的磁盘空间、扩容
    CentOS 7下 YUM 本地仓库的搭建
    mac与虚拟机传输文件
    mac和windows快速锁定电脑
    rpm -qa详解
    虚拟机安装centos6
    mac与iPhone互传文件
  • 原文地址:https://www.cnblogs.com/lanye/p/5363451.html
Copyright © 2011-2022 走看看