玩转12306之查询、订票
书接上回,今天我将把查询和订票的整个过程详细的介绍给大家。
一、查询余票信息
首先,我们抓下查询余票的http请求(以下图的查询为例子)
完整的http请求如下:
https://dynamic.12306.cn/otsweb/order/querySingleAction.do?method=queryLeftTicket&orderRequest.train_date=2013-10-11&orderRequest.from_station_telecode=BJP&orderRequest.to_station_telecode=WHN&orderRequest.train_no=&trainPassType=QB&trainClass=QB%23D%23Z%23T%23K%23QT%23&includeStudent=00&seatTypeAndNum=&orderRequest.start_time_str=00%3A00--24%3A00
请求的参数:
method:queryLeftTicket
orderRequest.train_date:2013-10-11
orderRequest.from_station_telecode:BJP
orderRequest.to_station_telecode:WHN
orderRequest.train_no:
trainPassType:QB
trainClass:QB#D#Z#T#K#QT#
includeStudent:00
seatTypeAndNum:
orderRequest.start_time_str:00:00--24:00
我们看到method这个参数,从字面的意思看出来了,是查询余票的。接着orderRequest.train_date表示乘车日期,orderRequest.from_station_telecode表示出发地的简码,orderRequest.to_station_telecode表示目的地的简码,orderRequest.train_no车次编码,trainPassType表示车的路过的类型,分别是全部:QB,始发:SF,路过:LG,trainClass表示车的类型,分别是:全部:QB,D车:D,Z字头:Z,T字头:T,K字头:K,其他:QT,如果多选中间以#连接。includeStudent表示是否是包含学生票,包含为0X00,不包含为00,seatTypeAndNum席别和数量,在这一步暂时没什么用。orderRequest.start_time_str表示出发时间。
接着看这个请求响应的结果(结果太长了,就拿一条记录来分析)
0,<span id='id_330000K5980K' class='base_txtdiv' onmouseover=javascript:onStopHover('330000K5980K#BXP#WCN') onmouseout='onStopOut()'>K599</span>, 北京西 <br> 05:20, 武昌 <br> 20:37,15:17,--,--,--,--,--,9,4,--,8,<font color='#008800'>有</font>,--,<a name='btn130_2' class='btn130_2' style='text-decoration:none;' onclick=javascript:getSelected('K599#15:17#05:20#330000K5980K#BXP#WCN#20:37#北京西#武昌#08#27#1*****30364*****00091*****00083*****0004#MUFFMDhDQTNCNEMzQjMwMTU4Qzg5NjdDODMxREI2MkNFODFDMThEREM3MzM0NDA5NEY0RTUzMTU6Ojo6MTM4MTMwMTIxMTg2MQ==#C1')>预 订</a>
响应的结果一段字符串,上面是截取的一条记录,观察发现响应的结果是返回车次信息,每条记录以\n结束。
而对于一条记录来说,是以“,”隔开的各个信息字段,对应于查询结果表格中的各个字段。
重点说下下面这个数据:
<a name='btn130_2' class='btn130_2' style='text-decoration:none;' onclick=javascript:getSelected('K599#15:17#05:20#330000K5980K#BXP#WCN#20:37#北京西#武昌#08#27#1*****30364*****00091*****00083*****0004#MUFFMDhDQTNCNEMzQjMwMTU4Qzg5NjdDODMxREI2MkNFODFDMThEREM3MzM0NDA5NEY0RTUzMTU6Ojo6MTM4MTMwMTIxMTg2MQ==#C1')>预 订</a>
这个是当用户点击预定的时候,要向服务器发送的数据,数据是以#隔开的,这个我把它称为orderkey。
OK,当我们点击预定的时候,看下发生了哪些http请求
post:https://dynamic.12306.cn/otsweb/order/querySingleAction.do?method=submutOrderRequest
post的数据:
station_train_code:K599
train_date:2013-10-11
seattype_num: from_station_telecode:BXP
to_station_telecode:WCN
include_student:00
from_station_telecode_name:北京
to_station_telecode_name:武汉
round_train_date:2013-10-09
round_start_time_str:00:00--24:00
single_round_type:1 train_pass_type:QB
train_class_arr:QB#D#Z#T#K#QT#
start_time_str:00:00--24:00
lishi:15:17
train_start_time:05:20
trainno4:330000K5980K
arrive_time:20:37
from_station_name:北京西
to_station_name:武昌
from_station_no:08
to_station_no:27
ypInfoDetail:1*****30364*****00091*****00083*****0004
mmStr:Qzg1NUEzMzUzQTUwQzgzQUVFRkM1MDM0MDk4QkNEMzM4QUU1OUQ0MjNEODMyNERDNENDMjY3QkY6Ojo6MTM4MTMwMTE0Mzk4OQ==
locationCode:C1
OTkwNjU2OA==:YWJjYjU2NDBiOTE0MWViZQ==
myversion:undefined
上面的参数我们大多数都可以通过点击预定时候的那个"orderkey"获取到,只是后面的多了一个红色标注的动态key和动态value,这个在上一面文章已经提到过怎么得到了,这里就不再多说。
返回的结果是一个302,302的地址是:
https://dynamic.12306.cn/otsweb/order/confirmPassengerAction.do?method=init
打开这个页面,发现是选择乘客信息的和提交订单的页面。
接着我们选择乘客人,输入验证码后提交,看发生了哪些请求:
post:https://dynamic.12306.cn/otsweb/order/confirmPassengerAction.do?method=checkOrderInfo&rand=x8t6
rand表示验证码,从method的字面意思看是检测订单信息
post数据:
如上图所示这个post的数据中,包含了乘车信息,和乘客信息。乘车信息,在上一步预定的时候都可以得到,乘客信息呢,观察得到,
https://dynamic.12306.cn/otsweb/order/confirmPassengerAction.do?method=getpassengerJson 这个地址可以得到用户的所有乘客人信息,通过选择的乘客信息,可以构造出我们要提交的数据。
post的数据当中org.apache.struts.taglib.html.TOKEN和leftTicketStr是怎么来的呢,回头看看预定后的那个302地址,发现源码里面有这么一段
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="21f84a6c22c03df66fcd90a5d1eb9818">
<input type="hidden" name="leftTicketStr" id="left_ticket" value="1015253036404275000910152500083027050004" />
对比上面post的数据的值,这个正是我们需要的,所以,从302地址的源码我们可以得到这些值了。
看看请求的结果:
{"checkHuimd":"Y","check608":"Y","msg":"","errMsg":"Y"}
其中checkHuimd为N的话说明:由于您取消次数过多,今日将不能继续受理您的订票请求!
check608为N的话说明:本车为实名制列车,实行一日一车一证一票制!
当上面那2个值有一个为N的话,msg将显示错误信息。
OK,如果这一步无错误信息提示,将继续查询余票信息
get:https://dynamic.12306.cn/otsweb/order/confirmPassengerAction.do?method=getQueueCount&train_date=2013-10-11&train_no=330000K5980K&station=K599&seat=3&from=BXP&to=WCN&ticket=1015253035404275000910152500003027050004
返回的结果是:
{"countT":0,"count":0,"ticket":"1*****30354*****00091*****00003*****0004","op_1":false,"op_2":false}
如果op_2为true的话表示目前排队人数已经超过余票张数,countT表示目前排队人数。
ticket表示余票信息。
如果有票的话,我们继续请求:
post:https://dynamic.12306.cn/otsweb/order/confirmPassengerAction.do?method=confirmSingleForQueue
post的数据和检测订单的数据大致一样,只是少了一个tFlag:dc。
响应的结果:{"errMsg":"Y"},这就表示订单确认成功了。如果errMsg为N的话,响应的结果会出现msg信息来表示错误信息。
订单确认成功了,我们还得取检测下订单是否完成
get:https://dynamic.12306.cn/otsweb/order/myOrderAction.do?method=queryOrderWaitTime&tourFlag=dc
响应的结果:{"tourFlag":"dc","waitTime":-1,"waitCount":0,"orderId":"E493113786","requestId":5793605912349971391,"count":0}
waitTime表示排队等待的时间,如果为-1表示订单成功了,可以去付款了。orderId表示订单编号,当订单成功后这个值才会出现。
至此,整个查询,下订单的过程完成了。
最后上一张我写的查询订票的图:
转载于:https://www.cnblogs.com/coding1016/p/3359329.html
玩转12306之查询、订票相关推荐
- 聚合数据Android SDK 12306火车票查询订票演示示例
1.聚合SDK是聚合数据平台,为移动开发者提供的免费数据接口.使用前请先到聚合平台(http://www.juhe.cn/)注册,申请相关数据. 2.下载聚合数据SDK,将开发包里的juhe_sdk_ ...
- 【Web_UI自动化_Python3_12306查询余票/车次_seleniumkeysselectXpath定位】12306火车票官方订票网站,查询余票/车次,自动化测试案例
#!/usr/bin/env/python3 # -*- coding:utf-8 -*- ''' Author:leo Date&Time:2019-07-27 and 12:22 File ...
- go-home源码分析----一款针对12306的火车票订票软件
项目地址:http://code.google.com/p/go-home/,源代码svn地址: http://go-home.googlecode.com/svn/trunk/ 去年出的一款比较老的 ...
- 12306新版网页订票系统或即将上线
随着中国铁路总公司低调上线手机订票客户端,我们同时也发现新版的网页订票系统. 新版订票系统可通过https://kyfw.12306.cn/进行访问. 新版的订票系统页面更简洁,使用更便捷. 试用中我 ...
- jsp+java+servlet飞机票查询订票系统
1.添加订票:注册用户在网站前台登录个人账号后,可以选择某个航班,进行订票,之后将在个人后台形成订票记录. 2.订票管理:注册用户可以登录个人后台,查询个人订票记录,进行查看,删除,查看可以跳转至该航 ...
- 说说12306.cn铁路订票网站
铁路订票网站常常挂掉,那些技术宅们又有写头了.对技术的选用比如caoz写的这篇,再如对架构的设计云风写的这篇.我这篇是扯蛋打酱油的.如果想看技术分析请看caoz和云风的. 1,What is key ...
- python批量自动订票_python+splinter实现12306网站刷票并自动购票流程
python+splinter实现12306网站刷票并自动购票流程 通过python+splinter,实现在12306网站刷票并自动购票流程(无法自动识别验证码). 此类程序只是提高了12306网站 ...
- APIJSON复杂业务深入实践(类似12306订票系统)
一.前言 APIJSON一款自动化的ORM框架,对于前后端开发,带来了很大的便利(有了它,后端不再需要写常规的业务代码,简单的,复杂的,增删改查),为什么这么说,请看下文分析.因为此文针对的是APIJ ...
- 一款实用的火车票订票APP--高铁管家
在不断的高铁旅行中,我一直以来使用的是12306网站进行订票,但是12306网站订票交互性差,等待时间长,用户体验让人觉得崩溃,于是我不停的寻找着替代12306的产品,偶然间找到了--高铁管家这款AP ...
最新文章
- mac用什么写python程序_mac下的应用程序发布 及 打包(Python写的脚本,可打包第三方库)...
- 读债务危机0812:接管房利美和房地美
- 【算法漫画】什么是红黑树?(下篇)
- 【springboot 踩坑记录】拦截器中无法注入bean
- mysql里面的页面筛选_【mysql】像很多网站(比如电商)里的筛选功能一般是如何实现的?...
- pyplot 余弦函数_python如何画出三角函数
- vba单元格批量赋值_「经验」快速学习VBA
- 商业项目计划书PPT模板
- python xy 2.7下载_pythonxy 安装
- AltiumDesigner2020导入3D Body-SOLIDWORKS三维模型
- 2021年全球排烟扇收入大约181百万美元,预计2028年达到198.7百万美元
- 隐形窗口_建立网站时要考虑的隐形(但至关重要)注意事项
- gitlab报错502
- LinkedBlockingQueue 实现生产者消费者模型
- python进程池multiprocessing.Pool和线程池multiprocessing.dummy.Pool实例
- 软件框架-无绪开发5
- python输出假分数_解析ArcGis的标注(一)——先看看分数式、假分数式标注是怎样实现的...
- javaweb-jsp(上)
- 战舰少女rcffff服务器维护,战舰少女R4月29日临时维护公告 2-5配置错误修正
- python读二进制 float_Python 二进制读文件 转换 float 失败
热门文章
- stl-map/set
- 【译】Look-ahead Staking in Qtum - What does that even mean?
- oracle临时表空间大小查询,查看oracle 系统临时表空间、undo表空间、SGA和PGA大小...
- JAVA梦幻之星攻略_梦幻之星2_《梦幻之星携带版2》图文详尽攻略 - 梦幻之星携带版2:无限...
- rca接口_音频线怎么区别?几种音频接口逐一介绍
- Qt 互斥锁 QMutex 的简单应用
- themleft模板库_Thymeleaf 模板的使用
- 安卓 camera 调用流程_[Camera]Camera1 open、preview、take picture流程分析(3)
- 因果推断 - 反事实
- hdu5461(2015沈阳网络赛L题)