前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >抢火车票脚本

抢火车票脚本

作者头像
用户3577892
发布2020-06-12 09:08:20
1.6K0
发布2020-06-12 09:08:20
举报
文章被收录于专栏:数据科学CLUB数据科学CLUB
代码语言:javascript
复制
# -*- coding: utf-8 -*-

#12306账号
myuser="账号"
mypasswd="密码"
import urllib.request
import re
import ssl
import urllib.parse
import http.cookiejar
import datetime
import time
ssl._create_default_https_context = ssl._create_unverified_context
areatocode={"上海":"SHH","北京":"BJP","南京":"NJH","昆山":"KSH","杭州":"HZH","桂林":"GLZ"}
start1=input("请输入起始站:")
start=areatocode[start1]
to1=input("请输入到站:")
to=areatocode[to1]
isstudent=input("是学生吗?是:1,不是:0")
date=input("请输入要查询的乘车开始日期的年月,如1997-10-07:")
if(isstudent=="0"):
    student="ADULT"
else:
    student="0X00"
url="https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date="+date+"&\
leftTicketDTO.from_station="+start+"&leftTicketDTO.to_station="+to+"&purpose_codes="+student
context = ssl._create_unverified_context()
data=urllib.request.urlopen(url).read().decode("utf-8","ignore")
patrst01='"result":\[(.*?)\]'
rst01=re.compile(patrst01).findall(data)[0]
allcheci=rst01.split(",")
checimap_pat='"map":({.*?})'
checimap=eval(re.compile(checimap_pat).findall(data)[0])
print("车次\t出发站名\t到达站名\t出发时间\t到达时间\t一等座\t二等座\t硬座\t无座")
for i in range(0,len(allcheci)):
    try:
        thischeci=allcheci[i].split("|")
        code=thischeci[3]
        fromname=thischeci[6]
        fromname=checimap[fromname]
        toname=thischeci[7]
        toname=checimap[toname]
        stime=thischeci[8]
        atime=thischeci[9]
        yz=thischeci[31]
        wz=thischeci[30]
        ze=thischeci[29]
        zy=thischeci[26]
        print(code+"\t"+fromname+"\t"+toname+"\t"+stime+"\t"+atime+"\t"+str(zy)+"\t"+str(ze)+"\t\
              "+str(yz)+"\t"+str(wz))
    except Exception as err:
        pass
isdo=input("查票完成,请输入1继续…")
if(isdo==1 or isdo=="1"):
    pass
else:
    raise Exception("输入不是1,结束执行")
print("Cookie处理中…")
cjar=http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
urllib.request.install_opener(opener)
loginurl="https://kyfw.12306.cn/otn/login/init#"
req0 = urllib.request.Request(loginurl)
req0.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, lik\
e Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
req0data=urllib.request.urlopen(req0).read().decode("utf-8","ignore")
yzmurl="https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand"
while True:
    urllib.request.urlretrieve(yzmurl,"图片路径")
    yzm=input("请输入验证码,输入第几张图片即可")
    if(yzm!="re"):
        break
pat1='"(.*?)"'
allpic=re.compile(pat1).findall(yzm)
def getxy(pic):
    if(pic==1):
        xy=(35,45)
    if(pic==2):
        xy=(112,45)
    if(pic==3):
        xy=(173,45)
    if(pic==4):
        xy=(253,45)        
    if(pic==5):
        xy=(35,114)
    if(pic==6):
        xy=(112,114)
    if(pic==7):
        xy=(173,114)
    if(pic==8):
        xy=(253,114)
    return xy
allpicpos=""
for i in allpic:
    thisxy=getxy(int(i))
    for j in thisxy:
        allpicpos=allpicpos+str(j)+","
allpicpos2=re.compile("(.*?).$").findall(allpicpos)[0]
print(allpicpos2)
yzmposturl="https://kyfw.12306.cn/passport/captcha/captcha-check"
yzmpostdata =urllib.parse.urlencode({
"answer":allpicpos2,
"rand":"sjrand",
"login_site":"E",
}).encode('utf-8')
req1 = urllib.request.Request(yzmposturl,yzmpostdata)
req1.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, lik\
e Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
req1data=urllib.request.urlopen(req1).read().decode("utf-8","ignore")
loginposturl="https://kyfw.12306.cn/passport/web/login"
loginpostdata =urllib.parse.urlencode({
"username":myuser,
"password":mypasswd,
"appid":"otn",
}).encode('utf-8')
req2 = urllib.request.Request(loginposturl,loginpostdata)
req2.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, lik\
e Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
req2data=urllib.request.urlopen(req2).read().decode("utf-8","ignore")
loginposturl2="https://kyfw.12306.cn/otn/login/userLogin"
loginpostdata2 =urllib.parse.urlencode({
"_json_att":"",
}).encode('utf-8')
req2_2 = urllib.request.Request(loginposturl2,loginpostdata2)
req2_2.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, lik\
e Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
req2data_2=urllib.request.urlopen(req2_2).read().decode("utf-8","ignore")

