def _loginNormal(self, userName, userPwd, autoCheck=2): if autoCheck == CAPTCHA_CHECK_METHOD_THREE: results, verify = Captcha().verifyCodeAuto() elif autoCheck == CAPTCHA_CHECK_METHOD_HAND: results, verify = Captcha().verifyCaptchaByHand() else: results, verify = Captcha().verifyCodeAutoByMyself() if not verify: return False, '验证码识别错误!' Log.v('验证码识别成功') payload = OrderedDict() payload['username'] = userName payload['password'] = userPwd payload['appid'] = 'otn' payload['answer'] = results response = EasyHttp.post_custom(self._urlInfo['login'], data=payload) def isLoginSuccess(responseJson): return 0 == responseJson['result_code'] if responseJson and 'result_code' in responseJson else False, \ responseJson[ 'result_message'] if responseJson and 'result_message' in responseJson else '登录失败' if response.status_code != requests.codes.ok: return False, "登录请求被强制重定向,准备重试..." result, msg = isLoginSuccess(response.json()) if not result : return False, msg self._userLogin() self._passportRedirect() result, msg, apptk = self._uamtk() if not Utils.check(result, msg): return False, 'uamtk failed' return self._uamauthclient(apptk)
def querySpec(flag, base_url, trainDate, fromStation, toStation, passengerType=PASSENGER_TYPE_ADULT, trainsNo=[], seatTypes=[SEAT_TYPE[key] for key in SEAT_TYPE], PASSENGERS_ID=[], POLICY_BILL=1): for ticket in Query.query(flag, base_url, trainDate, fromStation, toStation, passengerType): # filter trainNo if not TrainUtils.filterTrain(ticket, trainsNo): continue # filter seat for seatTypeName, seatTypeProperty in TrainUtils.seatWhich( seatTypes, ticket): if seatTypeProperty and seatTypeProperty != '无': Log.v('%s %s: %s' % (ticket.trainNo, seatTypeName, seatTypeProperty)) try: remind_num = int(seatTypeProperty) except Exception as e: remind_num = 100 if POLICY_BILL == POLICY_BILL_ALL and len( PASSENGERS_ID) > remind_num: break ticket.seatType = SEAT_TYPE[seatTypeName] ticket.remindNum = remind_num yield ticket return []
def showSubmitInfoPretty(self): status, msg, jsonTicketInfo = self._queryMyOrderNoComplete() if not Utils.check(status, msg): return False from prettytable import PrettyTable table = PrettyTable() table.field_names = '序号 车次信息 席位信息 旅客信息 票款金额 车票状态'.split(sep=' ') totalTicketNum = TrainUtils.submitTicketTotalNum(jsonTicketInfo) rows = [] for i in range(totalTicketNum): row = [ i + 1, TrainUtils.submitTrainInfo(i, jsonTicketInfo), TrainUtils.submitCoachInfo(i, jsonTicketInfo), TrainUtils.submitPassengerInfo(i, jsonTicketInfo), TrainUtils.submitTicketCostInfo(i, jsonTicketInfo), TrainUtils.submitTicketPayInfo(i, jsonTicketInfo), ] rows.append(row) for row in rows: table.add_row(row) print(table) EmailUtils.send(EmailUtils.buildHTML(rows), 'html') Log.v('总张数:%d\t待支付金额:%s' % (totalTicketNum, Fore.YELLOW + '{}元'.format( TrainUtils.submitTicketTotalCost(jsonTicketInfo)) + Fore.RESET)) return True
def validUsefulProxy(params): """ 检验代理是否可用 """ marks = params.split('&&') if isinstance(marks[1], bytes): marks[1] = marks[1].decode('utf8') if 'HTTP' == marks[2]: proxies = {"http": "http://{proxy}".format(proxy=marks[1])} else: proxies = {"https": "https://{proxy}".format(proxy=marks[1])} flag = None try: # 超过3秒的代理就不要了 r = requests.get('http://httpbin.org/ip', proxies=proxies, timeout=3, verify=False) if r.status_code == 200 and r.json().get("origin"): # print('请求IP:'+r.json().get("origin")+', 代理为:'+json.dumps(proxies)) Log.v('有效代理:' + marks[1]) flag = True except Exception as e: flag = False if not flag: sqlite = Sqlite(address + 'ip.db') sqlite.update_data('delete from ip_house where id = {}'.format( marks[0])) Log.d("无效代理:" + marks[1])
def verifyCodeAutoByMyself(self, type=TYPE_LOGIN_NORMAL_WAY): try: urlInfo = loginUrls['other'][ 'captcha'] if type == TYPE_LOGIN_OTHER_WAY else loginUrls[ 'normal']['captcha'] Log.v('正在获取验证码..') response = EasyHttp.send(urlInfo) address = os.path.dirname( os.path.dirname( os.path.realpath(__file__))) + '/image_captcha/' byte_stream = BytesIO(response) roiImg = Image.open(byte_stream) # Image打开二进制流Byte字节流数据 imgByteArr = BytesIO() # 创建一个空的Bytes对象 roiImg.save(imgByteArr, format='PNG') # PNG就是图片格式,我试过换成JPG/jpg都不行 imgByteArr = imgByteArr.getvalue() # 这个就是保存的二进制流 file_name = '1.jpg' file_path = address + file_name # 下面这一步只是本地测试, 可以直接把imgByteArr,当成参数上传到七牛云 with open(file_path, "wb") as f: f.write(imgByteArr) from train.image_captcha import cut_image results = cut_image.cut_image(address, file_name) results = self.__indexTransCaptchaResults(results) except Exception as e: Log.w(e) return None, False return results, self._captchaAutoCheck(results)
def showSubmitInfoPretty(self): status, msg, jsonTicketInfo = self._queryMyOrderNoComplete() if not Utils.check(status, msg): return False from prettytable import PrettyTable table = PrettyTable() table.field_names = '序号 车次信息 席位信息 旅客信息 票款金额 车票状态'.split(sep=' ') totalTicketNum = TrainUtils.submitTicketTotalNum(jsonTicketInfo) for i in range(totalTicketNum): table.add_row([ i + 1, TrainUtils.submitTrainInfo(i, jsonTicketInfo), TrainUtils.submitCoachInfo(i, jsonTicketInfo), TrainUtils.submitPassengerInfo(i, jsonTicketInfo), TrainUtils.submitTicketCostInfo(i, jsonTicketInfo), TrainUtils.submitTicketPayInfo(i, jsonTicketInfo), ]) if not i == totalTicketNum - 1: table.add_row( [2 * '-', 2 * '-', 2 * '-', 2 * '-', 2 * '-', 2 * '-']) print(table) Log.v('总张数:%d\t待支付金额:%s' % (totalTicketNum, Fore.YELLOW + '{}元'.format( TrainUtils.submitTicketTotalCost(jsonTicketInfo)) + Fore.RESET)) return True
def _loginAsyncSuggest(self, userName, userPwd, autoCheck=2): self._init() if autoCheck == CAPTCHA_CHECK_METHOD_THREE: results, verify = Captcha().verifyCodeAuto() elif autoCheck == CAPTCHA_CHECK_METHOD_HAND: results, verify = Captcha().verifyCaptchaByHand() else: results, verify = Captcha().verifyCodeAutoByMyself() if not verify: return False, '验证码识别错误!' Log.v('验证码识别成功') formData = OrderedDict() formData['loginUserDTO.user_name'] = userName formData['userDTO.password'] = userPwd formData['randCode'] = results jsonRet = EasyHttp.send(self._urlInfo['login'], data=formData) # print('loginAsyncSuggest: %s' % jsonRet) def isSuccess(response): return response['status'] and response['data'].get('loginCheck') == 'Y' if 'data' in response else False, \ response['data'].get('otherMsg') if 'data' in response else response['messages'] loginSuccess, otherMsg = isSuccess(jsonRet) return loginSuccess, '%s:%s' % (userName, '登录成功' if loginSuccess else '登录失败')
def loopQuery(trainDate, fromStation, toStation, passengerType=PASSENGER_TYPE_ADULT, trainsNo=[], seatTypes=[SEAT_TYPE[key] for key in SEAT_TYPE], PASSENGERS_ID=[], leave_period=[], POLICY_BILL=1, timeInterval=QUERY_TICKET_REFERSH_INTERVAL): count = 0 base_query_url = queryUrls['query']['url'] while True: nowTime, status = deadline.do_fix_time() if status: Log.v('当前时间:%s 处于23点到6点之间,12306处于维护状态,暂不处理下单业务' % nowTime) continue count += 1 Log.v('正在为您第%d次刷票' % count + ',当前时间为:%s' % datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) for ticketDetails in Query.querySpec(count, base_query_url, trainDate, fromStation, toStation, passengerType, trainsNo, seatTypes, PASSENGERS_ID, leave_period, POLICY_BILL): if ticketDetails: return ticketDetails time.sleep(timeInterval)
def submit(self, choose_seat): self._check_user(self.__ticket.tourFlag) status, msg = self._submitOrderRequest(self.__ticket.tourFlag) if not Utils.check(status, 'submitOrderRequesst: %s' % msg): return False Log.v('提交订单请求成功!') status, msg, passengersDetailsList = self._getPassengerDTOs() if not Utils.check(status, 'getPassengerDTOs: %s' % msg): return False Log.v('获取乘客信息成功!') passengersDetails = [] if len(self.__ticket.passengersId) >= self.__ticket.remindNum: for i in range(self.__ticket.remindNum): id = self.__ticket.passengersId[i] ticket_details = passengersDetailsList.get(id[-3:]) ticket_details.passengerIdNo = id passengersDetails.append(ticket_details) else: for id in self.__ticket.passengersId: ticket_details = passengersDetailsList.get(id[-3:]) ticket_details.passengerIdNo = id passengersDetails.append(ticket_details) # time.sleep(0.2) status, msg, submitStatus, errMsg = self._checkOrderInfo( passengersDetails, self.__ticket.seatType, self.__ticket.ticketTypeCodes) if not Utils.check(status, 'checkOrderInfo: %s' % msg) or not Utils.check( submitStatus, 'checkOrderInfo: %s' % errMsg): return False Log.v('校验订单信息成功!') status, msg, leftTickets, personsCount = self._getQueueCount() if not Utils.check(status, 'getQueueCount: %s' % msg): return False Log.v('%s 剩余车票:%s ,目前排队人数: %s' % (self.__ticket.trainNo, leftTickets, personsCount)) status, msg, submitStatus, errMsg = self._confirmSingleOrGoForQueue( passengersDetails, choose_seat) if not Utils.check(status, 'confirmSingleOrGoForQueue: %s' % msg) \ or not Utils.check(submitStatus, 'confirmSingleOrGoForQueue: %s' % errMsg or '订单信息提交失败!'): return False orderId = self.__waitForOrderId() if not Utils.check(orderId, '订单获取失败!'): return False status, msg, submitStatus = self._resultOrderForDcOrWcQueue(orderId) if not Utils.check(status, 'resultOrderForDcOrWcQueue: %s' % msg): return False if not submitStatus: Log.e('订单提交失败!') return False Log.v('您已成功订购火车票!请在30分钟内前往12306官方网站进行支付!') return True
def querySpec(trainDate, fromStation, toStation, passengerType=PASSENGER_TYPE_ADULT, seatTypes=[SEAT_TYPE[key] for key in SEAT_TYPE]): for ticket in Query.query(trainDate, fromStation, toStation, passengerType): for seatTypeName, seatTypeProperty in TrainUtils.seatWhich(seatTypes, ticket): if seatTypeProperty and seatTypeProperty != '无': Log.v('%s: %s' % (seatTypeName, seatTypeProperty)) ticket.seatType = SEAT_TYPE[seatTypeName] yield ticket return []
def do_login(): EasyHttp.removeCookies() login = Login() Log.v('正在登录...') result, msg = login.login(USER_NAME, USER_PWD, SELECT_AUTO_CHECK_CAPTHCA) EasyHttp.save_cookies(COOKIE_SAVE_ADDRESS) if not Utils.check(result, msg): return False,login Log.v('%s,登录成功' % msg) return True,login
def loopQuery(trainDate, fromStation, toStation, passengerType=PASSENGER_TYPE_ADULT, seatTypes=[SEAT_TYPE[key] for key in SEAT_TYPE],timeInterval=QUERY_TICKET_REFERSH_INTERVAL): count = 0 while True: count += 1 Log.v('正在为您刷票: %d 次' % count) for ticketDetails in Query.querySpec(trainDate, fromStation, toStation, passengerType, seatTypes): if ticketDetails: return ticketDetails time.sleep(timeInterval)
def do_login(): login = Login() Log.v('正在登录...') result,msg = login.login(USER_NAME,USER_PWD) eHttp.save_cookies(COOKIE_SAVE_ADDRESS) if not check(result, msg): Log.e(msg) return False,login Log.v('%s,登录成功' % msg) return True,login
def wrapper(*args, **kw): reslut = False msg = '' for count in range(10): Log.v('第%s次尝试获取验证图片' % str(count + 1)) reslut, msg = func(*args, **kw) if reslut: break Log.w(msg) return reslut, msg
def _captchaCheck(self, results): data = { 'answer': results, 'login_site': 'E', 'rand': 'sjrand', } result = EasyHttp.send(loginUrls['normal']['captchaCheck'], data=data) Log.v('验证码校验结果:%s' % result.get('result_message')) return result.get('result_code') == '4'
def getCaptcha(self): Log.v('正在获取验证码...') urlInfo = loginUrls['normal']['loginCaptchaCode'] response = EasyHttp.send(urlInfo) if response and response['result_code'] != '0': Log.v('获取验证码失败') return None img_base64 = base64.b64decode(response['image']) return img_base64
def verifyCaptchaByClound(self, type=TYPE_LOGIN_NORMAL_WAY): captchaContent = self.getCaptcha(type) if captchaContent: FileUtils.saveBinary(Captcha.__CAPTCHA_PATH, captchaContent) else: Log.e('failed to save captcha') return None results = damatuWeb.verify(Captcha.__CAPTCHA_PATH) results = self.__cloundTransCaptchaResults(results) Log.v('captchaResult: %s' % results) return results, self.check(results)
def girl_of_the_night(love): Log.v('启动***休眠监控***线程') while 1: if love.get_my_love(): break if love.get_login_status(): status = check_re_login() if status: EasyHttp.save_cookies(COOKIE_SAVE_ADDRESS) time.sleep(HEART_BEAT_PER_REQUEST_TIME) Log.v('****** 12306 终止 ******')
def verifyCaptchaByHand(self, type=TYPE_LOGIN_NORMAL_WAY): img = Image.open(BytesIO(self.getCaptcha(type))) img.show() Log.v(""" ----------------- | 0 | 1 | 2 | 3 | ----------------- | 4 | 5 | 6 | 7 | ----------------- """) results = input("输入验证码索引(见上图,以','分割): ") img.close() results = self.__indexTransCaptchaResults(results) Log.v('captchaResult: %s' % results) return results, self.check(results, type)
def submit(self): status, msg = self._submitOrderRequest(self.__ticket.tourFlag) if not Utils.check(status, "submitOrderRequesst: %s" % msg): return False Log.v("提交订单请求成功!") status, msg, passengersDetailsList = self._getPassengerDTOs() if not Utils.check(status, "getPassengerDTOs: %s" % msg): return False Log.v("获取乘客信息成功!") passengersDetails = [] for id in self.__ticket.passengersId: passengersDetails.append(passengersDetailsList.get(id)) time.sleep(1) status, msg, submitStatus, errMsg = self._checkOrderInfo( passengersDetails, self.__ticket.seatType, self.__ticket.ticketTypeCodes) if not Utils.check(status, "checkOrderInfo: %s" % msg) or not Utils.check( submitStatus, "checkOrderInfo: %s" % errMsg): return False Log.v("校验订单信息成功!") status, msg, leftTickets, personsCount = self._getQueueCount() if not Utils.check(status, "getQueueCount: %s" % msg): return False Log.v("%s 剩余车票:%s ,目前排队人数: %s" % (self.__ticket.trainNo, leftTickets, personsCount)) status, msg, submitStatus, errMsg = self._confirmSingleOrGoForQueue( passengersDetails) if not Utils.check(status, "confirmSingleOrGoForQueue: %s" % msg) or not Utils.check( submitStatus, "confirmSingleOrGoForQueue: %s" % errMsg or "订单信息提交失败!"): return False orderId = self.__waitForOrderId() if not Utils.check(orderId, "订单获取失败!"): return False status, msg, submitStatus = self._resultOrderForDcOrWcQueue(orderId) if not Utils.check(status, "resultOrderForDcOrWcQueue: %s" % msg): return False if not submitStatus: Log.e("订单提交失败!") return False Log.v("您已成功订购火车票!请在30分钟内前往12306官方网站进行支付!") return True
def init_ip_pool(): import os from utils.sqllite_handle import Sqlite address = os.path.dirname(os.path.dirname( os.path.realpath(__file__))) + '/' sqlite = Sqlite(address + 'ip.db') ips_results = sqlite.query_data('select proxy_adress,type from ip_house') Log.v('有效ip代理数量:' + str(len(ips_results))) for ip in ips_results: ips.append([ip[0], ip[1]]) # init_ip_pool()
def girl_of_the_night(love): Log.v('启动***休眠监控***线程') count = 0 while 1: if love.get_my_love(): break now = datetime.datetime.now() nowHour = now.hour if nowHour >= 23 or nowHour < 6: if count % HEART_BEAT_PER_REQUEST_TIME == 0: check_re_login() time.sleep(HEART_BEAT_PER_REQUEST_TIME >> 1) count += 1 continue # Log.e('非23点-6点,休眠%s秒'%(HEART_BEAT_PER_REQUEST_TIME << 1)) time.sleep(HEART_BEAT_PER_REQUEST_TIME << 1)
def loopQuery(session, trainDate, fromStation, toStation, passengerType=PASSENGER_TYPE_ADULT, seatTypes=[SEAT_TYPE[key] for key in SEAT_TYPE]): count = 0 while True: count += 1 Log.v('正在为您刷票: %d 次' % count) for ticketDetails in Query.querySpec(session, trainDate, fromStation, toStation, passengerType, seatTypes): if ticketDetails: return ticketDetails time.sleep(5)
def submit(self): status, msg = self._submitOrderRequest(self.__ticket.tourFlag) if not Utils.check(status, 'submitOrderRequesst: %s' % msg): return Log.v('提交订单请求成功!') status, msg, passengersDetailsList = self._getPassengerDTOs() if not Utils.check(status, 'getPassengerDTOs: %s' % msg): return Log.v('获取乘客信息成功!') passengersDetails = [] for id in self.__ticket.passengersId: passengersDetails.append(passengersDetailsList.get(id)) status, msg, submitStatus, errMsg = self._checkOrderInfo( passengersDetails, self.__ticket.seatType, self.__ticket.ticketTypeCodes) if not Utils.check(status, 'checkOrderInfo: %s' % msg) or not Utils.check( submitStatus, 'checkOrderInfo: %s' % errMsg): return Log.v('校验订单信息成功!') status, msg, leftTickets, personsCount = self._getQueueCount() if not Utils.check(status, 'getQueueCount: %s' % msg): return Log.v('%s 剩余车票:%s ,目前排队人数: %s' % (self.__ticket.trainNo, leftTickets, personsCount)) status, msg, submitStatus, errMsg = self._confirmSingleOrGoForQueue( passengersDetails) if not Utils.check(status, 'confirmSingleOrGoForQueue: %s' % msg) \ or not Utils.check(submitStatus, 'confirmSingleOrGoForQueue: %s' % errMsg or '订单信息提交失败!'): return orderId = self.__waitForOrderId() if not Utils.check(orderId, '订单获取失败!'): return status, msg, submitStatus = self._resultOrderForDcOrWcQueue(orderId) if not Utils.check(status, 'resultOrderForDcOrWcQueue: %s' % msg): return if not submitStatus: Log.e('订单提交失败!') return Log.v('您已成功订购火车票!请在30分钟内前往12306官方网站进行支付!')
def querySpec(flag, base_url, trainDate, fromStation, toStation, passengerType=PASSENGER_TYPE_ADULT, trainsNo=[], seatTypes=[SEAT_TYPE[key] for key in SEAT_TYPE], PASSENGERS_ID=[], leave_period=[], POLICY_BILL=1): for custom_date in trainDate: for ticket in Query.query(flag, base_url, custom_date, fromStation, toStation, passengerType): if '售' in ticket.mark: continue # filter trainNo if not TrainUtils.filterTrain(ticket, trainsNo): continue # filter leave time try: if leave_period and (ticket.leaveTime < leave_period[0] or ticket.leaveTime > leave_period[1]): continue except Exception as e: pass # filter seat for seatTypeName, seatTypeProperty in TrainUtils.seatWhich( seatTypes, ticket): if seatTypeProperty and seatTypeProperty != '无': Log.v('%s %s %s: %s' % (custom_date, ticket.trainNo, seatTypeName, seatTypeProperty)) try: remind_num = int(seatTypeProperty) except Exception as e: remind_num = 100 if POLICY_BILL == POLICY_BILL_ALL and len( PASSENGERS_ID) > remind_num: break ticket.seatType = SEAT_TYPE[seatTypeName] ticket.remindNum = remind_num ticket.custom_date = custom_date yield ticket return []
def girl_of_the_night(love): Log.v('启动***休眠监控***线程') count = 0 while 1: if love.get_my_love(): break now = datetime.datetime.now() nowHour = now.hour if nowHour >= 23 or nowHour < 6: if count % HEART_BEAT_PER_REQUEST_TIME == 0: status = check_re_login() if status: EasyHttp.save_cookies(COOKIE_SAVE_ADDRESS) time.sleep(HEART_BEAT_PER_REQUEST_TIME >> 1) count +=1 continue # Log.e('非23点-6点,休眠%s秒'%(HEART_BEAT_PER_REQUEST_TIME << 1)) time.sleep(HEART_BEAT_PER_REQUEST_TIME << 1)
def verifyCaptchaByAuto(self, type=TYPE_LOGIN_NORMAL_WAY): img = None results = '' try: img = Image.open(BytesIO(self.getCaptcha(type))) img.save("capthca.jpg") capthca = cv2.imread("capthca.jpg") results = preditResult(capthca, 'E:/tool/12306/12306/train/easylearn') except BaseException as e: print(e.args) return None, False finally: if img is not None: img.close() results = self.__indexTransCaptchaResults(results) Log.v('验证码坐标: %s' % results) return results, self.check(results, type)
def _loginNormal(self, userName, userPwd): self._urlInfo = loginUrls['normal'] status, msg = self._login_init() #登录前获取浏览器指纹 if not status: return status, msg results, verify = Captcha().verifyCaptchaByHand() #登录第一步验证码识别 if not verify: return False, '验证码识别错误!' Log.v('验证码识别成功') payload = OrderedDict() #登录第二步验证用户账号和密码 payload['username'] = userName payload['password'] = userPwd payload['appid'] = 'otn' payload['answer'] = results response = eHttp.post_custom(self._urlInfo['login'], data=payload) result, msg, apptk = self._uamtk() #登录第三步获取uamtk作为下一次请求参数 if not check(result, msg): return False, 'uamtk failed' return self._uamauthclient(apptk) #登录最后一步验证客户端
def _loginNormal(self, userName, userPwd, autoCheck=2, type=TYPE_LOGIN_NORMAL_WAY): status, msg = self._login_init() if not status: return status, msg self._uamtk_static() if autoCheck == CAPTCHA_CHECK_METHOD_THREE: results, verify = Captcha().verifyCodeAuto() elif autoCheck == CAPTCHA_CHECK_METHOD_HAND: results, verify = Captcha().verifyCaptchaByHand(type=type) elif autoCheck == CAPTCHA_CHECK_METHOD_AUTO: results, verify = Captcha().verifyCaptchaByAuto(type=type) else: results, verify = Captcha().verifyCodeAutoByMyself(type=type) if not verify: return False, '验证码识别错误!' Log.v('验证码识别成功') payload = OrderedDict() payload['username'] = userName payload['password'] = userPwd payload['appid'] = 'otn' payload['answer'] = results response = EasyHttp.post_custom(self._urlInfo['login'], data=payload) def isLoginSuccess(responseJson): return 0 == responseJson['result_code'] if responseJson and 'result_code' in responseJson else False, \ responseJson[ 'result_message'] if responseJson and 'result_message' in responseJson else '登录失败' result, msg = isLoginSuccess(response.json()) if not result: return False, msg self._userLogin() self._passportRedirect() result, msg, apptk = self._uamtk() if not Utils.check(result, msg): return False, 'uamtk failed' return self._uamauthclient(apptk)
def showSubmitInfoPretty(self): status, msg, jsonTicketInfo = self._queryMyOrderNoComplete() if not Utils.check(status, msg if msg else '获取车票详情信息异常,详情请前往12306官网查看'): return status, msg from prettytable import PrettyTable table = PrettyTable() try: table.field_names = '序号 车次信息 席位信息 旅客信息 票款金额 车票状态'.split(sep=' ') totalTicketNum = TrainUtils.submitTicketTotalNum(jsonTicketInfo) results = [] for i in range(totalTicketNum): table.add_row([ i + 1, TrainUtils.submitTrainInfo(i, jsonTicketInfo), TrainUtils.submitCoachInfo(i, jsonTicketInfo), TrainUtils.submitPassengerInfo(i, jsonTicketInfo), TrainUtils.submitTicketCostInfo(i, jsonTicketInfo), TrainUtils.submitTicketPayInfo(i, jsonTicketInfo), ]) results.append([ i + 1, TrainUtils.submitTrainInfo(i, jsonTicketInfo), TrainUtils.submitCoachInfo(i, jsonTicketInfo), TrainUtils.submitPassengerInfo(i, jsonTicketInfo), TrainUtils.submitTicketCostInfo(i, jsonTicketInfo), TrainUtils.submitTicketPayInfo(i, jsonTicketInfo), ]) if not i == totalTicketNum - 1: table.add_row( [2 * '-', 2 * '-', 2 * '-', 2 * '-', 2 * '-', 2 * '-']) print(table) Log.v('总张数:%d\t待支付金额:%s' % (totalTicketNum, Fore.YELLOW + '{}元'.format( TrainUtils.submitTicketTotalCost(jsonTicketInfo)) + Fore.RESET)) except BaseException as e: return False, None return True, results