12306购票抓包分析以及任务分解

  • 前言
  • 1. 抓包分析
    • 1.1 `https://www.12306.cn/index/`
    • 1.2 `https://kyfw.12306.cn/otn/login/conf`
    • 1.3 `https://kyfw.12306.cn/otn/index12306/getLoginBanner`
    • 1.4 `https://kyfw.12306.cn/passport/web/auth/uamtk-static`
    • 1.5 `https://kyfw.12306.cn/passport/web/create-qr64`
    • 1.6 `https://kyfw.12306.cn/passport/web/checkqr`
    • 1.7 `https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand&_={}`
    • 1.8 `https://kyfw.12306.cn/passport/captcha/captcha-check?answer={}&rand=sjrand&login_site=E&_={}`
    • 1.9 `https://kyfw.12306.cn/passport/web/login`
    • 1.10 `https://kyfw.12306.cn/otn/login/userLogin`
    • 1.11 `https://kyfw.12306.cn/otn/passport?redirect=/otn/login/userLogin`
    • 1.12 `https://kyfw.12306.cn/passport/web/auth/uamtk`
    • 1.13 `https://kyfw.12306.cn/otn/uamauthclient`
    • 1.14 `https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9076`
    • 1.15 `https://kyfw.12306.cn/otn/leftTicket/log?leftTicketDTO.train_date=%s&leftTicketDTO.from_station=%s&leftTicketDTO.to_station=%s&purpose_codes=ADULT`
    • 1.16 `https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=%s&leftTicketDTO.from_station=%s&leftTicketDTO.to_station=%s&purpose_codes=ADULT`
    • 1.17 `https://kyfw.12306.cn/otn/login/checkUser`
    • 1.18 `https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest`
    • 1.19 `https://kyfw.12306.cn/otn/confirmPassenger/initDc`
    • 1.20 `https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs`
    • 1.21 `https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo`
    • 1.22 `https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount`
    • 1.23 `https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue`
    • 1.24 `https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime?random=%s&tourFlag=dc&_json_att=&REPEAT_SUBMIT_TOKEN=%s`
    • 1.25 `https://kyfw.12306.cn/otn/confirmPassenger/resultOrderForDcQueue`
  • 2. 项目任务分解

前言

中国人离不开火车票,学会了就能买票回家!


内容

  • 12306购票抓包分析以及任务分解
  • 处理验证码并完成登陆
  • 解析车站信息以及车辆信息
  • 预定订单初始化、解析用户信息以及坐席信息
  • 构造时间参数以及下单购票
  • 测试运行以及完整代码

1. 抓包分析

使用谷歌浏览器或fiddler等抓包工具完成登陆以及购票操作,进行抓包,根据 具有业务作用被set-cookie 确定以下内容:

  1. url
  2. query
  3. method
  4. data
  5. Referer
  6. response.text / response.json()

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

作用:获取cookies

  • GET

1.2 https://kyfw.12306.cn/otn/login/conf

作用:获取cookies

  • POST
  • data 无
  • Referer https://kyfw.12306.cn/otn/resources/login.html

1.3 https://kyfw.12306.cn/otn/index12306/getLoginBanner