#loginposturl3="https://kyfw.12306.cn/passport/web/auth/uamtk"


loginposturl4="https://kyfw.12306.cn/otn/uamauthclient"
loginpostdata4 =urllib.parse.urlencode({
"tk":"cli2f6l6ey0neIVsR_moEUOUHtyMFxiOFhQpnAnxy2y0",
}).encode('utf-8')
req2_4 = urllib.request.Request(loginposturl4,loginpostdata4)
req2_4.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, lik\
e Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
req2data_4=urllib.request.urlopen(req2_4).read().decode("utf-8","ignore")

centerurl="https://kyfw.12306.cn/otn/index/initMy12306"
req3 = urllib.request.Request(centerurl)
req3.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, lik\
e Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
req3data=urllib.request.urlopen(req3).read().decode("utf-8","ignore")
print("登陆完成")

isdo=input("如果需要订票,请输入1继续,否则请输入其他数据")
if(isdo==1 or isdo=="1"):
    pass
else:
    raise Exception("输入不是1,结束执行")
thiscode=input("请输入要预定的车次:")
chooseno="None"

while True:
    try:

        initurl="https://kyfw.12306.cn/otn/leftTicket/init"
        reqinit=urllib.request.Request(initurl)
        reqinit.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.3\
6 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
        initdata=urllib.request.urlopen(reqinit).read().decode("utf-8","ignore")

        bookurl="https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date="+date+"&leftTi\
cketDTO.from_station="+start+"&leftTicketDTO.to_station="+to+"&purpose_codes="+student
        req4 = urllib.request.Request(bookurl)
        req4.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHT\
ML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
        req4data=urllib.request.urlopen(req4).read().decode("utf-8","ignore")

        patrst01='"result":\[(.*?)\]'
        rst01=re.compile(patrst01).findall(req4data)[0]
        allcheci=rst01.split(",")
        checimap_pat='"map":({.*?})'
        checimap=eval(re.compile(checimap_pat).findall(req4data)[0])
        code=[]
        secretStr=[]
        zy=[]
        for i in range(0,len(allcheci)):
            try:
                thischeci=allcheci[i].split("|")
                thiscode1=thischeci[3]
                code.append(thiscode1)
                secretStr.append(thischeci[0].replace('"',""))
                thiszy=thischeci[31]
                zy.append(thiszy)
            except Exception as err:
                pass
        trainzy={}
        for i in range(0,len(code)):
            trainzy[code[i]]=zy[i]
        traindata={}
        for i in range(0,len(code)):
            traindata[code[i]]=secretStr[i]
        checkurl="https://kyfw.12306.cn/otn/login/checkUser"
        checkdata =urllib.parse.urlencode({
        "_json_att":""
        }).encode('utf-8')
        req5 = urllib.request.Request(checkurl,checkdata)
        req5.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.3\
6 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
        req5data=urllib.request.urlopen(req5).read().decode("utf-8","ignore")
        backdate=datetime.datetime.now()
        backdate=backdate.strftime("%Y-%m-%d")
        submiturl="https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest"
        submitdata =urllib.parse.urlencode({
        "secretStr":traindata[thiscode],
        "train_date":date,
        "back_train_date":backdate,
        "tour_flag":"dc",
        "purpose_codes":student,
        "query_from_station_name":start1,
        "query_to_station_name":to1,
        })
        submitdata2=submitdata.replace("%25","%")
        submitdata3=submitdata2.encode('utf-8')
        req6 = urllib.request.Request(submiturl,submitdata3)
        req6.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.3\
6 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
        req6data=urllib.request.urlopen(req6).read().decode("utf-8","ignore")
        initdcurl="https://kyfw.12306.cn/otn/confirmPassenger/initDc"
        initdcdata =urllib.parse.urlencode({
        "_json_att":""
        }).encode('utf-8')
        req7 = urllib.request.Request(initdcurl,initdcdata)
        req7.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.3\
