12306自动抢票
一、使用工具
1、Google Chrome 浏览器
2、fiddler4抓包工具
3、pycharm
4、python3.6
二、抓取网页请求
1、首先打开Google Chrome 浏览器完成一遍买票过程,登录--查询--买票。使用fiddler抓包工具抓取。
#登录网站:
https://kyfw.12306.cn/otn/login/init
三、详细分析
1、登录
验证码校验:https://kyfw.12306.cn/passport/captcha/captcha-check
校验成功如下:圈出来的就是所需要输入的验证码,其实就是正确答案的坐标
这个验证码坐标可以通过以下方式获取: 1、手动输入 2、自动识别(http://littlebigluo.qicp.net:47720),打开这个页面你就懂了。
密码校验:https://kyfw.12306.cn/passport/web/login
返回给我一个这个玩意儿,不知道干嘛的,留着呗 uamtk=p5sbjTadftLXTWk4D1PopeKUsOSGGw6qKrasNZyTUeQnx1110
https://kyfw.12306.cn/passport/web/auth/uamtk
返回: newapptk=J0_e7wT42T96NRjEHRDgRtJi0DzmNXpzbAldAZZVgUE731110
https://kyfw.12306.cn/otn/uamauthclient
这不newapptk这个玩意儿就用上了
到这里已经返回了正确的用户名了,算是成功登陆了。 我们可以访问下下面两个页面试试。 https://kyfw.12306.cn/otn/view/index.html https://kyfw.12306.cn/otn/index/initMy12306
2、余票查询
登录好了就开始查票
https://kyfw.12306.cn/otn/leftTicket/queryX?leftTicketDTO.traindate=2019-04-04&leftTicketDTO.fromstation=RQW&leftTicketDTO.tostation=IZQ&purposecodes=ADULT
我们选择D1801这趟车 CrFDowh0bnbtKqq0rRcDgziY%2B0SoJKJRLttdCZ1GmAgdASdLY%2FRLgJecq0FtY52GcUSF8dRXxzM8%0AHAe%2BHc7bB8tdlAFSD5lC3ZDb7N%2BAizlYTGrFY1JeQfgzixu51UsAuYLt3DXmnq%2BIqxd2D8zIlGtS%0AnbifCQoIaY9Z9GJLeIQyOERSfMwtp1V8Rg84W89eQmCbYLyDRCB8PCUZ8X8d9KixIu9fuywpa1%2Fn%0A4btDGq79FsKwMSthrVIts3xuz0NauWcm5vfOoGDEv4YmRaXGu6kAyDKmtp054YZ9Zj6huQEPXwit%0A 这串东西我们先留着
https://kyfw.12306.cn/otn/login/checkUser
这里又进行了一次登录检查
https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest
开始提交我们的预订车次信息,刚那串长长的玩意儿丢到这里用
https://kyfw.12306.cn/otn/confirmPassenger/initDc
打印返回的text,一大堆看不懂的东西,放这儿吧
https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs
圈圈里面的东西,怎么获取呢 复制下来 到刚刚那个text里面去查询一下,还真有
https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo
&passengerTicketStr=O%2C0%2C1%2C%E6%9D%A8%E5%BB%BA%E9%94%8B%2C1%2C441223198703032012%2C%2CN&oldPassengerStr=%E6%9D%A8%E5%BB%BA%E9%94%8B%2C1%2C441223198703032012%2C1_
这堆东西又从哪里来呢 这么多%估计是url编码的,用 print(urllib.parse.unquote(string))给他翻译下,发现这就是我们乘车人的一些信息
https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs 访问这个网页时貌似得到过这些东西,提取一下就好了
https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount
又是一堆看不懂的参数。。。。 老规矩带%的丢到去翻译一下 leftTicket=kxUp7XgcTQj3YZbvwkh6xKaHiyHZoYxiSMaCDYK%252BJkh6wpD7 这个leftTicket实在是找不到从哪里获取了,又丢到上面text去find,果然又在这里。。。
https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue
除了keycheckisChange=1483D47DB73CEABDA70FC4E4B5A169C976A06CAA04B9C20504B59257 其它的貌似都能找到了,没办法又去text找呗,又一次找到了我们需要的东西
突然反应过来,这不已经提交订单了?
https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime?random=1552458550174&tourFlag=dc&jsonatt=&REPEATSUBMITTOKEN=7a8ee5c5f8a3ba4bd306781bae3e60e2
WaitTime?这不是让我们等待嘛,那就等呗
等待的结果就是orderId从orderId=(null)变成了orderId=E265371621
https://kyfw.12306.cn/otn/confirmPassenger/resultOrderForDcQueue
不用多说了吧 把上面的orderId丢过来
这已经是抢票的最后一步了,打开12306你会发现火车票已经在这等着你支付了
再接下来无非就是邮件、短信、qq、微信等提醒支付的操作了。
四、代码编写整合
有需要代码的朋友,留言评论哟。