完成之前的登录,查票(城市编号转换之后),重头戏也是最复杂的环节来了,要完成下单,需要经过下列一系列验证,且均要通过验证,由此可见12306的反爬机制做的还是相当出色的。

1、检查用户是否保持登录成功     https://kyfw.12306.cn/otn/login/checkUser

2、点击预定    https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest

3、获取联系人     https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs

4、检查选票人信息  https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo

5、提交订单  https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount

6、确认订单   https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue

7、排队等待  https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime

8、订单结果  https://kyfw.12306.cn/otn/confirmPassenger/resultOrderForDcQueue

需要做的依次post服务器需要的参数后,根据response返回的内容进行判断是否成功。

1、checkuser

post参数_json_att为空,注意返回的json,flag:true 为保持登录成功

2、点击预定

post参数 secretStr 根据查看返回的预定号urldecode转码而来,python3 可使用urllib.parse.unquote来进行转码,train_date 出发时间,back_train_date 返程时间 , tour_flag 固定值。

3、获取联系人

post的参数_json_att为空,REPEAT_SUBMIT_TOKEN在上一次请求页面的源码中。由于下面截图是后续截的,所以与上一次不同,由此可见每一次的REPEAT_SUBMIT_TOKEN都会改变,所以只要将https://kyfw.12306.cn/otn/confirmPassenger/initDc

get下来,使用正则便可以分析出来。方便后续使用。获取的联系人可以将有用的信息,买票人信息提取出来,为后面选票人下单提供参数。

4、检查选票人信息

            'cancel_flag':'2', #固定值'bed_level_order_num':'000000000000000000000000000000', #固定值'passengerTicketStr':'3,0,1,xxx,1,xxxxxxxxxxxxxx,,N',   #座位类型,0,票类型(成人/儿童),name,身份类型(身份证/军官证….),身份证,电话号码,保存状态'oldPassengerStr':'xxx,1,xxxxxxxxxxxxxxxx,1',  #姓名  1  身份证号码  1'tour_flag':'dc',   #固定值'randCode':'',       #随机数'whatsSelect':'1',      '_json_att':'',    #空'REPEAT_SUBMIT_TOKEN': xxxxxxxxx  #上面获取过

5、提交订单

