12306 余票查询API浅探索

  • 余票查询请求分析
  • 响应数据解密代码查找调试
  • 数据说明

余票查询请求分析


点击查询,F12进入控制台,进入NetWork面板,查看发送的请求:

点入请求查看详情,很明显,查询请求是第二条:

查看请求Response:

的确拿到了数据,不过好像有什么不对:

数据好像做了什么处理,看不懂哦。想来应该是用JS解密的,OK,JS调试走起。

响应数据解密代码查找调试

回到NetWork面板,鼠标移到请求URL上,查看请求发起程序:

点进去,直接定位到调用程序,设置断点:

重新点击查询,开始逐步调试,调试过程要注意跟踪变量,最终会来到这一段程序:

很显然,function cr(cQ, cS)就是执行将响应数据进行解密的程序,其中cQ,cS参数分别是:
对应加密数据集合:

始发车站和终点车站字典:

程序源代码如下:

    function cr(cQ, cS) {var cP = [];for (var cO = 0; cO < cQ.length; cO++) {var cT = [];var cN = cQ[cO].split("|");cT.secretStr = cN[0];cT.buttonTextInfo = cN[1];var cR = [];cR.train_no = cN[2];cR.station_train_code = cN[3];cR.start_station_telecode = cN[4];cR.end_station_telecode = cN[5];cR.from_station_telecode = cN[6];cR.to_station_telecode = cN[7];cR.start_time = cN[8];cR.arrive_time = cN[9];cR.lishi = cN[10];cR.canWebBuy = cN[11];cR.yp_info = cN[12];cR.start_train_date = cN[13];cR.train_seat_feature = cN[14];cR.location_code = cN[15];cR.from_station_no = cN[16];cR.to_station_no = cN[17];cR.is_support_card = cN[18];cR.controlled_train_flag = cN[19];cR.gg_num = cN[20] ? cN[20] : "--";cR.gr_num = cN[21] ? cN[21] : "--";cR.qt_num = cN[22] ? cN[22] : "--";cR.rw_num = cN[23] ? cN[23] : "--";cR.rz_num = cN[24] ? cN[24] : "--";cR.tz_num = cN[25] ? cN[25] : "--";cR.wz_num = cN[26] ? cN[26] : "--";cR.yb_num = cN[27] ? cN[27] : "--";cR.yw_num = cN[28] ? cN[28] : "--";cR.yz_num = cN[29] ? cN[29] : "--";cR.ze_num = cN[30] ? cN[30] : "--";cR.zy_num = cN[31] ? cN[31] : "--";cR.swz_num = cN[32] ? cN[32] : "--";cR.srrb_num = cN[33] ? cN[33] : "--";cR.yp_ex = cN[34];cR.seat_types = cN[35];cR.exchange_train_flag = cN[36];cR.houbu_train_flag = cN[37];cR.houbu_seat_limit = cN[38];cR.from_station_name = cS[cN[6]];cR.to_station_name = cS[cN[7]];cT.queryLeftNewDTO = cR;cP.push(cT)}return cP}

这段代码将用"|"连接的字符串数据进行分割,然后提取出段数据按照规则拼成新的JSON格式的数据,只是代码经过编译,不太好读。

数据说明

经过解密的数据最终是这个样子的:

{"buttonTextInfo": "预订","queryLeftNewDTO": {"arrive_time": "22:28","canWebBuy": "Y","controlled_train_flag": "0","end_station_telecode": "BXP","exchange_train_flag": "1","from_station_name": "广州南","from_station_no": "01","from_station_telecode": "IZQ","gg_num": "--","gr_num": "--","houbu_seat_limit": "","houbu_train_flag": "0","is_support_card": "1","lishi": "09:38","location_code": "Q7","qt_num": "--","rw_num": "--","rz_num": "--","seat_types": "OM9","srrb_num": "--","start_station_telecode": "IZQ","start_time": "12:50","start_train_date": "20191222","station_train_code": "G70","swz_num": "3","to_station_name": "北京西","to_station_no": "16","to_station_telecode": "BXP","train_no": "6c00000G700E","train_seat_feature": "3","tz_num": "--","wz_num": "--","yb_num": "--","yp_ex": "O0M090","yp_info": "GUrhKYs66fa4Qkmv0jeRFrWl6He53Xjen59rMW556V4Bo2s7","yw_num": "--","yz_num": "--","ze_num": "有","zy_num": "10"},"secretStr": "wQABjQbR9E%2Fn6hMLNSUP6p6v6djwCvahYS2xqJZ7ZB5mKfmzHhzudmjZD9TZm66N%2FpURPPvcFZS1%0A%2FO6bVpeIcPuevb3Xsf4x%2FJTLu6CUi4SonvPoO7TUT8ip85ZmS1mELs3nIIka%2Fx4wp%2FyNIcw%2FFj1F%0Ae2VPTbVjzxUl2i%2B5QffvnWvjjTVe39PXgJGzZVJzMU8tzTdzTkhr5ZFG%2BxfQ9X3PeEyPVE79hk46%0Amesr%2FmsV6M8AiH%2FTKPtxIYUiV9K7DwUlTPZP%2F%2FnV8TKjO7wiS0QQ95NQv9XyKqcw58OJ7UnAn0iH%0A"
}