6 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
        req7data=urllib.request.urlopen(req7).read().decode("utf-8","ignore")
        train_no_pat="'train_no':'(.*?)'"
        leftTicketStr_pat="'leftTicketStr':'(.*?)'"
        fromStationTelecode_pat="from_station_telecode':'(.*?)'"
        toStationTelecode_pat="'to_station_telecode':'(.*?)'"
        train_location_pat="'train_location':'(.*?)'"
        pattoken="var globalRepeatSubmitToken.*?'(.*?)'"
        patkey="'key_check_isChange':'(.*?)'"
        train_no_all=re.compile(train_no_pat).findall(req7data)
        if(len(train_no_all)!=0):
            train_no=train_no_all[0]
        else:
            raise Exception("train_no获取失败")
        leftTicketStr_all=re.compile(leftTicketStr_pat).findall(req7data)
        if(len(leftTicketStr_all)!=0):
            leftTicketStr=leftTicketStr_all[0]
        else:
            raise Exception("leftTicketStr获取失败")
        fromStationTelecode_all=re.compile(fromStationTelecode_pat).findall(req7data)
        if(len(fromStationTelecode_all)!=0):
            fromStationTelecode=fromStationTelecode_all[0]
        else:
            raise Exception("fromStationTelecod获取失败")
        toStationTelecode_all=re.compile(toStationTelecode_pat).findall(req7data)
        if(len(toStationTelecode_all)!=0):
            toStationTelecode=toStationTelecode_all[0]
        else:
            raise Exception("toStationTelecode获取失败")
        train_location_all=re.compile(train_location_pat).findall(req7data)
        if(len(train_location_all)!=0):
            train_location=train_location_all[0]
        else:
            raise Exception("train_location获取失败")
        tokenall=re.compile(pattoken).findall(req7data)
        if(len(tokenall)!=0):
            token=tokenall[0]
        else:
            raise Exception("Token获取失败")
        keyall=re.compile(patkey).findall(req7data)
        if(len(keyall)!=0):
            key=keyall[0]
        else:
            raise Exception("key_check_isChange获取失败")
        pattrain_location="'tour_flag':'dc','train_location':'(.*?)'"
        train_locationall=re.compile(pattrain_location).findall(req7data)
        if(len(train_locationall)!=0):
            train_location=train_locationall[0]
        else:
            raise Exception("train_location获取失败")
        getuserurl="https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs"
        getuserdata =urllib.parse.urlencode({
        "REPEAT_SUBMIT_TOKEN":token,
        }).encode('utf-8')
        req8 = urllib.request.Request(getuserurl,getuserdata)
        req8.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.3\
6 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
        req8data=urllib.request.urlopen(req8).read().decode("utf-8","ignore")
        namepat='"passenger_name":"(.*?)"'
        idpat='"passenger_id_no":"(.*?)"'
        mobilepat='"mobile_no":"(.*?)"'
        countrypat='"country_code":"(.*?)"'
        nameall=re.compile(namepat).findall(req8data)
        idall=re.compile(idpat).findall(req8data)
        mobileall=re.compile(mobilepat).findall(req8data)
        countryall=re.compile(countrypat).findall(req8data)
        if(chooseno!="None"):
            pass
        else:
            for i in range(0,len(nameall)):
                print("第"+str(i+1)+"位用户,姓名:"+str(nameall[i]))
            chooseno=input("请选择要订票的用户的序号,如需选择多\
位,可以自行修改一下代码")
            thisno=int(chooseno)-1
        if(trainzy[thiscode]=="无"):
            print("当前无票,继续监控…")
            continue
        checkOrderurl="https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo"
        checkdata=urllib.parse.urlencode({
        "cancel_flag":2,
        "bed_level_order_num":"000000000000000000000000000000",
        "passengerTicketStr":"M,0,1,"+str(nameall[thisno])+",1,"+str(idall[thisno])+",\
"+str(mobileall[thisno])+",N",
        "oldPassengerStr":str(nameall[thisno])+",1,"+str(idall[thisno])+",1_",
        "tour_flag":"dc",
        "randCode":"",
        "whatsSelect":1,
        "_json_att":"",
        "REPEAT_SUBMIT_TOKEN":token,
        }).encode('utf-8')
        req9 = urllib.request.Request(checkOrderurl,checkdata)
        req9.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KH\
