欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python3 requests 12306下单环节

程序员文章站 2024-03-17 22:43:52
...

完成之前的登录,查票(城市编号转换之后),重头戏也是最复杂的环节来了,要完成下单,需要经过下列一系列验证,且均要通过验证,由此可见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

python3 requests 12306下单环节

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

2、点击预定python3 requests 12306下单环节

 

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

python3 requests 12306下单环节

 

3、获取联系人

python3 requests 12306下单环节

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

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

python3 requests 12306下单环节

 

4、检查选票人信息

python3 requests 12306下单环节

            '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、提交订单

python3 requests 12306下单环节

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、确认订单

python3 requests 12306下单环节

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:

python3 requests 12306下单环节

第二次post:

python3 requests 12306下单环节

 

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

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

8、订单结果

python3 requests 12306下单环节

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

 

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

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

python3 requests 12306下单环节

 

python3 requests 12306下单环节

 

5月6号试验补充:

python3 requests 12306下单环节

python3 requests 12306下单环节

登录12306官网查看:

python3 requests 12306下单环节