實現12306自動搶票

import requestsimport jsonimport urllib.parseimport refrom 搶票12306.sites import siteclass Train: """12306搶票""" def __init__(self): self.session = requests.session() self.headers = { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36, } self.site_dict = dict() self.secretStr = [] def prepare(self): sitetemp = site.split(@)[1:] for si in sitetemp: sitemp = si.split(|) self.site_dict[sitemp[1]] = sitemp[2] # 登錄函數 def login(self): img_code = self.session.get( https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&0.8826254050991758, verify=False, headers=self.headers) with open(驗證碼.png, wb) as f: f.write(img_code.content) img_xy = input(請輸入驗證碼坐標:) data = { answer: img_xy, login_site: E, rand: sjrand, } req = self.session.post(https://kyfw.12306.cn/passport/captcha/captcha-check, verify=False, headers=self.headers, data=data) print(req.text) # 用戶名密碼 data = { username: ************, password: *********, appid: otn, } req = self.session.post(https://kyfw.12306.cn/passport/web/login, verify=False, headers=self.headers, data=data) response = json.loads(req.text) if response[result_code] == 0: data = { appid:otn, } req = self.session.post(https://kyfw.12306.cn/passport/web/auth/uamtk, verify=False, headers=self.headers, data=data) response = json.loads(req.text) print(response) tk = response[newapptk] data = { tk: tk } req = self.session.post(https://kyfw.12306.cn/otn/uamauthclient, verify=False, headers=self.headers, data=data) response = json.loads(req.text) if response[result_code] == 0: print(登錄成功) return True print(登錄失敗) self.login() # 查票函數 def check(self, date, start, end): # 處理站點代碼 self.prepare() # 查詢車票 self.date = date self.start = start self.end = end # train_date 出發時間 train_date = date # from_station 出發站點 from_station = self.site_dict[start] # to_station 到達站點 to_station = self.site_dict[end] url = """https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=%s&leftTicketDTO.from_station=%s&leftTicketDTO.to_station=%s&purpose_codes=ADULT""" % (train_date, from_station, to_station) req = self.session.get(url, verify=False, headers=self.headers) response = json.loads(req.text) data = response[data][result] """ car[3] 車次 car[8] 起始時間 car[9] 結束時間 car[10] 歷時 car[22] 高級軟卧 car[23] 軟卧 car[24] 動卧 car[25] 未知 car[26] 無座 car[27] 軟座 car[28] 硬座 car[29] 硬卧 car[32] 商務座特等座 car[31] 一等座 car[30] 二等座 """ i = 1 for line in data: car = line.split(|) self.secretStr.append(car) text = """ 當前車次:%s -- 出發時間:%s -- 到達時間:%s -- 歷時:%s 商務特等座:%s -- 一等座:%s -- 二等座:%s -- 高級軟卧:%s -- 軟卧:%s -- 動卧:%s -- 硬卧:%s -- 軟座:%s -- 硬座:%s -- 無座:%s """ % (car[3], car[8], car[9], car[10], car[32], car[31], car[30], car[22], car[23], car[24], car[29], car[27], car[28], car[26]) print(i, text) i += 1 # 下單 def order(self): # data = { # _json_att: # } #req = self.session.post(https://kyfw.12306.cn/otn/login/checkUser, verify=False, headers=self.headers, data=data) #print(req.text) i = eval(input(請輸入下單班次(序號):)) data = { # urllib.parse.unquote() secretStr: urllib.parse.unquote(self.secretStr[i-1][0]), train_date: self.date, back_train_date: 2018-4-29, tour_flag: dc, purpose_codes: ADULT, query_from_station_name: self.start, query_to_station_name: self.end, undefined: } req = self.session.post(https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest, verify=False, headers=self.headers, data=data) print(req.text) if req.text.find(您還有未處理的訂單) != -1: print(還有訂單未處理!!!) return data = { _json_att: "" } req = self.session.post(https://kyfw.12306.cn/otn/confirmPassenger/initDc, verify=False, headers=self.headers, data=data) token = re.findall(rglobalRepeatSubmitToken = (w+);, req.text)[0] key_check_isChange = re.findall(r"key_check_isChange:(w+),", req.text)[0] data = { _json_att: , REPEAT_SUBMIT_TOKEN: token, } req = self.session.post(https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs, verify=False, headers=self.headers, data=data) data = json.loads(req.text) passengers = data[data][normal_passengers] k = 1 for passeng in passengers: print(k, passeng) k += 1 k = eval(input(請輸入乘客(序號):)) data = { cancel_flag: 2, bed_level_order_num: 000000000000000000000000000000, passengerTicketStr: O,0,1, + passengers[k-1][passenger_name] + ,1, + passengers[k-1][passenger_id_no] + ,,N, oldPassengerStr: passengers[k-1][passenger_name] + ,1, + passengers[k-1][passenger_id_no] + ,1_, tour_flag: dc, randCode: , whatsSelect: 1, _json_att: , REPEAT_SUBMIT_TOKEN: token, } req = self.session.post(https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo, verify=False, headers=self.headers, data=data) print(req.text) data = { train_date: Fri May 04 2018 00:00:00 GMT+0800(中國標準時間), train_no: self.secretStr[i-1][2], stationTrainCode: self.secretStr[i-1][3], seatType: O, fromStationTelecode: self.secretStr[i-1][6], toStationTelecode: self.secretStr[i-1][7], leftTicket: self.secretStr[i-1][12], purpose_codes: 00, train_location: self.secretStr[i-1][15], _json_att: , REPEAT_SUBMIT_TOKEN: token, } req = self.session.post(https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount, verify=False, headers=self.headers, data=data) print(req.text) print(self.secretStr[i-1]) data = { passengerTicketStr: O,0,1, + passengers[k-1][passenger_name] + ,1, + passengers[k-1][passenger_id_no] + ,,N, oldPassengerStr: passengers[k-1][passenger_name] + ,1, + passengers[k-1][passenger_id_no] + ,1_, randCode: , purpose_codes: 00, key_check_isChange: key_check_isChange, leftTicketStr: self.secretStr[i-1][12], train_location: self.secretStr[i-1][15], choose_seats: , seatDetailType: 000, whatsSelect: 1, roomType: 00, dwAll: N, _json_att: , REPEAT_SUBMIT_TOKEN: token } req = self.session.post(https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue, verify=False, headers=self.headers, data=data) print(req.text)if __name__ == __main__: train = Train() train.login() train.check(2018-05-04, 宿州, 黃山) train.order()

推薦閱讀:

用Python爬取網易雲音樂歌曲
使用requests+beautifulsoup爬取你想要的數據
八、示例
xpath全面總結
對某8同城APP的一次抓包分析-第一彈

TAG:搶票 | 科技 | python爬蟲 |