前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >12306购票抓包分析以及任务分解

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

作者头像
北山啦
发布2022-11-27 13:01:01
1.2K0
发布2022-11-27 13:01:01
举报
文章被收录于专栏:北山啦的博客

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

学习目标:
  1. 了解 12306抓包过程

1.1 抓包分析

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

  1. url
  2. query
  3. method
  4. data
  5. Referer
  6. response.text / response.json()
1.1.1 https://www.12306.cn/index/

作用:获取cookies

  • GET
1.1.2 https://kyfw.12306.cn/otn/login/conf

作用:获取cookies

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

作用:获取cookies

GET

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

response.json()

代码语言:javascript
复制
{"validateMessagesShowId":"_validatorMessage","status":true,"httpstatus":200,"data":...
1.1.4 https://kyfw.12306.cn/passport/web/auth/uamtk-static

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

POST

data

代码语言:javascript
复制
{'appid': 'otn'}

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

response.json()

代码语言:javascript
复制
{"result_message":"用户未登录","result_code":1}
1.1.5 https://kyfw.12306.cn/passport/web/create-qr64

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

POST

data

代码语言:javascript
复制
{'appid': 'otn'}

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

response.json()

代码语言:javascript
复制
{"result_message":"生成二维码成功","result_code":"0","image":"iVBO...","uuid":"..."}
  • uuid
1.1.6 https://kyfw.12306.cn/passport/web/checkqr

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

POST

data

代码语言:javascript
复制
{'appid': 'otn', 'uuid': uuid}

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

response.json()

代码语言:javascript
复制
{"result_message":"二维码状态查询成功","result_code":"0"}
1.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()

代码语言:javascript
复制
{"result_message":"生成验证码成功","result_code":"0","image":"/9j..."}
  • image:base64 图片编码
1.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()

代码语言:javascript
复制
{'result_message': '验证码校验成功', 'result_code': '4'}
1.1.9 https://kyfw.12306.cn/passport/web/login

作用:登录

POST

data

代码语言:javascript
复制
{'username': username,
'password': password,
'appid': 'otn',
'answer': answer} # 图片验证码坐标 1.8小结

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

response.json()

代码语言:javascript
复制
{"result_message":"登录成功","result_code":0,"uamtk":"mZflRtMjLW9f7tIDMvjiZR0qp5uuO3zJQBHeCHvMrxssd1210"}
1.1.10 https://kyfw.12306.cn/otn/login/userLogin

作用:302跳转

  • GET
  • Referer https://kyfw.12306.cn/otn/resources/login.html
1.1.11 https://kyfw.12306.cn/otn/passport?redirect=/otn/login/userLogin

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

  • GET
  • Referer https://kyfw.12306.cn/otn/resources/login.html
1.1.12 https://kyfw.12306.cn/passport/web/auth/uamtk

作用:获取newapptk

POST

data

代码语言:javascript
复制
{'appid': 'otn'}

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

response.json()

代码语言:javascript
复制
{'result_message': '验证通过', 'result_code': 0, 'apptk': None, 'newapptk': '9pHw2HZlkEEoUm_Nc4DJxl1QUk6NdAZqz4DXs3B2mHAga1210'}
  • newapptk
1.1.13 https://kyfw.12306.cn/otn/uamauthclient

作用:登录后验证

POST

data

代码语言:javascript
复制
{'tk': newapptk}

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

response.json()

代码语言:javascript
复制
{'apptk': '9pHw2HZlkEEoUm_Nc4DJxl1QUk6NdAZqz4DXs3B2mHAga1210', 'result_code': 0, 'result_message': '验证通过', 'username': '赵艳秋'}
1.1.14 https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9076

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

  • GET
  • query
    • station_version=1.9076 # 随着国家的发展,新增车站/城市,会新增版本号
1.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()

代码语言:javascript
复制
{"validateMessagesShowId":"_validatorMessage","status":true,"httpstatus":200,"messages":[],"validateMessages":{}}
1.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.1.17 https://kyfw.12306.cn/otn/login/checkUser

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

POST

data

代码语言:javascript
复制
{'_json_att': ''}

Referer https://kyfw.12306.cn/otn/leftTicket/init

response.json()

代码语言:javascript
复制
{'validateMessagesShowId': '_validatorMessage', 'status': True, 'httpstatus': 200, 'data': {'flag': True}, 'messages': [], 'validateMessages': {}}
1.1.18 https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest

作用:点击预定车票

POST

data

代码语言:javascript
复制
{
'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()

代码语言:javascript
复制
{"validateMessagesShowId":"_validatorMessage","status":true,"httpstatus":200,"data":"N","messages":[],"validateMessages":{}}
1.1.19 https://kyfw.12306.cn/otn/confirmPassenger/initDc

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

POST

data

代码语言:javascript
复制
{'_json_att': ''}

Referer https://kyfw.12306.cn/otn/leftTicket/init

response.text

  • repeat_submit_token 正则获取
  • key_check_isChange 正则获取
1.1.20 https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs

作用:获取用户信息

POST

data

代码语言:javascript
复制
{'_json_att': '',
'REPEAT_SUBMIT_TOKEN': repeat_submit_token} # 1.1.19获取

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

response.json()

需要解析并构造乘客信息

需要解析坐席编码 seat_type

passengerTicketStr

代码语言:javascript
复制
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

代码语言:javascript
复制
oldPassengerStr = '%s,%s,%s,1_' % (
            passenger_info_dict['passenger_name'],
            passenger_info_dict['passenger_id_type_code'],
            passenger_info_dict['passenger_id_no'])
1.1.21 https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo

作用:检查选票人信息

POST

data

代码语言:javascript
复制
{
'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()

代码语言:javascript
复制
{"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.1.22 https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount

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

POST

data

代码语言:javascript
复制
{
'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()

代码语言:javascript
复制
{"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.1.23 https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue

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

POST

data

代码语言:javascript
复制
{
'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()

代码语言:javascript
复制
{'validateMessagesShowId': '_validatorMessage', 'status': True, 'httpstatus': 200, 'data': {'submitStatus': True}, 'messages': [], 'validateMessages': {}}
1.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()

代码语言:javascript
复制
{"validateMessagesShowId":"_validatorMessage","status":true,"httpstatus":200,"data":{"queryOrderWaitTimeStatus":true,"count":0,"waitTime":4,"requestId":6478994818521140385,"waitCount":1,"tourFlag":"dc","orderId":null},"messages":[],"validateMessages":{}}
1.1.25 https://kyfw.12306.cn/otn/confirmPassenger/resultOrderForDcQueue

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

POST

data

代码语言:javascript
复制
{
'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()

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

1.2 项目任务分解

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 12306购票抓包分析以及任务分解
    • 1.1 抓包分析
      • 1.1.1 https://www.12306.cn/index/
      • 1.1.2 https://kyfw.12306.cn/otn/login/conf
      • 1.1.3 https://kyfw.12306.cn/otn/index12306/getLoginBanner
      • 1.1.4 https://kyfw.12306.cn/passport/web/auth/uamtk-static
      • 1.1.5 https://kyfw.12306.cn/passport/web/create-qr64
      • 1.1.6 https://kyfw.12306.cn/passport/web/checkqr
      • 1.1.7 https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand&_={}
      • 1.1.8 https://kyfw.12306.cn/passport/captcha/captcha-check?answer={}&rand=sjrand&login_site=E&_={}
      • 1.1.9 https://kyfw.12306.cn/passport/web/login
      • 1.1.10 https://kyfw.12306.cn/otn/login/userLogin
      • 1.1.11 https://kyfw.12306.cn/otn/passport?redirect=/otn/login/userLogin
      • 1.1.12 https://kyfw.12306.cn/passport/web/auth/uamtk
      • 1.1.13 https://kyfw.12306.cn/otn/uamauthclient
      • 1.1.14 https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9076
      • 1.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.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.1.17 https://kyfw.12306.cn/otn/login/checkUser
      • 1.1.18 https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest
      • 1.1.19 https://kyfw.12306.cn/otn/confirmPassenger/initDc
      • 1.1.20 https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs
      • 1.1.21 https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo
      • 1.1.22 https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount
      • 1.1.23 https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue
      • 1.1.24 https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime?random=%s&tourFlag=dc&_json_att=&REPEAT_SUBMIT_TOKEN=%s
      • 1.1.25 https://kyfw.12306.cn/otn/confirmPassenger/resultOrderForDcQueue
    • 1.2 项目任务分解
    相关产品与服务
    验证码
    腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档