data={'train_date': 'Wed Apr 22 2018 00:00: 00 GMT + 0800',   #出发时间,注意格式"REPEAT_SUBMIT_TOKEN": xxxxxxxx,    #上面获取过"_json_att": "",    #空"fromStationTelecode": fromStationTelecode,     #出发站的英文编号"leftTicket": leftTicket,     #和REPEAT_SUBMIT_TOKEN一样在相同网页获取"purpose_codes": purpose_codes,    #和REPEAT_SUBMIT_TOKEN一样在相同网页获取"seatType": '3',          #3为硬卧,具体可以查看https://kyfw.12306.cn/otn/confirmPassenger/initDc 检视元素可查看"stationTrainCode": station_train_code,   #车次"toStationTelecode": to_station_telecode, #目的站的也稳编号"train_no": train_no,      #和REPEAT_SUBMIT_TOKEN一样在相同网页获取'train_location':trainl_lst[2]       #车次序列号,和REPEAT_SUBMIT_TOKEN一样在相同网页获取}

6、确认订单

data={'passengerTicketStr': '3,0,1,xxx,1,xxxxxxxxxx,,N',  #选票人信息,获取过'oldPassengerStr': 'xxx,1,xxxxxxxxxxxxxxx,1_',  #获取过'randCode': '',     #随机值,空"purpose_codes": purpose_codes,    #获取过"key_check_isChange": key_check_isChange,   #和REPEAT_SUBMIT_TOKEN一样在相同网页获取"leftTicketStr": leftTicket,    #获取过'train_location': trainl_lst[2],     #获取过'choose_seats':'',       #座位类型,一般是高铁用'roomType': '00',     #固定值'dwAll': 'N',       #固定值"_json_att": "",  #空'seatDetailType':'000',       #固定值'whatsSelect': '1',      #固定值"REPEAT_SUBMIT_TOKEN": ticketToken,     #获取过}

7、排队等待

第一次post:

第二次post:

第一次和第二次post参数相同,但是第二次返回json中多了一个orderid,在订单结果中使用。

data={"REPEAT_SUBMIT_TOKEN": ticketToken,    #获取过"_json_att": "",   #空"random": str(time.time()),   #随机值"tourFlag": "dc"  #固定值}

8、订单结果

data={"REPEAT_SUBMIT_TOKEN": ticketToken,   #获取过"_json_att": "", #空"orderSequence_no": orderId    #获取到排队等待response中的orderid}

运行效果:由于要到五一节了,应该很多人买票,我设置的排队等待一个死循环,当获取orderid后跳出,所以一直在排队等待获得orderid,所以我没等订单提交成功了,去12306官网登录查看刚才下的订单也是在排队中。只要等到orderid,便可以到订单结果,之后呢,可以通过阿里大于的API来电话或短信通知下单的用户去支付订单即可完成购票。(二维码的话,可以去打码平台完成自动识别)

好了,关于12306的购票的学习到此告一段落,就单纯自己玩玩,之前都是做笔记,以后可以多写点博客啦。

 

5月6号试验补充:

登录12306官网查看:

python3 requests 12306下单环节相关推荐

  1. python3 requests 12306城市中文转英文编码

    我们去买车票不可能输入城市的英文代码,我们都是输入城市的中文名称,然后直接查询,下单.所以我们需要将输入的中文名称转为服务器认识的英文编码. https://kyfw.12306.cn/otn/lef ...

  2. python3 requests 实现12306购票登录模块

    12306登录模块分析 第一次写文章,记录一下学习的内容.今天先记录登录模块的分析和实现. 在博客上看见一些大佬用的是splinter  webdriver写的12306购票过程. 由于我之前学习了一 ...

  3. Python3 Requests+BS4网络爬虫:最详细零基础的获取百度快照链接爬虫教程(思路篇)

    Hello,大家好呀,五一劳动节快乐呀!最近在后台接到一个粉丝的私信说怎么爬取百度快照.正好五一有一段时间休息,咱们就来水一篇文章,顺便来巩固巩固基础的知识. 注意注意!这是思路篇,没有代码!只有思路 ...

  4. python3 requests+bs4爬取某网页MM图片

    python3 requests+bs4爬取某网页MM图片 原理: 将所要抓取的首页分标题及地址保存到字典,遍历字典,对每一个标题下的所有分页进行抓取 import requests from bs4 ...

  5. Python3 + requests + unittest接口测试

    文章转自 :https://www.jianshu.com/p/75e52b32c76f Python3 + requests + unittest接口测试 12018.09.10 17:23:48字 ...

  6. python3 requests模块

    1.requests简介 requests是通过urllib3实现自动发送HTTP/1.1请求,它能轻松的实现cookies,登陆验证,代理设置等操作. Python内置的urllib模块,用于访问网 ...

  7. python3+requests+unittest_python3+requests+unittest:接口自动化测试(一)

    简单介绍框架的实现逻辑,参考代码的git地址: 1.环境准备 python3 + pycharm编辑器 2.框架目录展示 (该套代码只是简单入门,有兴趣的可以不断后期完善) (1)run.py主运行文 ...

  8. python 12306登录_基于Python3的12306登录实现

    #-*- coding: utf-8 -*- importsys sys.path.append("..")importrequests, jsonfrom common.base ...

  9. 12306登录python_基于Python3的12306登录实现

    #-*- coding: utf-8 -*- importsys sys.path.append("..")importrequests, jsonfrom common.base ...

最新文章

  1. 暴力拒绝白嫖,著名开源项目作者删库跑路!神秘Bug影响超2万个项目,亚马逊云也躺枪...
  2. python代码怎么运行-python代码是怎样运行的
  3. glibc(ptmalloc)内存暴增问题解决
  4. 学委收作业神器-查未交同学
  5. java中同步_在Java中的方法同步和语句同步(块同步) - Break易站
  6. linux进程源码分析,Linux内核源代码分析——口述程序猿如何意淫进程(一)
  7. 通过机器学习识别“迪士尼在逃公主”,程序员宠女的正确打开方式!
  8. 前端开发者如何利用 CSS 实现酷炫的变色方案?
  9. python学习--关注容易被忽略的知识点--(三)高级特性
  10. Java后台开发入门
  11. 图书管理系统mysql数据库设计_简单的图书馆管理系统数据库设计
  12. 信息系统项目管理师(软考高项)
  13. 将一个数组划分成总和相等的两部分(分割数组)
  14. stm32f103c6t6
  15. TWS耳机供应链,看看背后都有谁?
  16. bluedroid a2dp sink播放流程
  17. 10027Longest Ordered Subsequence Extention
  18. get请求获得传递参数
  19. CISSP AIO7 学习笔记 - 第二章 资产安全 2.1-2.8小节 附送脑图
  20. 成为REAL程序员的终极指南

热门文章

  1. Linux内核OOM机制的详细分析和防止进程被OOM杀死的方法
  2. 【计算机网络】带宽时延积的意义
  3. 更相减损法和辗转相除法求最大公约数
  4. oracle 新建一个用户和赋予权限
  5. 龙虎山:免费上WIFI,江西首个全面铺设免费无线上网的景区
  6. 这些软件太强了,Windows必装!尤其程序员!
  7. JAVA生成grib文件,Grib格式转换心得【转载】
  8. tomcat详细介绍
  9. 高职计算机专业人生规划书,计算机专业职业规划书
  10. Linux命令之修改文件所属组chgrp