这里面大多字段都是代码以及缩写,不过还是可以判断出一些有用字段:

{"buttonTextInfo": "预订",    => 按钮文字"queryLeftNewDTO": {         => 主要数据结构   "arrive_time": "22:28",  => 列车到达时间"canWebBuy": "Y",        => 是否支持网上购票"controlled_train_flag": "0",  => "end_station_telecode": "BXP", =>"exchange_train_flag": "1",    =>"from_station_name": "广州南", => 列车始发站"from_station_no": "01",      "from_station_telecode": "IZQ","gg_num": "--",   "gr_num": "--",  "houbu_seat_limit": "", => 候补车票余量"houbu_train_flag": "0", => 是否支持候补"is_support_card": "1", "lishi": "09:38",   => 历时(列车运行时间)"location_code": "Q7","qt_num": "--","rw_num": "--","rz_num": "--","seat_types": "OM9","srrb_num": "--","start_station_telecode": "IZQ","start_time": "12:50", => 发车时间"start_train_date": "20191222", => 发车日期"station_train_code": "G70", => 列车编号"swz_num": "3","to_station_name": "北京西", => 终点站"to_station_no": "16","to_station_telecode": "BXP","train_no": "6c00000G700E", => 列车识别号"train_seat_feature": "3","tz_num": "--","wz_num": "--","yb_num": "--","yp_ex": "O0M090","yp_info": "GUrhKYs66fa4Qkmv0jeRFrWl6He53Xjen59rMW556V4Bo2s7","yw_num": "--", => 硬卧"yz_num": "--", => 硬座"ze_num": "有", "zy_num": "10" },"secretStr": => 加密字符串  "wQABjQbR9E%2Fn6hMLNSUP6p6v6djwCvahYS2xqJZ7ZB5mKfmzHhzudmjZD9TZm66N%2FpURPPvcFZS1%0A%2FO6bVpeIcPuevb3Xsf4x%2FJTLu6CUi4SonvPoO7TUT8ip85ZmS1mELs3nIIka%2Fx4wp%2FyNIcw%2FFj1F%0Ae2VPTbVjzxUl2i%2B5QffvnWvjjTVe39PXgJGzZVJzMU8tzTdzTkhr5ZFG%2BxfQ9X3PeEyPVE79hk46%0Amesr%2FmsV6M8AiH%2FTKPtxIYUiV9K7DwUlTPZP%2F%2FnV8TKjO7wiS0QQ95NQv9XyKqcw58OJ7UnAn0iH%0A"
}

其他字段,大家可以自己对比界面进行推测,最后的secretStr加密字符串目前不知道是什么,不过感觉像是查询列车详情需要的密匙。不过,拥有这些信息已经足够用Python写一个自己的余票查询小程序了。有没有什么想法. . . . . .

