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

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()

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

1.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.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.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.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.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.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.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

    {'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.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.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()

    {"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

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

  • response.json()

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

1.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.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.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.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.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.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.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.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":{}}
    

1.2 项目任务分解

1.2-12306购票项目任务分解.png

小结

  1. 了解 12306登陆购票抓包过程
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351