1. 程式人生 > >12306火車票搶票Python程式碼

12306火車票搶票Python程式碼

語言版本:Python

1、自動登入12306並保持Cookie

2、自動實現搶購設定的某日期的某車次的票

3、攻克排隊系統陷阱,避免進入排隊系統

4、迴圈監控某車次的票,直到有票,自動搶購

5、搶票時若出現異常,自動重新搶票,直到成功

'''
@初始配置項
Author:韋瑋
---------------
'''
# 12306賬號
myuser = "[email protected]"
mypasswd = "312132123"
import urllib.request
import re
import ssl
import urllib.parse
import
http.cookiejar import datetime import time # 為了防止ssl出現問題,你可以加上下面一行程式碼 ssl._create_default_https_context = ssl._create_unverified_context # 查票 # 常用三字碼與站點對應關係 areatocode = {"上海": "SHH", "北京": "BJP", "南京": "NJH", "崑山": "KSH", "杭州": "HZH", "桂林": "GLZ"} start1 = input("請輸入起始站:") # start1="北京" start = areatocode[start1] to1 = input("請輸入到站:"
) # to1="上海" to = areatocode[to1] isstudent = input("是學生嗎?是:1,不是:0") # isstudent="0" date = input("請輸入要查詢的乘車開始日期的年月,如2017-03-05:") # date="2018-04-13" 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("|") # [3]---code code = thischeci[3] # [6]---fromname fromname = thischeci[6] fromname = checimap[fromname] # [7]---toname toname = thischeci[7] toname = checimap[toname] # [8]---stime stime = thischeci[8] # [9]---atime atime = thischeci[9] # [28]---yz yz = thischeci[31] # [29]---wz wz = thischeci[30] # [30]---ze ze = thischeci[29] # [31]---zy 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繼續…") # isdo=1 if (isdo == 1 or isdo == "1"): pass else: raise Exception("輸入不是1,結束執行") print("Cookie處理中…") # 以下進行登陸操作 # 建立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, "./12306_yzm.png") yzm = input("請輸入驗證碼,輸入第幾張圖片即可") if (yzm != "re"): break # x座標(35,112,173,253),y座標(45) # x座標(35,112,173,253),y座標(114) 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) # post驗證碼驗證 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") # post賬號密碼驗證 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" loginpostdata3 = urllib.parse.urlencode({ "appid": "otn", }).encode('utf-8') req2_3 = urllib.request.Request(loginposturl3, loginpostdata3) req2_3.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_3 = urllib.request.urlopen(req2_3).read().decode("utf-8", "ignore") pat_req2 = '"newapptk":"(.*?)"' tk = re.compile(pat_req2, re.S).findall(req2data_3)[0] loginposturl4 = "https://kyfw.12306.cn/otn/uamauthclient" loginpostdata4 = urllib.parse.urlencode({ "tk": tk, }).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="1" isdo = input("如果需要訂票,請輸入1繼續,否則請輸入其他資料") if (isdo == 1 or isdo == "1"): pass else: raise Exception("輸入不是1,結束執行") thiscode = input("請輸入要預定的車次:") chooseno = "None" # chooseno="1" 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") # 儲存車次與secretStr資訊 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("|") # print(thischeci) # [3]---code thiscode1 = thischeci[3] code.append(thiscode1) # [0]---secretStr secretStr.append(thischeci[0].replace('"', "")) # [31]-zy thiszy = thischeci[31] zy.append(thiszy) except Exception as err: pass # 用字典trainzy儲存車次有沒有票的資訊 trainzy = {} for i in range(0, len(code)): trainzy[code[i]] = zy[i] # 用字典traindata儲存車次secretStr資訊,以供後續訂票操作 # 儲存的格式是:traindata={"車次1":secretStr1,"車次2":secretStr2,…} traindata = {} for i in range(0, len(code)): traindata[code[i]] = secretStr[i] # 訂票-第1次post-主要進行確認使用者狀態 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 backdate = datetime.datetime.now() backdate = backdate.strftime("%Y-%m-%d") # 訂票-第2次post-主要進行“預訂”提交 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") # 訂票-第3次post-主要獲取Token、leftTicketStr、key_check_isChange、train_location 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、leftTicketStr、fromStationTelecode、toStationTelecode、train_location 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獲取失敗") # 還需要獲取train_location 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獲取失敗") # 自動post網址4-獲取乘客資訊 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為對應乘客的下標,比序號少1,比如序號為1的乘客在列表中的下標為0 thisno = int(chooseno) - 1 if (trainzy[thiscode] == "無"): print("當前無票,繼續監控…") continue # 總請求1-點選提交後步驟1-確認訂單(在此只定二等座,座位型別為1,如需選擇多種型別座位,可 # 以自行修改一下程式碼使用if判斷一下即可) 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("確認訂單完成,即將進行下一步") # 總請求2-點選提交後步驟2-獲取佇列 getqueurl = "https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount" # checkdata=checkOrderdata.encode('utf-8') # 將日期轉為格林時間 # 先將字串轉為常規時間格式 thisdatestr = date # 需要的買票時間 thisdate = datetime.datetime.strptime(thisdatestr, "%Y-%m-%d").date() # 再轉為對應的格林時間 gmt = '%a+%b+%d+%Y' thisgmtdate = thisdate.strftime(gmt) # 將leftstr2轉成指定格式 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("獲取訂單佇列完成,即將進行下一步") # 總請求3-確認步驟1-配置確認提交 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: # 總請求4-確認步驟2-獲取orderid 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完成,即將進行下一步") # 總請求5-確認步驟3-請求結果 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: # 總請求6-確認步驟4-支付介面頁面 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)