TML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
        req9data=urllib.request.urlopen(req9).read().decode("utf-8","ignore")
        print("确认订单完成,即将进行下一步")
        getqueurl="https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount"
        thisdatestr=date
        thisdate=datetime.datetime.strptime(thisdatestr,"%Y-%m-%d").date()
        gmt='%a+%b+%d+%Y'
        thisgmtdate=thisdate.strftime(gmt)

        leftstr2=leftTicketStr.replace("%","%25")
        getquedata="train_date="+str(thisgmtdate)+"+00%3A00%3A00+GMT%2B0800&train_no="+train_no+"&sta\
tionTrainCode="+thiscode+"&seatType=M&fromStationTelecode="+fromStationTelecode+"&toStationTelecod\
e="+toStationTelecode+"&leftTicket="+leftstr2+"&purpose_codes=00&train_location="+train_location+"&_j\
son_att=&REPEAT_SUBMIT_TOKEN="+str(token)
        getdata=getquedata.encode('utf-8')
        req10 = urllib.request.Request(getqueurl,getdata)
        req10.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTM\
L, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
        req10data=urllib.request.urlopen(req10).read().decode("utf-8","ignore")
        print("获取订单队列完成,即将进行下一步")

        confurl="https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue"
        confdata2=urllib.parse.urlencode({
        "passengerTicketStr":"M,0,1,"+str(nameall[thisno])+",1,"+str(idall[thisno])+",\
"+str(mobileall[thisno])+",N",
        "oldPassengerStr":str(nameall[thisno])+",1,"+str(idall[thisno])+",1_",
        "randCode":"",
        "purpose_codes":"00",
        "key_check_isChange":key,
        "leftTicketStr":leftTicketStr,
        "train_location":train_location,
        "choose_seats":"",
        "seatDetailType":"000",
        "whatsSelect":"1",
        "roomType":"00",
        "dwAll":"N",
        "_json_att":"",
        "REPEAT_SUBMIT_TOKEN":token,
        }).encode('utf-8')
        req11 = urllib.request.Request(confurl,confdata2)
        req11.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.3\
6 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
        req11data=urllib.request.urlopen(req11).read().decode("utf-8","ignore")
        print("配置确认提交完成,即将进行下一步")
        time1=time.time()
        while True:

            time2=time.time()
            if((time2-time1)//60>5):
                print("获取orderid超时,正在进行新一次抢购")
                break
            getorderidurl="https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime?random="+str(int(time.time()*1000))+"&tourFlag=dc&_json_att=&REPEAT_SUBMIT_TOKEN="+str(token)
            req12 = urllib.request.Request(getorderidurl)
            req12.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
            req12data=urllib.request.urlopen(req12).read().decode("utf-8","ignore")
            patorderid='"orderId":"(.*?)"'
            orderidall=re.compile(patorderid).findall(req12data)
            if(len(orderidall)==0):
                print("未获取到orderid,正在进行新一次的请求。")
                continue
            else:
                orderid=orderidall[0]
                break
        print("获取orderid完成,即将进行下一步")

        resulturl="https://kyfw.12306.cn/otn/confirmPassenger/resultOrderForDcQueue"
        resultdata="orderSequence_no="+orderid+"&_json_att=&REPEAT_SUBMIT_TOKEN="+str(token)
        resultdata2=resultdata.encode('utf-8')
        req13 = urllib.request.Request(resulturl,resultdata2)
        req13.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
        req13data=urllib.request.urlopen(req13).read().decode("utf-8","ignore")
        print("请求结果完成,即将进行下一步")
        try:

            payurl="https://kyfw.12306.cn/otn//payOrder/init"
            paydata="_json_att=&REPEAT_SUBMIT_TOKEN="+str(token)
            paydata2=paydata.encode('utf-8')
            req14 = urllib.request.Request(payurl,paydata2)
            req14.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
            req14data=urllib.request.urlopen(req14).read().decode("utf-8","ignore")
            print("订单已经完成提交,您可以登录后台进行支付了。")
            break
        except Exception as err:
            break
    except Exception as err:
        print(err)1.需要加入验证码图片保存路径
代码语言:javascript
复制
2.需要抓包
代码语言:javascript
复制
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据科学CLUB 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档