作用:获取cookies

  • GET

  • Referer https://kyfw.12306.cn/otn/resources/login.html

  • response.json()

    {"validateMessagesShowId":"_validatorMessage","status":true,"httpstatus":200,"data":...
    

1.4 https://kyfw.12306.cn/passport/web/auth/uamtk-static

作用:获取cookies,检查用户是否登录

  • POST

  • data

    {'appid': 'otn'}
    
  • Referer https://kyfw.12306.cn/otn/resources/login.html

  • response.json()

    {"result_message":"用户未登录","result_code":1}
    

1.5 https://kyfw.12306.cn/passport/web/create-qr64

作用:获取cookies,获取登录二维码

  • POST

  • data

    {'appid': 'otn'}
    
  • Referer https://kyfw.12306.cn/otn/resources/login.html

  • response.json()

    {"result_message":"生成二维码成功","result_code":"0","image":"iVBO...","uuid":"..."}
    
    • uuid

1.6 https://kyfw.12306.cn/passport/web/checkqr

作用:获取cookies,查询二维码状态

  • POST

  • data

    {'appid': 'otn', 'uuid': uuid}
    
  • Referer https://kyfw.12306.cn/otn/resources/login.html

  • response.json()

    {"result_message":"二维码状态查询成功","result_code":"0"}
    

1.7 https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand&_={}

作用:获取验证码图片

  • GET

  • query

    • str(time.time() * 1000)[:-5] 13位时间戳
  • Referer https://kyfw.12306.cn/otn/resources/login.html

  • response.json()

    {"result_message":"生成验证码成功","result_code":"0","image":"/9j..."}
    
    • image:base64 图片编码

1.8 https://kyfw.12306.cn/passport/captcha/captcha-check?answer={}&rand=sjrand&login_site=E&_={}

作用:验证图片验证码

  • GET

  • query

    • answer 图片验证码坐标
    • str(time.time() * 1000)[:-5] 13位时间戳
  • Referer https://kyfw.12306.cn/otn/resources/login.html

  • response.json()

    {'result_message': '验证码校验成功', 'result_code': '4'}
    

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

作用:登录

  • POST

  • data

    {'username': username,
    'password': password,
    'appid': 'otn',
    'answer': answer} # 图片验证码坐标 1.8小结
    
  • Referer https://kyfw.12306.cn/otn/resources/login.html

  • response.json()

    {"result_message":"登录成功","result_code":0,"uamtk":"mZflRtMjLW9f7tIDMvjiZR0qp5uuO3zJQBHeCHvMrxssd1210"}
    

1.10 https://kyfw.12306.cn/otn/login/userLogin

作用:302跳转

  • GET
  • Referer https://kyfw.12306.cn/otn/resources/login.html

1.11 https://kyfw.12306.cn/otn/passport?redirect=/otn/login/userLogin

作用:进入登陆页,获取cookie或行为验证

  • GET
  • Referer https://kyfw.12306.cn/otn/resources/login.html

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

作用:获取newapptk

  • POST

  • data

    {'appid': 'otn'}
    
  • Referer https://kyfw.12306.cn/otn/passport?redirect=/otn/login/userLogin

  • response.json()

    {'result_message': '验证通过', 'result_code': 0, 'apptk': None, 'newapptk': '9pHw2HZlkEEoUm_Nc4DJxl1QUk6NdAZqz4DXs3B2mHAga1210'}
    
    • newapptk

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

作用:登录后验证

  • POST

  • data

    {'tk': newapptk}
    
  • Referer https://kyfw.12306.cn/otn/passport?redirect=/otn/login/userLogin

  • response.json()

    {'apptk': '9pHw2HZlkEEoUm_Nc4DJxl1QUk6NdAZqz4DXs3B2mHAga1210', 'result_code': 0, 'result_message': '验证通过', 'username': '赵艳秋'}
    

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

作用:解析获取车站/城市信息字典

  • GET
  • query
    • station_version=1.9076 # 随着国家的发展,新增车站/城市,会新增版本号

1.15 https://kyfw.12306.cn/otn/leftTicket/log?leftTicketDTO.train_date=%s&leftTicketDTO.from_station=%s&leftTicketDTO.to_station=%s&purpose_codes=ADULT

作用:查询车量信息前置操作

  • GET

  • query

    • train_data 出行时间 固定格式 2018-12-03
    • from_station_code 出行车站/城市编码
    • to_station_code 到达车站/城市编码
  • Referer https://kyfw.12306.cn/otn/leftTicket/init

  • response.json()

    {"validateMessagesShowId":"_validatorMessage","status":true,"httpstatus":200,"messages":[],"validateMessages":{}}
    

1.16 https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=%s&leftTicketDTO.from_station=%s&leftTicketDTO.to_station=%s&purpose_codes=ADULT

作用:查询车量信息

  • GET

  • query

    • train_data 出行时间 固定格式 2018-12-03
    • from_station_code 出行车站/城市编码 from 车站/城市信息字典[from_station]
    • to_station_code 到达车站/城市编码 from 车站/城市信息字典[to_station]
  • Referer https://kyfw.12306.cn/otn/leftTicket/init

  • response.json()

    • 此处需要解析车辆信息
    • secretStr
    • leftTicket
    • train_location

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

作用:检查用户是否保持登录状态

  • POST

  • data

    {'_json_att': ''}
    
  • Referer https://kyfw.12306.cn/otn/leftTicket/init

  • response.json()

    {'validateMessagesShowId': '_validatorMessage', 'status': True, 'httpstatus': 200, 'data': {'flag': True}, 'messages': [], 'validateMessages': {}}
    

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

作用:点击预定车票

  • POST

  • data

    {
    'secretStr': secretStr,
    'train_date': train_date,
    'back_train_date': train_date,
    'tour_flag': 'dc',  # dc 单程 wf 往返
    'purpose_codes': 'ADULT',  # 成人
    'query_from_station_name': from_station, # 车站/城市信息字典[from_station]
    'query_to_station_name': to_station, # 车站/城市信息字典[to_station]
    'undefined': ''
    }
    
  • Referer https://kyfw.12306.cn/otn/leftTicket/init

  • response.json()

    {"validateMessagesShowId":"_validatorMessage","status":true,"httpstatus":200,"data":"N","messages":[],"validateMessages":{}}
    

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

作用:订单初始化 获取REPEAT_SUBMIT_TOKEN 和 key_check_isChange

  • POST

  • data

    {'_json_att': ''}
    
  • Referer https://kyfw.12306.cn/otn/leftTicket/init

  • response.text

    • repeat_submit_token 正则获取
    • key_check_isChange 正则获取

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

作用:获取用户信息

  • POST

  • data

    {'_json_att': '',
    'REPEAT_SUBMIT_TOKEN': repeat_submit_token} # 1.1.19获取
    
  • Referer https://kyfw.12306.cn/otn/confirmPassenger/initDc

  • response.json()

    • 需要解析并构造乘客信息

    • 需要解析坐席编码 seat_type

    • passengerTicketStr

      passengerTicketStr = '%s,0,1,%s,%s,%s,%s,N' % (seat_type, passenger_info_dict['passenger_name'],passenger_info_dict['passenger_id_type_code'],passenger_info_dict['passenger_id_no'],passenger_info_dict['passenger_mobile_no'])
      
    • oldPassengerStr

      oldPassengerStr = '%s,%s,%s,1_' % (passenger_info_dict['passenger_name'],passenger_info_dict['passenger_id_type_code'],passenger_info_dict['passenger_id_no'])
      

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

作用:检查选票人信息

  • POST

  • data

    {
    'cancel_flag': '2',  # 未知
    'bed_level_order_num': '000000000000000000000000000000',  # 未知
    'passengerTicketStr': passengerTicketStr.encode('utf-8'),  # O,0,1,靳文强,1,142303199512240614,18335456020,N
    'oldPassengerStr': oldPassengerStr.encode('utf-8'),  # 靳文强,1,142303199512240614,1_
    'tour_flag': 'dc',  # 单程
    'randCode': '',
    'whatsSelect': '1',
    '_json_att': '',
    'REPEAT_SUBMIT_TOKEN': repeat_submit_token # 1.1.19获取
    }
    
  • Referer https://kyfw.12306.cn/otn/confirmPassenger/initDc

  • response.json()

    {"validateMessagesShowId":"_validatorMessage","status":true,"httpstatus":200,"data":{"ifShowPassCode":"N","canChooseBeds":"N","canChooseSeats":"N","choose_Seats":"MOP9","isCanChooseMid":"N","ifShowPassCodeTime":"1","submitStatus":true,"smokeStr":""},"messages":[],"validateMessages":{}}
    

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

作用:提交订单,并获取持票未付款的人数,和车票的真实余数

  • POST

  • data

    {
    'train_date': parseDate(train_date),  # Fri Nov 24 2017 00:00:00 GMT+0800 (中国标准时间)
    'train_no': train_info_dict['train_no'],  # 6c0000G31205
    'stationTrainCode': train_info_dict['stationTrainCode'],  # G312
    'seatType': seat_type,  # 席别
    'fromStationTelecode': train_info_dict['from_station'],  # one_train[6]
    'toStationTelecode': train_info_dict['to_station'],  # ? one_train[7]
    'leftTicket': train_info_dict['leftTicket'],  # one_train[12]
    'purpose_codes': '00',
    'train_location': train_info_dict['train_location'],  # one_train[15]
    '_json_att': '',
    'REPEAT_SUBMIT_TOKEN': repeat_submit_token # 1.1.19获取
    }
    
  • Referer https://kyfw.12306.cn/otn/confirmPassenger/initDc

  • response.json()

    {"validateMessagesShowId":"_validatorMessage","status":true,"httpstatus":200,"data":{"count":"0","ticket":"20,100","op_2":"false","countT":"0","op_1":"false"},"messages":[],"validateMessages":{}}
    
    • count 持票未付款的人数
    • ticket 车票的真实余数

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

作用:确认订单,进行扣票

  • POST

  • data

    {
    'passengerTicketStr': passengerTicketStr.encode('utf-8'),
    'oldPassengerStr': oldPassengerStr.encode('utf-8'),
    'randCode': '',
    'purpose_codes': '00',
    'key_check_isChange': key_check_isChange,
    'leftTicketStr': leftTicket,
    'train_location': train_location,  # one_train[15]
    'choose_seats': '',  # 选择坐席 ABCDEF 上中下铺 默认为空不选
    'seatDetailType': '000',
    'whatsSelect': '1',
    'roomType': '00',
    'dwAll': 'N',  # ?
    '_json_att': '',
    'REPEAT_SUBMIT_TOKEN': repeat_submit_token # 1.1.19获取
    }
    
  • Referer https://kyfw.12306.cn/otn/confirmPassenger/initDc

  • response.json()

    {'validateMessagesShowId': '_validatorMessage', 'status': True, 'httpstatus': 200, 'data': {'submitStatus': True}, 'messages': [], 'validateMessages': {}}
    

1.24 https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime?random=%s&tourFlag=dc&_json_att=&REPEAT_SUBMIT_TOKEN=%s

作用:排队等待 返回waittime(下次发送重复请求所需要的等待时间) 重复发送请求直到获取 requestID 和 orderID

  • GET

  • query

    • str(int(time.time() * 1000))
    • repeat_submit_token # 1.1.19获取
  • Referer https://kyfw.12306.cn/otn/confirmPassenger/initDc

  • response.json()

    {"validateMessagesShowId":"_validatorMessage","status":true,"httpstatus":200,"data":{"queryOrderWaitTimeStatus":true,"count":0,"waitTime":4,"requestId":6478994818521140385,"waitCount":1,"tourFlag":"dc","orderId":null},"messages":[],"validateMessages":{}}
    

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

作用:获取订单结果,如果提示“网络传输过程中数据丢失,请查看未完成订单,继续支付!”则购票成功!

  • POST

  • data

    {
    'orderSequence_no': orderID, # 1.1.24获取
    '_json_att': '',
    'REPEAT_SUBMIT_TOKEN': repeat_submit_token # 1.1.24获取
    }
    
  • Referer https://kyfw.12306.cn/otn/confirmPassenger/initDc

  • response.json()

    {"validateMessagesShowId":"_validatorMessage","status":true,"httpstatus":200,"data":{"errMsg":"网络传输过程中数据丢失,请查看未完成订单,继续支付!","submitStatus":false},"messages":[],"validateMessages":{}}
    

2. 项目任务分解


小结

  1. 了解 12306登陆购票抓包过程

【爬虫实战】12306购票抓包分析以及任务分解相关推荐

  1. 12306购票抓包分析以及任务分解

    12306购票抓包分析以及任务分解 学习目标: 了解 12306抓包过程 1.1 抓包分析 使用谷歌浏览器或fiddler等抓包工具完成登陆以及购票操作,进行抓包,根据 具有业务作用 或 被set-c ...

  2. python 爬虫 包_python爬虫学习之路-抓包分析

    利用浏览器抓包,是爬虫中的很实用的技能.在爬虫编程之前,我们要对抓取的目标页面有所了解,比如浏览器的这个请求这个页面中间都经历了什么,数据是怎么发送和返回的. 抓包的作用 我把抓包分析的作用简单列一下 ...

  3. hls二次加密 m3u8_HLS实战之Wireshark抓包分析

    0.引言 Wireshark(前称Ethereal)是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直 ...

  4. linux 查看握手时间,实战:tcpdump抓包分析三次握手四次挥手

    本文档以实战的形式介绍tcpdump抓包分析三次握手四次挥手的过程. 执行tcpdump命令 tcpdump -n -i ens32 host 192.168.10.10 and 42.186.113 ...

  5. Python网络爬虫实战之Fiddler抓包今日头条app!附代码

    一.Fiddler介绍 1.Fiddler简介 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的"进出"F ...

  6. 数据分析与爬虫实战视频——学习笔记(二)(千图网图片爬虫、fiddler抓包分析、腾讯视频评论爬虫、多线程爬虫(糗百))

    网址:[数据挖掘]2019年最新python3 数据分析与数据爬虫实战 https://www.bilibili.com/video/av22571713/?p=26 第三周第二节课 1抓包分析实战 ...

  7. Python 爬虫知识点 - 淘宝商品检索结果抓包分析(续一)

    通过前一节得出地址可能的构建规律,如下: https://s.taobao.com/search?data-key=s&data-value=44&ajax=true&_ksT ...

  8. 网络爬虫---抓包分析,用抓包分析爬取腾讯视频某视频所有评论(Fiddler工具包的分享)

    抓包分析,用抓包分析爬取腾讯视频某视频所有评论(Fiddler工具包的分享) 文章目录 抓包分析,用抓包分析爬取腾讯视频某视频所有评论(Fiddler工具包的分享) 一.抓包分析 1.下载工具并安装 ...

  9. 实战录 | 基于openflow协议的抓包分析

    <实战录>导语 云端卫士<实战录>栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,希望对于关注我们的朋友有所裨益.本期分享人为云端卫士安全SDN工程师宋飞虎,将带来基于 ...

最新文章

  1. javascript去除首尾空白字符
  2. 键盘消息捕获--MFC
  3. Ibatis2到mybatis3的转变1
  4. unity鼠标控制镜头旋转_Unity Camera教程之 摄像机跟随鼠标移动而旋转
  5. [转]30个自我提升技巧
  6. mysql配置文件在哪_windows下的mysql配置文件在哪
  7. VS2010 .net4.0 登录QQ 获取QQ空间日志 右键选中直接打开日志 免积分 源码下载
  8. 窗口函数:计算环比和同比
  9. Topic 18. 临床预测模型之缺失值插补方法
  10. eNSP基础实验交换机连接路由器(二层交换机和三层交换机)
  11. python打开网页后点击网页按钮_python单击网页上的按钮
  12. Maven setting配置镜像仓库
  13. 这里除了安全,什么都不会发生!Docker镜像P2P加速之路
  14. 简述自动化测试实习收获
  15. 万马股份旗下万马爱充遭通报下架:违规收集个人信息,未及时整改
  16. tic/toc/cputime测试时间的区别
  17. 阿里代码规约:手动创建线程池,效果会更好哦
  18. 操作系统安装前的操心
  19. 大学生业余时间学习Python开发,20到30岁几乎决定了你的未来!
  20. python 手机号码识别,python 通过手机号识别出对应的微信性别(实例代码)

热门文章

  1. 螺旋传动设计系统lisp_螺旋传动设计
  2. 在移动硬盘安装操作系统
  3. 学英语《每日一歌》之yesterday once more
  4. 水星mercury无线扩展器设置
  5. CleanMyMac多功能mac电脑管家清理软件
  6. 快速神经网络的训练算法LARS/LAMB工作原理 --UC Berkeley在读博士生尤洋
  7. 维恩贝特面试JAVA后台开发
  8. MATLAB绘制“问题儿童表情包”动图2
  9. BreederDAO 宣布与 20 多个区块链游戏建立官方合作关系
  10. IP地址为140.123.0.0的地址是B类地址,若要切割为10个子网,而且都要连接上Internet,请问子网掩码应设为