相關推薦

12306火車票Python程式碼

語言版本:Python 1、自動登入12306並保持Cookie 2、自動實現搶購設定的某日期的某車次的票 3、攻克排隊系統陷阱,避免進入排隊系統 4、迴圈監控某車次的票,直到有票,自動搶購 5、搶票時若出現異常,自動重新搶票,直到成功 '''

python學習:12306火車票程式碼公開揭祕

火車票搶票程式碼公開揭祕 市場上很多火車票搶票軟體大家應該非常熟悉,但很少有人研究具體是怎麼實現的,所以覺得很神祕,其實很簡單。下面使用Python模擬搶票程式,給大家揭祕搶票到底是怎麼回事。 該程式碼僅供參考,主要用於大家溝通交流,禁止用於商業用途。 具體

12306自動軟體程式碼實現

昨天我發的是抓取的12306資料包,然後分析了一下,今天按照昨天的分析 用程式碼實現了,如果有需要的同學們可以看一下 ,實現的功能有,登入,驗證碼識別,自動查票,有餘票點選預定, 差了最後一步提交訂單。同學們可以自己研究一下。 import requests impor

Python + selenium + requests實現12306全自動,驗證碼破解加自動點選!!!

Python + selenium + requests實現12306全自動搶票,驗證碼破解加自動點選!!!!! 測試結果: 整個買票流程可以再快一點,不過為了穩定起見,有些地方等待了一些時間 完整程式,拿去可用 整個程式分了三個模組:購票模組(主體)、驗證碼識別模組、餘票查

過年過節真是一難求!分享關於Python最新版12306自動指令碼

為了方面和節約時間,本次使用的python編譯器和直譯器分別為pycharm,python3.6.1RC 逢年過節 有一個神奇的網站 你一定不陌生 “12306” 是不是總搶不到票啊 是不是觀察著餘票最新動態 告訴你一個新技能 賊666 12306自動搶票 前

12306 python+selenium+chrome 實現一

市面上的搶票軟體多的很。老套路,開關肯定是思考。 市場軟體用的技術方案:.NET,外掛。為免不是最好的方案,決定用Python,但怎麼搞。 這個我可是零基礎,還是百度下,突然間眼前一亮。12306搶票軟體原始碼詳解 從這裡有發現了一系列檔案,在邊學邊操的模式開幹。後續寫一系列文章,參

Github上最新發布的12306 自動開源工具(Python

12306 鑑於市場上的大多數搶票軟體的安全問題和效率問題,就手動修改了開源的程式碼來為自己贏得撿漏的機會,誰叫本電腦是linux系統呢。縮減重新整理的頻率也是一種策略,哈哈!!! 這是一款工具 這是一款搶票工具 這是一款 12306 自動搶票開源工

12306春運火車票攻略——3分鐘到熱門票

    2013年春節即將來臨,您一定在為買回家的火車票而發愁吧,上12306網站(http://www.12306.cn/)或者撥打熱線 95105105,您總髮現自己比別人慢一拍,本來票就不多,都被人家搶去了,鬱悶吧!搶票什麼的,搶時間最重要!1秒之差就可能錯過死亡之票。話不多 說,過年要回家的趕緊開啟

12306火車票失敗!您的身份信息未經核驗,一般人是不能訂的,我訂了,可是沒成功。。。

ext con efault jsb fill ast edit 技術 post 12306火車票訂票失敗!您的身份信息未經核驗。一般人是不能訂票的,我訂了,可是沒成功。。。 上圖哈,未經核驗能能夠訂票,只是出票失敗了。看來12306不是吃幹飯的

12306 分流 純凈綠色版

process cto ima 使用 短信郵件 alt 更新 準備 src 全程自動搶票,雲打碼自動識別驗證碼,多線程秒單、穩定撿漏,支持多天、多車次、短信提醒。??12306Bypass,12306分流搶票軟件,完全免費的12306搶票軟件,功能強易使用,全程自動搶票,雲

12306 Pytho代碼

安裝python 分別是 nta ger find load() visit 文本編輯 author 1、需要先安裝python環境 2、安裝selenium模擬用戶來操作瀏覽器 3、將chromedriver驅動放入chrome瀏覽器應用根目錄 4、用文本編輯器打開

玩轉新版12306

文章只做技術研究  如果通過此技術違反國家法律,一切後果自負,作者不承擔任何責任。 好吧,先來嘮叨,嘮叨。這幾天大家都沉浸在搶票中,當然我也不例外。 最後總結一句,有搶票軟體不一定能搶到票,沒搶票軟體一定是搶不到票,網頁一點就死了。 往年,還能弄個小工具搶搶,今年12306換了

Python3.6實現12306火車票自動,附源碼

python 爬蟲 web 編程 程序員Python(發音:英[?pa?θ?n],美[?pa?θɑ:n]),是一種面向對象、直譯式電腦編程語言,也是一種功能強大的通用型語言,已經具有近二十年的發展歷史,成熟且穩定。它包含了一組完善而且容易理解的標準庫,能夠輕松完成很多常見的任務。它的語法非常簡捷和清晰,與其它

手把手|100行Python程式碼自動火車票!(包教包會)

又到一年一度春運大會,2017年春運搶火車票還是那麼難,各大網際網路公司都推出搶票服務,只要加錢給服務費就可以增加搶到票的機率,有些代售火車票點,說給100元服務費,可以幫搶到,看來這水很深啊! 下面我們利用自己學的技術來自動搶票,本次指令碼基於Python3.6+splinter來實現:

python12306

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 ''' 4 利用splinter寫的一個手動過驗證及自動搶票的例子, 5 大家可以自己擴充套件或者弄錯窗體、web端。 6 本例子只做參考。 7

