12306的(再次破解)从查票到购票

2 篇文章 0 订阅
2 篇文章 0 订阅

建议各位:使用charls抓包或者fidder抓包,不然有些信息抓不到,以至于操作无法进行,可能会陷入沉思与迷茫状态

0.介绍

以前大一的时候,做过12306的购票也成功了,也发了博客,但那时经验甚少也没有写博客经验而且还是第一篇博客,确实没有做好,但是现在在准备面试项目,又重新把12306这个项目捡起来了,发现确实更新不少,单就cookie登陆那块就很坑,还有在以前最后的购票之后又加了几步请求(但是无伤大雅,只是参数的传递而已!)

1.先进行一个大致的思路体系 

我的思路是:先查票如果没有票就不用进行登录  有票的话则需要进行 登陆 然后在进行购票

改进:当然了自己封装成类也是可以的,我的实现是用面向过程的思路,用的是函数的拼接!
工具和库:使用python3   主要依赖库有 requests(实现了主要请求方式)   re(实现了不规则文本信息的匹配)   

请求原理:由于涉及有登陆操作所以url需要进行cookie的传递 , 使用了req = requests.Session()用于自动保存cookie 

 反爬措施:主要加上header的UA以及refer源头网页,以及cookie。

2.查票功能的实现

先进入主页

https://www.12306.cn/index/

然后进入查票的页面  chromF12  在XHR里找(一般ajax json格式的都是在此)找到页面

https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2019-05-
15&leftTicketDTO.from_station=CDW&leftTicketDTO.to_station=CSQ&purpose_codes=ADULT

发现关键点参数:train_date='2018-05-10'   from_station = '...'   to_station = '....'
首先:第一个参数比较好找 格式必须对应他是火车发车日期     

剩余两个参数 进行关键字搜索发现在一个JS文件里面

可以从以下JS页面找到:城市对应的英文字符大全

https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9100

参数寻找完毕,然后可以进行查票功能了

通过页面返回信息(json格式)的对应,可以发现以下信息特征:

'''1预定  3车次 8出发时间 9到达时间 10历时 21 高级软卧 23软卧  25,32商务座特等座
 31一等座  30二等座 26无座 29 硬座 28硬卧 33 动卧  27 软座'''

然后根据数字特征信息,进行查找有自己想要的类型座位,然后就是要登陆然后购票了嘛!
 
 3.登陆操作的实现

先找到登陆的页面,然后发现在上面还有check页面,这个验证必须请求

找到该check页面

https://kyfw.12306.cn/passport/captcha/captcha-check

只发现了一个验证码参数answer的数据提交,

然后我们的思路是:找到图片先把图片保存下来,猜想可能是坐标信息(因为原数字就是点击的坐标嘛!)

经过抓包验证,这里的 'answer'参数就是验证码 点击的坐标 ,但是你自己需要找到图片的0,0点位置(从左上角开始,使用qq进行截图,可以查看信息),多抓几次包就可以实现   

(额外补充:callback可以不传入,一般这种参数没有用的!)

1.这个可以通过对接打码平台 ,比较麻烦不考虑。

2.人工输入  就是输入  几个坐标 然后用逗号隔开就好格式:45,113,121,114,258,46

