Example #1
0
 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
Example #2
0
 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
Example #3
0
 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
Example #4
0
 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)
     return submit_response_checker(json_response, ["status"], True,
                                    "请求预提交订单成功")
Example #5
0
 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
Example #6
0
 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
Example #7
0
 def _get_passenger_data(self):
     if PassengerData.passenger:
         self.passenger_data = PassengerData.find_people_by_names(
             Config.basic_config.ticket_people_list)
         # get token from html file.
         while True:
             if self.token and self.ticket_passenger_info:
                 break
             else:
                 self._get_submit_token()
         return True, "使用缓存的乘客信息导入成功"
     # 获取乘客信息并保存
     while not self.passenger_data:
         form_data = {'_json_att': '', 'REPEAT_SUBMIT_TOKEN': self.token}
         json_response = send_requests(LOGIN_SESSION,
                                       self.URLS['getPassengerDTOs'],
                                       data=form_data)
         status, msg = submit_response_checker(json_response, ["status"],
                                               True)
         if status:
             # write data to passenger data.
             PassengerData.raw_data = json_response['data'][
                 'normal_passengers']
             PassengerData.get_final_data()
             self.passenger_data = PassengerData.find_people_by_names(
                 Config.basic_config.ticket_people_list)
             while True:
                 if self.token and self.ticket_passenger_info:
                     break
                 else:
                     self._get_submit_token()
             return True, "OK"
         else:
             return False, "获取乘客信息失败"
Example #8
0
 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, msg
     self._passportredirect()
     result, msg, apptk = self._uamtk()
     if not result:
         Log.v(msg)
         return False, msg
     status, msg = self._uamauthclient(apptk)
     return status, msg
Example #9
0
 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
Example #10
0
 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"]
Example #11
0
 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
Example #12
0
 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 []
Example #13
0
 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
Example #14
0
 def run_query(self):
     params = {
         r'leftTicketDTO.train_date': self.travel_date,
         r'leftTicketDTO.from_station': CityData.find_city_by_name(Config.basic_config.from_station).code,
         r'leftTicketDTO.to_station': CityData.find_city_by_name(Config.basic_config.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, (list, dict)):
         return []
     return [TrainDetail(v.split('|')) for v in json_response['data']['result']] or []
Example #15
0
 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
Example #16
0
 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
Example #17
0
    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, "ok"
Example #18
0
 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
Example #19
0
 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
Example #20
0
 def _get_passenger_data(self):
     if PassengerData.passenger:
         self.passenger_data = PassengerData.find_people_by_names(
             Config.basic_config.ticket_people_list)
         return True, "使用缓存的乘客信息导入成功"
     # 获取乘客信息并保存
     while not self.passenger_data:
         json_response = send_requests(LOGIN_SESSION,
                                       self.URLS['getPassengerDTOs'])
         status, msg = submit_response_checker(json_response, ["status"],
                                               True)
         if status:
             # write data to passenger data.
             PassengerData.raw_data = json_response['data'][
                 'normal_passengers']
             PassengerData.get_final_data()
             self.passenger_data = PassengerData.find_people_by_names(
                 Config.basic_config.ticket_people_list)
             return True, "OK"
         else:
             return False, "获取乘客信息失败"
Example #21
0
 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, "请求排队成功")
     return status, msg
Example #22
0
 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
Example #23
0
 def _uamauthclient(self, apptk):
     json_response = send_requests(LOGIN_SESSION,
                                   self.URLS['uamauthclient'],
                                   data={'tk': apptk})
     return json_status(json_response, ["username", "result_message"])
Example #24
0
 def _passportredirect(self):
     send_requests(LOGIN_SESSION, self.URLS["userLoginRedirect"])
Example #25
0
 def _init(self):
     send_requests(LOGIN_SESSION, self.URLS["init"])