From 947c33cd6bf70cfb331e53404a29e41bd2c19d1d Mon Sep 17 00:00:00 2001 From: wenxianping <931128603@qq.com> Date: Thu, 11 Jan 2018 11:06:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=92=E9=98=9F=E8=AE=A2=E5=8D=95sleep?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9=20=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E8=81=94=E7=B3=BB=E4=BA=BA=E4=B8=8D=E5=9C=A8=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E7=BB=99=E5=87=BA=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- init/select_ticket_info.py | 85 ++++++++++++++++++++++++++++--------- tkcode | Bin 12150 -> 13736 bytes 2 files changed, 66 insertions(+), 19 deletions(-) diff --git a/init/select_ticket_info.py b/init/select_ticket_info.py index cfe1ffd..da6aa15 100644 --- a/init/select_ticket_info.py +++ b/init/select_ticket_info.py @@ -3,6 +3,7 @@ import json import datetime import random import re +import threading import urllib import sys import time @@ -326,25 +327,28 @@ class select: """ passengerTicketStrList = [] oldPassengerStr = [] - if len(self.user_info) is 1: - passengerTicketStrList.append( - '0,' + self.user_info[0]['passenger_id_type_code'] + "," + self.user_info[0][ - "passenger_name"] + "," + - self.user_info[0]['passenger_type'] + "," + self.user_info[0]['passenger_id_no'] + "," + - self.user_info[0]['mobile_no'] + ',N') - oldPassengerStr.append( - self.user_info[0]['passenger_name'] + "," + self.user_info[0]['passenger_type'] + "," + - self.user_info[0]['passenger_id_no'] + "," + self.user_info[0]['passenger_type'] + '_') - else: - for i in range(len(self.user_info)): + try: + if len(self.user_info) is 1: passengerTicketStrList.append( - '0,' + self.user_info[i]['passenger_id_type_code'] + "," + self.user_info[i][ - "passenger_name"] + "," + self.user_info[i]['passenger_type'] + "," + self.user_info[i][ - 'passenger_id_no'] + "," + self.user_info[i]['mobile_no'] + ',N_' + self.set_type) + '0,' + self.user_info[0]['passenger_id_type_code'] + "," + self.user_info[0][ + "passenger_name"] + "," + + self.user_info[0]['passenger_type'] + "," + self.user_info[0]['passenger_id_no'] + "," + + self.user_info[0]['mobile_no'] + ',N') oldPassengerStr.append( - self.user_info[i]['passenger_name'] + "," + self.user_info[i]['passenger_type'] + "," + - self.user_info[i]['passenger_id_no'] + "," + self.user_info[i]['passenger_type'] + '_') - return passengerTicketStrList, oldPassengerStr + self.user_info[0]['passenger_name'] + "," + self.user_info[0]['passenger_type'] + "," + + self.user_info[0]['passenger_id_no'] + "," + self.user_info[0]['passenger_type'] + '_') + else: + for i in range(len(self.user_info)): + passengerTicketStrList.append( + '0,' + self.user_info[i]['passenger_id_type_code'] + "," + self.user_info[i][ + "passenger_name"] + "," + self.user_info[i]['passenger_type'] + "," + self.user_info[i][ + 'passenger_id_no'] + "," + self.user_info[i]['mobile_no'] + ',N_' + self.set_type) + oldPassengerStr.append( + self.user_info[i]['passenger_name'] + "," + self.user_info[i]['passenger_type'] + "," + + self.user_info[i]['passenger_id_no'] + "," + self.user_info[i]['passenger_type'] + '_') + return passengerTicketStrList, oldPassengerStr + except Exception as e: + raise PassengerUserException("联系人不在列表中,请查证后添加 {0}".format(e.message)) def checkOrderInfo(self, train_no, set_type): """ @@ -389,6 +393,24 @@ class select: else: if "errMsg" in checkOrderInfo['data'] and checkOrderInfo['data']["errMsg"]: print checkOrderInfo['data']["errMsg"] + if checkOrderInfo['data']["errMsg"].find("验证码") != -1: + print("需要验证码,正在使用自动识别验证码功能") + for i in range(3): + codeimg = 'https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand&%s' % random.random() + result = myurllib2.get(codeimg) + img_path = './tkcode' + open(img_path, 'wb').write(result) + data['pass_code'] = DamatuApi(_get_yaml()["damatu"]["uesr"], _get_yaml()["damatu"]["pwd"], + img_path).main() + checkOrderInfo = json.loads(myurllib2.Post(checkOrderInfoUrl, data, )) + if checkOrderInfo['data']['submitStatus'] is True: + print ('车票提交通过,正在尝试排队') + if self.getQueueCount(train_no, set_type): + return True + else: + raise ticketNumOutException("提交订单失败") + else: + print("验证码识别错误,第{0}次重试".format(i)) else: print checkOrderInfo elif 'messages' in checkOrderInfo and checkOrderInfo['messages']: @@ -471,7 +493,10 @@ class select: "REPEAT_SUBMIT_TOKEN": self.get_token(), } try: - checkQueueOrderResult = json.loads(myurllib2.Post(checkQueueOrderUrl, data)) + for i in range(3): + checkQueueOrderResult = json.loads(myurllib2.Post(checkQueueOrderUrl, data)) + if checkQueueOrderResult: + break except ValueError: checkQueueOrderResult = {} if checkQueueOrderResult: @@ -531,9 +556,9 @@ class select: print("排队等待失败: " + queryOrderWaitTimeResult["messages"]) else: print("第{}排队中,请耐心等待".format(num)) - time.sleep(2) else: print("排队中") + time.sleep(2) order_id = self.queryMyOrderNoComplete() # 尝试查看订单列表,如果有订单,则判断成功,不过一般可能性不大 if order_id: raise ticketIsExitsException("恭喜您订票成功,订单号为:{0}, 请立即打开浏览器登录12306,访问‘未完成订单’,在30分钟内完成支付!".format(order_id)) @@ -623,6 +648,28 @@ class select: print(e.message) +# class selectProducer(threading.Thread): +# """刷票队列""" +# def __init__(self, t_name, queue): +# threading.Thread.__init__(self, name=t_name) +# self.data = queue +# print "{0} 正在运行".format(t_name) +# +# def run(self): +# pass +# +# +# class submitOrderConsumer(threading.Thread): +# """订单队列""" +# def __init__(self, t_name, queue): +# threading.Thread.__init__(self, name=t_name) +# self.data = queue +# print "{0} 正在运行".format(t_name) +# +# def run(self): +# pass + + if __name__ == '__main__': a = select('上海', '北京') a.main() \ No newline at end of file diff --git a/tkcode b/tkcode index afb458f9e68a941a7389934d72608e321842fe76..d87a5adb1fd5f3663c02fbcfc916b6884ecdd042 100644 GIT binary patch delta 11924 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 K^e}^q`@aBVt+qt~ delta 10339 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