python實現12306

用splinter或者selenium都可以實現。這兩個庫是實現web瀏覽器自動操作的庫。就是模擬人的點選等等一系列操作。 不過先對應你的谷歌瀏覽器版本下好對應的chromedriver,然後新增好環境變數 驗證碼的部分沒有做,就是在你登入的時候要手動點選驗證,但是登入進去之後就不用管了,買

利用Python實現12306(直達)換乘原始碼講解

上期我給大家分享了一篇12306搶票軟體原始碼詳解,有朋友就提出了自己的需求。他說,貓哥你的搶票軟體只能搶直達的車票,可是我直達到不了呀,必須要換乘才可以。於是貓哥就在之前原始碼上做了更改,使其既能搶直達的票,又可以搶換乘的票。 (宣告:貓哥在這裡所講的內容僅供大家學習、參考使用,大家請勿對

使用Python實現12306原始碼詳解

在上期文章中我為展示瞭如何使用我們自己寫的12306搶票軟體進行搶票快速實現12306搶票軟體,在本期文章中我將為大家詳細講解12306搶票軟體的原始碼實現過程。在執行專案前要先安裝selenium+chrome(在我之前釋出的文章中,已經詳細的講解了這些配置的過程) (宣告:貓哥在這裡所講

python寫一個簡單的12306

引言 每逢過年就到了12306搶票高峰期,自己總想研究一下12306購票的流程,雖然網上已經很多資料,但是總比不過自己的親身體會,於是便琢磨著寫一個搶票軟體,本人比較熟悉python,所以軟體是用python寫的。 使用工具和庫 開發環境是python

python實現12306

# -*- coding: utf-8 -*- from splinter.browser import Browser from time import sleep import traceback import time, sys class huoche(obje