def query(self): # 乘客信息最多十五个 retry = 3 while retry: json_response = send_requests(LOGIN_SESSION, PASSENGER_URL_MAPPING, data={"pageIndex": 1, "pageSize": 10}) status, msg = submit_response_checker(json_response, ["status", "data.flag"], True) if not status: self.passengers = [] retry -= 1 Log.v("获取乘客信息失败, 重试中") continue else: self.passengers.extend(json_response["data"]["datas"]) p2_json_response = send_requests(LOGIN_SESSION, PASSENGER_URL_MAPPING, data={"pageIndex": 2, "pageSize": 10}) status, msg = submit_response_checker(p2_json_response, ["status", "data.flag"], True) if not status: self.passengers = [] retry -= 1 Log.v("获取乘客信息失败, 重试中") continue else: self.passengers.extend(p2_json_response["data"]["datas"]) break if not self.passengers: return False Log.v("获取乘客信息成功") return True
def _auto_submit_order_request(self): """ :return: status, msg """ data = OrderedDict() data["secretStr"] = self.decode_secret_str(self.train.secretStr.value) data["train_date"] = self.format_date(self.train.train_date.value) data["tour_flag"] = "dc" data["purpose_codes"] = find_by_name( "ticket", Config.basic_config.ticket_type).sys_code data["query_from_station_name"] = self.train.from_station.value.name data["query_to_station_name"] = self.train.to_station.value.name data["cancel_flag"] = 2 data["bed_level_order_num"] = "000000000000000000000000000000" data["passengerTicketStr"] = build_passenger_ticket_string( self.seat_type, self.passenger_data) data["oldPassengerStr"] = build_oldpassenger_ticket_string( self.passenger_data) json_response = send_requests(LOGIN_SESSION, self.URLS['autoSubmitOrderRequest'], data=data) status, msg = submit_response_checker(json_response, ["status", "data.submitStatus"], True) if status: self.ticket_passenger_info = dict( zip(["train_location", "key_check_isChange", "leftTicketStr"], [ unquote(v) for v in json_response["data"]["result"].split("#") ])) return status, msg
def run_query(self): params = { r'leftTicketDTO.train_date': self.travel_date, r'leftTicketDTO.from_station': CityData.find_city_by_name(self.from_station).code, r'leftTicketDTO.to_station': CityData.find_city_by_name(self.to_station).code, r'purpose_codes': find_by_name("ticket", Config.basic_config.ticket_type).sys_code } json_response = send_requests(LOGIN_SESSION, QUERY_URL_MAPPING, params=params) if not isinstance(json_response, dict): return [] try: if "data" in json_response and "result" in json_response['data']: return [ TrainDetail(v.split('|')) for v in json_response['data']['result'] ] or [] else: return [] except KeyError: return []
def _auto_submit_order_request(self): """ # response example. for debug. {'validateMessagesShowId': '_validatorMessage', 'status': True, 'httpstatus': 200, 'data': {'result': 'QX#F7F13745AA1C7631B9C6B204C3677E3E1B654BE1111F558326BFED9D#hcc983%2Bc27menDVKU5ja2C2Q1%2FbToZXgLI1l8950QBZxtWwE#1', 'ifShowPassCode': 'N', 'canChooseBeds': 'N', 'canChooseSeats': 'Y', 'choose_Seats': 'M9', 'isCanChooseMid': 'N', 'ifShowPassCodeTime': '2985', 'submitStatus': True, 'smokeStr': ''}, 'messages': [], 'validateMessages': {}} :return: """ data = OrderedDict() data["secretStr"] = self.decode_secret_str(self.train.secretStr.value) data["train_date"] = self.format_date(self.train.train_date.value) data["tour_flag"] = "dc" data["purpose_codes"] = find_by_name( "ticket", Config.basic_config.ticket_type).sys_code data["query_from_station_name"] = self.train.from_station.value.name data["query_to_station_name"] = self.train.to_station.value.name data["cancel_flag"] = 2 data["bed_level_order_num"] = "000000000000000000000000000000" data["passengerTicketStr"] = build_passenger_ticket_string( self.seat_type, self.passenger_data) data["oldPassengerStr"] = build_oldpassenger_ticket_string( self.passenger_data) json_response = send_requests(LOGIN_SESSION, self.URLS['autoSubmitOrderRequest'], data=data) status, msg = submit_response_checker(json_response, ["status", "data.submitStatus"], True) if status: self.ticket_passenger_info = dict( zip(["train_location", "key_check_isChange", "leftTicketStr"], [ unquote(v) for v in json_response["data"]["result"].split("#") ])) return status, msg
def login(self): if not LOGIN_SESSION.cookies.get("RAIL_EXPIRATION") or \ not LOGIN_SESSION.cookies.get("RAIL_DEVICEID"): status, msg = self._init() if not status: return status, msg # status, msg = self._get_device_fingerprint() # if not status: # Log.v("设备ID获取失败") # return status, msg # self._init2() captcha = Captcha("normal") status, msg = captcha.verify() if not status: Log.v("验证码校验失败") return status, msg payload = { 'username': Config.train_account.user, 'password': Config.train_account.pwd, 'appid': 'otn', 'answer': captcha.results } json_response = send_requests(LOGIN_SESSION, self.URLS['login'], data=payload) result, msg = json_status(json_response, [], '0') if not result: return (False, json_response.get("result_message", None)) \ if isinstance(json_response, dict) else (False, '登录接口提交返回数据出现问题') self._passportredirect() result, msg, apptk = self._uamtk() if not result: Log.v(msg) return False, msg status, msg = self._uamauthclient(apptk) return status, msg
def _get_device_fingerprint(self): if not hasattr(Config, "device_fingerprint"): query = dict(parse.parse_qsl(DEVICE_FINGERPRINT)) else: query = dict(parse.parse_qsl(Config.device_fingerprint)) query["timestamp"] = int(time.time() * 1000) data = send_requests(LOGIN_SESSION, DEVICE_FINGERPRINT_MAPPING, params=query) Log.d(data) if not data: return False, "获取设备ID请求失败" m = re.compile(r'callbackFunction\(\'(.*)\'\)') f = m.search(data) msg = "获取设备ID失败" if not f: Log.v(msg) return False, msg result = ast.literal_eval(f.group(1)) # update cookie LOGIN_SESSION.cookies.update( { "RAIL_EXPIRATION": result.get("exp"), "RAIL_DEVICEID": result.get("dfp") } ) Log.v("获取设备ID成功") return True, "OK"
def _get_queue_count_async(self): form_data = { 'train_date': datetime.datetime.strptime( self.train.train_date.value, '%Y%m%d').strftime('%b %a %d %Y 00:00:00 GMT+0800') + ' (中国标准时间)', 'train_no': self.train.sys_train_no.value, 'stationTrainCode': self.train.stationTrainCode.value, 'seatType': self.seat_type.sys_code, 'fromStationTelecode': self.train.from_station_code.value, 'toStationTelecode': self.train.to_station_code.value, 'leftTicket': self.ticket_passenger_info['leftTicketStr'], 'purpose_codes': find_by_name("ticket", Config.basic_config.ticket_type).sys_code, '_json_att': '' } json_response = send_requests(LOGIN_SESSION, self.URLS['getQueueCountAsync'], data=form_data) status, msg = submit_response_checker(json_response, ["status"], True) if not status: BlackTrains.add_train(self.train) return status, msg
def _get_queue_count(self): form_data = { 'train_date': datetime.datetime.strptime( self.ticket_passenger_info['queryLeftTicketRequestDTO']['train_date'], '%Y%m%d').strftime( '%b %a %d %Y 00:00:00 GMT+0800') + ' (中国标准时间)', 'train_no': self.ticket_passenger_info['queryLeftTicketRequestDTO']['train_no'], 'stationTrainCode': self.train.stationTrainCode.value, 'seatType': self.seat_type.sys_code, 'fromStationTelecode': self.train.from_station_code.value, 'toStationTelecode': self.train.to_station_code.value, 'leftTicket': self.ticket_passenger_info['leftTicketStr'], 'purpose_codes': self.ticket_passenger_info['purpose_codes'], 'train_location': self.ticket_passenger_info['train_location'], '_json_att': '', 'REPEAT_SUBMIT_TOKEN': self.token } Log.v("正在获取排队信息以及余票信息中...") json_response = send_requests(LOGIN_SESSION, self.URLS['getQueueCount'], data=form_data) status, msg = submit_response_checker(json_response, ["status"], True, "获取余票信息成功") if status: self.left_tickets = json_response['data']['ticket'] Log.v("票数剩余{0}张, 排队人数为{1}人".format( self.left_tickets, json_response['data']['count'] )) else: BlackTrains.add_train(self.train) return status, msg
def _confirm_single_for_queue_asys(self): form_data = OrderedDict() form_data['passengerTicketStr'] = build_passenger_ticket_string( self.seat_type, self.passenger_data) form_data['oldPassengerStr'] = build_oldpassenger_ticket_string( self.passenger_data) form_data['randCode'] = '' form_data['purpose_codes'] = find_by_name( "ticket", Config.basic_config.ticket_type).sys_code form_data['key_check_isChange'] = self.ticket_passenger_info[ 'key_check_isChange'] form_data['leftTicketStr'] = self.ticket_passenger_info[ 'leftTicketStr'] form_data['train_location'] = self.ticket_passenger_info[ 'train_location'] form_data['choose_seats'] = '' form_data['seatDetailType'] = '' form_data['_json_att'] = '' json_response = send_requests(LOGIN_SESSION, self.URLS['confirmSingleForQueueAsys'], data=form_data) status, msg = submit_response_checker(json_response, ["status", "data.submitStatus"], True) return status, msg
def _uamtk(self): json_data = send_requests(LOGIN_SESSION, self.URLS["uamtk"], data={'appid': 'otn'}) Log.d(json_data) result, msg = json_status(json_data, ["result_message", "newapptk"]) if not result: return result, msg, None else: return result, msg, json_data["newapptk"]
def checker(): data = { '_json_att': '' } json_response = send_requests(LOGIN_SESSION, USER_CHECK_URL_MAPPING, data=data) status, msg = submit_response_checker(json_response, ["status", "data.flag"], True, "用户在线状态检测: -----在线检测通过-----") return status, msg
def _check_order_status_queue(self): params = {'orderSequence_no': self.order_id, '_json_att': ''} json_response = send_requests(LOGIN_SESSION, self.URLS['resultOrderForQueue'], params=params) status, msg = submit_response_checker(json_response, ["status", "data.submitStatus"], True) return status, msg
def _uamauthclient(self, apptk): json_response = send_requests(LOGIN_SESSION, self.URLS['uamauthclient'], data={'tk': apptk}) status, msg = json_status(json_response, ["username", "result_message"]) if status: Log.v("欢迎 {0} 登录".format(json_response["username"])) return status, msg
def _check_order_status_queue(self): params = { 'orderSequence_no': self.order_id, '_json_att': '', 'REPEAT_SUBMIT_TOKEN': self.token, } Log.v("检查已提交的订单的状态中...") json_response = send_requests(LOGIN_SESSION, self.URLS['resultOrderForQueue'], params=params) status, msg = submit_response_checker(json_response, ["status", "data.submitStatus"], True, "订单已经成功提交") return status, msg
def query_no_complete_order(): data = {"_json_att": ''} json_response = send_requests(LOGIN_SESSION, ORDER_NO_COMPLETE_MAPPING, data=data) status, msg = submit_response_checker(json_response, ["status"], True) if status: try: return [NotCompleteOrderTicketsDetail(v) for v in json_response["data"]["orderDBList"][0]["tickets"]] except KeyError: return [] return []
def _query_order_wait_time(self): params = { 'random': '%10d' % (time.time() * 1000), 'tourFlag': 'dc', '_json_att': '' } json_response = send_requests(LOGIN_SESSION, self.URLS['queryOrderWaitTime'], params=params) status, msg = submit_response_checker(json_response, ["status"], True) if status: self.wait_time = json_response['data']['waitTime'] self.order_id = json_response['data']['orderId'] return status, msg
def _check_order_info(self): form_data = { 'cancel_flag': self.ticket_passenger_info['orderRequestDTO']['cancel_flag'] or '2', 'bed_level_order_num': self.ticket_passenger_info['orderRequestDTO']['bed_level_order_num'] \ or '000000000000000000000000000000', 'passengerTicketStr': build_passenger_ticket_string(self.seat_type, self.passenger_data), 'oldPassengerStr': build_oldpassenger_ticket_string(self.passenger_data), 'tour_flag': self.ticket_passenger_info['tour_flag'] or 'dc', 'randCode': '', 'whatsSelect': '1', '_json_att': '', 'REPEAT_SUBMIT_TOKEN': self.token, } Log.v("正在提交检查订单状态请求") json_response = send_requests(LOGIN_SESSION, self.URLS['checkOrderInfo'], data=form_data) status, msg = submit_response_checker(json_response, ["status", "data.submitStatus"], True, "校验订单成功") return status, msg
def check(self, results): params_data = {'answer': results, 'rand': 'sjrand', 'login_site': 'E'} while True: try: json_response = send_requests( LOGIN_SESSION, LOGIN_URL_MAPPING["normal"]["captchaCheck"], data=params_data) break except (ResponseCodeError, ResponseError): Log.v("提交验证码错误, 重新提交验证码验证") continue Log.v('验证码校验结果: %s' % json_response) status, msg = json_status(json_response, [], ok_code=self.success_code) if not status: Log.v("验证码识别失败") return status, msg
def check(self, results): form_data = { 'randCode': results, 'rand': 'sjrand', } json_response = send_requests( LOGIN_SESSION, LOGIN_URL_MAPPING["other"]["captchaCheck"], data=form_data) Log.v('other login captcha verify: %s' % json_response) def verify(response): return response['status'] and self.success_code == response[ 'data']['result'] v = verify(json_response) return v, "Error" if not v else v
def _get_submit_token(self): html = send_requests(LOGIN_SESSION, self.URLS['getExtraInfo']) Log.v("获取token中....") result = re.findall(r"var globalRepeatSubmitToken = '(.*)'", html) ticket_passenger_info = re.findall(r'var ticketInfoForPassengerForm=(.*);', html) if result: self.token = result[0] if ticket_passenger_info: try: self.ticket_passenger_info = json.loads(ticket_passenger_info[0].replace("'", "\"")) except TypeError: Log.w("获取submit info失败") return False if self.token and self.ticket_passenger_info: Log.v("成功获取token与以及车次信息") return True else: return False
def _confirm_single_or_go_for_queue(self): form_data = { 'passengerTicketStr': build_passenger_ticket_string(self.seat_type, self.passenger_data), 'oldPassengerStr': build_oldpassenger_ticket_string(self.passenger_data), 'randCode': '', 'purpose_codes': self.ticket_passenger_info['purpose_codes'], 'key_check_isChange': self.ticket_passenger_info['key_check_isChange'], 'leftTicketStr': self.ticket_passenger_info['leftTicketStr'], 'train_location': self.ticket_passenger_info['train_location'], 'choose_seats': '', # 暂时未加选座 'seatDetailType': '000', 'whatsSelect': '1', 'roomType': '00', 'dwAll': 'N', '_json_att': '', 'REPEAT_SUBMIT_TOKEN': self.token, } Log.v("正在为你请求排队提交订单") json_response = send_requests(LOGIN_SESSION, self.URLS['confirmForQueue'], data=form_data) status, msg = submit_response_checker(json_response, ["status", "data.submitStatus"], True, "请求排队成功") if not status: BlackTrains.add_train(self.train) return status, msg
def _query_order_wait_time(self): params = { 'random': '%10d' % (time.time() * 1000), 'tourFlag': self.ticket_passenger_info['tour_flag'] or 'dc', '_json_att': '', 'REPEAT_SUBMIT_TOKEN': self.token } Log.v("获取订单排队信息...") json_response = send_requests(LOGIN_SESSION, self.URLS['queryOrderWaitTime'], params=params) status, msg = submit_response_checker(json_response, ["status"], True, "排队请求成功") if status: self.wait_time = json_response['data']['waitTime'] self.order_id = json_response['data']['orderId'] people_count = json_response["data"]["waitCount"] msg += " 排队等待时间预计还剩 {0} ms, 排队人数还剩 {1} 人".format( self.wait_time, people_count) if not self.order_id: msg += "\t 订单暂未生成" if "msg" in json_response["data"]: msg += "\t {0}".format(json_response["data"]["msg"]) return status, msg
def login(self): self._init() captcha = Captcha("normal") status, msg = captcha.verify() if not status: Log.v("验证码校验失败") return status, msg payload = { 'username': Config.train_account.user, 'password': Config.train_account.pwd, 'appid': 'otn', 'answer': captcha.results } json_response = send_requests(LOGIN_SESSION, self.URLS['login'], data=payload) result, msg = json_status(json_response, [], '0') if not result: return False, json_response.get("result_message", None) self._passportredirect() result, msg, apptk = self._uamtk() if not result: Log.v(msg) return False, msg status, msg = self._uamauthclient(apptk) return status, msg
def _submit_order_request(self): """ :return: """ form_data = { 'secretStr': self.decode_secret_str(self.train.secretStr.value), 'train_date': self.format_date(self.train.train_date.value), # 车票时间 'back_train_date': time.strftime("%Y-%m-%d", time.localtime()), # query date:2017-12-31 'tour_flag': 'dc', 'purpose_codes': find_by_name("ticket", Config.basic_config.ticket_type).sys_code, 'query_from_station_name': self.train.from_station.value.name, 'query_to_station_name': self.train.to_station.value.name, 'undefined': '', } Log.v("请求预提交订单") json_response = send_requests(LOGIN_SESSION, self.URLS['submitOrderRequest'], data=form_data) status, msg = submit_response_checker(json_response, ["status"], True, "请求预提交订单成功") if "messages" in json_response: print(json_response["messages"]) print(''.join(json_response["messages"])) if "messages" in json_response and ORDER_NOT_FINISHED_MESSAGE['msg'] in ''.join(json_response["messages"]): self.unfinished_order = True return status, msg
def _init(self): send_requests(LOGIN_SESSION, self.URLS["init"])
def _passportredirect(self): send_requests(LOGIN_SESSION, self.URLS["userLoginRedirect"])