12306 余票查询API浅探索相关推荐

  1. 列车车次查询-余票查询-Api接口

    查接口找到的,分享给大家,希望对大家以后开发有用 火车车次查询-余票查询--Api接口 1.来自12306的火车车次数据 使用12306网站的接口,查询余票.此接口采集自这里.全国火车站代号字典,下载 ...

  2. 返乡之路不容易之12306余票查询并给出备选方案v2

    在第一版的返乡之路不容易之12306余票查询并给出备选方案中,给出了余票查询和备选方案推荐,但当时有两个问题: 没有备选排名:虽然给出了备选,但哪个备选好没有给出排序 没有座位信息(商务/一等/二等/ ...

  3. 火车票查询系统(一)——利用python实现监控12306余票查询

    最近春运高峰,本人从12月开始买过年回家的火车票,然鹅~现实总是那么残酷,放票时间记不住,要么就是不能实时盯着刷票,外面的软件也不知道靠不靠谱,反正是没买到票,所以一怒之下,自己做一个12306余票查 ...

  4. 最新Python实现12306余票查询系统

    首先感谢这篇博客的引导,但是这篇文章已经比较旧了,12306进行了改版,源码编排方式有了变化.12306源码获取的方法可以从这篇博客中学习,我在这里主要贴出对于目前最新的12306的Python余票查 ...

  5. Python之12306余票查询

    简单的Python学习,用Python完成一个12306余票查询- Python之12306余票查询 参考资料来自Python 实现火车票查询工具 需要用到的第三方库 requests,使用 Pyth ...

  6. 12306——(一)火车余票查询API

    简介 年关将近,看到此图未免一声长叹,惆怅不已.API中国将深挖可怕的12306网站,公布尽可能多的接口,希望某当世才俊能开发出一款能造福我朝的购票助手软件,定受无量加持-- 扯远了,扯回来. 使用1 ...

  7. 12306火车余票查询API

    简介 年关将近,看到此图未免一声长叹,惆怅不已.API中国将深挖可怕的12306网站,公布尽可能多的接口,希望某当世才俊能开发出一款能造福我朝的购票助手软件,定受无量加持-- 扯远了,扯回来. 使用1 ...

  8. 火车余票查询API 一

    简介 年关将近,看到此图未免一声长叹,惆怅不已.API中国将深挖可怕的12306网站,公布尽可能多的接口,希望某当世才俊能开发出一款能造福我朝的购票助手软件,定受无量加持-- 扯远了,扯回来. 使用1 ...

  9. 火车车次查询-余票查询--Api接口

    1.来自12306的火车车次数据 使用12306网站的接口,查询余票.此接口采集自这里.全国火车站代号字典,下载 . 如有转载,请标明来自此出处http://blog.csdn.net/qxs9652 ...

最新文章

  1. 清华硕士眼中的2021届算法岗秋招
  2. 基于OpenCV的直方图匹配
  3. RewriteCond和13个mod_rewrite应用举例Apache伪静态
  4. python了解一下_想要精通python?19个语法了解一下!
  5. 对asn.net三层架构的初步认识
  6. 年轻人买菜只愿意走670米,每日优鲜、叮咚买菜等生鲜电商们依然“难送达”
  7. Swift Playgrounds Learn to Code 2 final project Pyramid
  8. SQL解析之硬解析和软解析
  9. java 拉丁文 unicode_“java语言使用的是Unicode编码”是指的jvm?.java文件?
  10. 【bzoj3576】 Hnoi2014—江南乐
  11. 罗永浩最期待的游戏要来了 《Party Animals》10月上线
  12. ubuntu good 便签
  13. 【多目标优化求解】基于matlab自适应风驱动算法求解多目标优化问题【含Matlab源码 1414期】
  14. 计算机等级考试中0是升序,2017年03月计算机等级VisualFoxPro考试试题
  15. 什么是嵌入式开发?嵌入式是什么?初学者必看。
  16. Java学习之AWT绘图“奥运五环”
  17. mcs51单片机嵌入式c语言习题,MCS-51单片机复习题参考题库.doc
  18. 各品牌网络监控摄像头RTSP地址查询
  19. docker部署excalidraw画图工具
  20. 基于51单片机的电流电压过流过压监测声光报警器proteus仿真原理图PCB

热门文章

  1. 〖产品思维训练白宝书 - 核心竞争力篇⑨〗- 产品经理核心竞争力解读之产品经理的规划能力对普通人的启发
  2. Ubuntu 设置双网卡,实现内外网同时可用
  3. java重定向页面_java的页面重定向问题
  4. 解决nginx启动报错nginx: [emerg] open() “/var/run/nginx/nginx.pid“ failed (2: No such file or directory)
  5. 姚劲波 58同城创始人
  6. 性能测试的需求分析,性能测试的必要性
  7. 学习MySQL必须了解的13个关键字,你get了吗?
  8. MPI数据通信常用函数
  9. 译文:身未动,心已知
  10. 树莓派打造成全能路由器