然后找到登陆帐号页面:(到了最坑的阶段了,在这里更新比较大!

https://kyfw.12306.cn/passport/web/login

两个参数username,password,然后参数你发现它是明文啊,直接输入就行!而且新加了answer参数就是上面的坐标这倒没啥

然后登陆,发现302跳转到网络时间错误........在这里直接考虑cookie,也发现确实有!

在这里经过测试必须有的cookie

RAIL_EXPIRATION
RAIL_DEVICEID

然后心酸之路开启,我就找传递cookie的页面啊,通过找关键字和关键值,最终找到了所有请求

https://kyfw.12306.cn/otn/HttpZF/GetJS
直接诶请求可以获得:BIGipServerotn

https://kyfw.12306.cn/otn/HttpZF/logdevicealgID=9K6MUm5nyb&hashCod......
参数之多吓尿我!页面返回信息可以获得:exp和dfp
然后我试着直接拿到浏览器请求,发现直接可以响应的,于是开开心心的去请求了!
折腾了一天,让别人帮忙,就是cookie这块不行,也尝试了一个一个找参数,但是比较复杂。
最后在别人的帮助下,我直接用我抓包成功登陆的cookie试了下,发现what fack?成功了!!!
然后我不心甘,直接找js看加密,折腾了几个小时,总结下我的过程,首先说明没有破解掉,
但是具体意思看懂了,也懒得用python去慢慢模拟,慢慢搞了!
只说下大致思路:(在chrom浏览器F12去查看,直接首页就是!)
我找到这些是一步一步debug出来,才找到思路的,起源是最难找的!

一步一步走:在https://kyfw.12306.cn/otn/HttpZF/GetJS里
找到了  var f = c.x64hash128(d.join("~~~"), 31);   这个是js的起源!
ps:就是类似md5加密只要每次的值一样,那么得到的结果就一样!
下一行:return a(f, b) 在进行了加密,可以进入到getDfpMoreInfo: function(a)这里!
就是设置了cookie,对以下三个参数:regular_plugins,touch_support,js_fonts
使用了function aa(a)这个函数,这个是名副其实最普通的:MD5加密!!(经过了验证!)
ps:这些md5和x64hash128其实就是url里面这些参数的加密!
走完getDfpMoreInfo函数基本就一大半了,再走几步!
可以来到if (!(9E5 < G("RAIL_EXPIRATION")这块,
到e = c.hashAlg(m, a, e)之前又对几个值进行了处理也是url里的参数,很简单看看就行。
e = c.hashAlg(m, a, e)里面进行了最后一个参数的加密处理和参数的整理!
最后一个参数就是hashCode,经过了ca.SHA256(c).toString(ca.enc.Base64)函数
又是一个类似md5的加密,只要传参不变加密的值就一定不变!
至此,参数就这么多!ps:你们要找的话直接浏览器里面ctrl+F即可!
ps:个人感受,感觉全是定值但是你不改变定值获得的cookie登录不成...,
全是md5/hash128(SHA128)/最后hash256(SHA256)全都是!
真的变态,就是感觉没用甚么高大上的加密算法,但就是模拟很复杂,感觉无从下手!
最坑的是:直接请求是会给参数的但是登录不成,会提示网络错误.......
至此,cookie上我使用了抓包登陆成功的cookie值!

https://kyfw.12306.cn/passport/web/auth/uamtk-static
前提需要:BIGipServerotn  RAIL_EXPIRATION  RAIL_DEVICEID 
请求可以获得:BIGipServerpool_passport

https://kyfw.12306.cn/otn/index12306/getLoginBanner
前提需要:BIGipServerotn  RAIL_EXPIRATION  RAIL_DEVICEID   BIGipServerpool_passport
请求可以获得:route

ps:至此,此url成功!

 

每次觉得登陆成功后,先要验证一下嘛(一定要做!),才行,最后你发现没登录上......what fuck?

然后,发现在后面还有个页面auth紧接着uamauthclient页面进行验证,恍然大悟了吧!

https://kyfw.12306.cn/passport/web/auth/uamtk

https://kyfw.12306.cn/otn/uamauthclient

发现了第二个页面有个参数tk,然后进行搜索,发现就是uamtk页面传下来的参数,更重要的是!(uamtk页面的参数是固定的

然后在验证是否登录成功嘛,发现嘿登陆成功了啊!(咋验证呢,你要是能从个人中心匹配到自己的账户名不就行了么!)
 
 

4.购票操作
 操作介绍--------------购票 :下单一共分5步  ,实际购票动作一共分3步(以前一步即可)!  
 下单第一步:只有一个固定参数_json_att且为空!(post请求!

https://kyfw.12306.cn/otn/login/checkUser

下单第二步:只有一个参数不知道secretStr,其他的都是乘车日期,地点啥的,当前日期啥的。(post请求!

https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest

全文搜索参数值发现在查票的那个url里面出现过

https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2019-05-18&leftTicketDTO.from_station=CDW&leftTicketDTO.to_station=CSQ&purpose_codes=ADULT

但是经过对比发现了问题,不完全一样,我们得到的值里面有%2D这些,但是需要提交的没有进行了某种编码!

可以使用 urllib.parse.unquote(sorce) 来进行映射编码,%这些通常在url里面会出现一般都会使用这个库来解析出对应的字符!

下单第三步:只有一个参数REPEAT_SUBMIT_TOKEN我们不知道!(post请求!

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

进行全文搜索值,发现在参数在个人主页里面...........(前面为啥让你登陆个人主页检验是否登录呢!

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

下单第四步:REPEAT_SUBMIT_TOKEN参数已经解决,whatsSelect和cancel_flag多抓包就知道啥意思了添定值可以!其他参数都是根据个人信息来定的,可以都填自己的!(post请求!

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

下单第五步:train_date只把年月日换掉即可,seatType座位类型嘛定值即可,REPEAT_SUBMIT_TOKEN已经获取过了,(post请求!

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

train_location全文搜索在,purpose_codes全文搜索也在,leftTicket全文搜索也在,这个url上面已经得到了

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

stationTrainCode在原来查票的那个url里面,train_no也在,fromStationTelecode/toStationTelecode从哪到哪也在

https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2019-05-18&leftTicketDTO.from_station=CDW&leftTicketDTO.to_station=CSQ&purpose_codes=ADULT

购票第一步在下单第五步中purpose_codes,leftTicketStr,train_location,REPEAT_SUBMIT_TOKEN都获取到了不用管

其他参数都是个人信息或者定值不用管了!(post请求!

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

key_check_isChange经过搜素也下面这个url里

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

至此为止,在大一的时候在这里就已经购票成功了,但是现在大二后面又加了两个请求,但是比较简单!

购票第二步:参数有random13位时间戳,REPEAT_SUBMIT_TOKEN前面获取过了!

https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime?
random=1558017286454
&tourFlag=dc
&_json_att=
&REPEAT_SUBMIT_TOKEN=e2cbdc56592859e19cbbe32ba6de0407

ps:会返回一个orderId的参数,可能某些情况会有None,可以多请求几次,因为这个返回参数下一个url需要用到

购票第三步:orderSequence_no就是上面第二步传下来的orderId,还有获取过的REPEAT_SUBMIT_TOKEN!

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

至此购票操作全部成功!

整个项目圆满结束!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值