def query(session, trainDate, fromStation, toStation, passengerType=PASSENGER_TYPE_ADULT): params = { r'leftTicketDTO.train_date': trainDate, r'leftTicketDTO.from_station': city2code(fromStation), r'leftTicketDTO.to_station': city2code(toStation), r'purpose_codes': passengerType } # response = NetUtil.normalGet(Query.__url, params=params, headers={'User-Agent': random.choice(USER_AGENT)}).json() headers = { 'User-Agent': FIREFOX_USER_AGENT, 'Referer': r'https://kyfw.12306.cn/otn/leftTicket/init', 'Connection': 'keep-alive', } response = NetUtils.get(session, Query.__url, params=params, headers=headers, verify=False) print(response.text) response = response.json() response = response['data'] if 'data' in response else Log.e( "can not find key: 'data'") queryResults = response['result'] if 'result' in response else Log.e( "can not find key: 'result'") return Query.__decode(queryResults, passengerType)
def __waitForOrderId(self): Log.v("正在排队获取订单!") count = 0 while True: count += 1 status, msg, waitTime, orderId, errorMsg = self._queryOrderWaitTime( ) if not Utils.check(status, "queryOrderWaitTime: %s" % msg): return None Log.v("[%d]正在等待订单提交结果..." % count) if waitTime < 0: if orderId: Log.v("订单提交成功,订单号: %s" % orderId) return orderId elif errorMsg: Log.e(errorMsg) return None interval = waitTime // 60 Log.w("未出票,订单排队中...预估等待时间: %s 分钟" % (interval if interval <= 30 else "超过30")) if interval > 30: time.sleep(60) elif interval > 20: time.sleep(30) elif interval > 10: time.sleep(10) else: time.sleep(3) return None
def _getExtraInfo(self): def getRepeatSubmitToken(html): repeatSubmitToken = re.findall( r"var globalRepeatSubmitToken = '(.*)'", html)[0] # print('RepeatSubmitToken = %s' % repeatSubmitToken) return repeatSubmitToken formData = {'_json_att': ''} extra_info = copy.deepcopy(self._urlInfo['getExtraInfo']) # extra_info['headers']['Referer'] = self._urlInfo['getExtraInfo']['headers']['Referer']+ '?linktypeid='+self.__ticket.tourFlag response = EasyHttp.post_custom(extra_info, data=formData) if response and response.status_code == requests.codes.ok: html = response.text if html.find('系统忙,请稍后重试') != -1: Log.e('系统忙,请稍后重试...') return False else: html = None # html = EasyHttp.send(self._urlInfo['getExtraInfo']) if not Utils.check( html, 'failed to visit %s' % self._urlInfo['getExtraInfo']['url']): return False self.__ticket.repeatSubmitToken = getRepeatSubmitToken(html) def decodeTicketInfoForPassengerForm(html): ticketInfoForPassengerForm = re.findall( r'var ticketInfoForPassengerForm=(.*);', html)[0] return json.loads(ticketInfoForPassengerForm.replace("'", "\"")) # print('=======================') self.__ticket.ticketInfoForPassengerForm = decodeTicketInfoForPassengerForm( html) return True
def query(flag, base_url, trainDate, fromStation, toStation, passengerType=PASSENGER_TYPE_ADULT): # params = { # r'leftTicketDTO.train_date': trainDate, # r'leftTicketDTO.from_station': city2code(fromStation), # r'leftTicketDTO.to_station': city2code(toStation), # r'purpose_codes': passengerType # } params = collections.OrderedDict() params['leftTicketDTO.train_date'] = trainDate params['leftTicketDTO.from_station'] = city2code(fromStation) params['leftTicketDTO.to_station'] = city2code(toStation) params['purpose_codes'] = passengerType if flag > 1: jsonRet = EasyHttp.send(queryUrls['query'], params=params) else: for suffix in ['', 'O', 'X', 'Z', 'A', 'T', 'V']: queryUrls['query']['url'] = base_url + suffix jsonRet = EasyHttp.send(queryUrls['query'], params=params) if jsonRet: break try: if jsonRet: return Query.__decode(jsonRet['data']['result'], passengerType) except Exception as e: Log.e(e) return []
def main(): login = Login() Log.v('正在登录...') result, msg = login.login(USER_NAME, USER_PWD) if not Utils.check(result, msg): Log.e(msg) return Log.v('%s,登录成功' % msg) seatTypesCode = SEAT_TYPE_CODE if SEAT_TYPE_CODE else [SEAT_TYPE[key] for key in SEAT_TYPE.keys()] passengerTypeCode = PASSENGER_TYPE_CODE if PASSENGER_TYPE_CODE else '1' while True: # 死循环一直查票,直到下单成功 try: print('-' * 40) ticketDetails = Query.loopQuery(TRAIN_DATE, FROM_STATION, TO_STATION, TrainUtils.passengerType2Desc(passengerTypeCode), TRAINS_NO, seatTypesCode) Log.v('已为您查询到可用余票:%s' % ticketDetails) ticketDetails.passengersId = PASSENGERS_ID ticketDetails.ticketTypeCodes = passengerTypeCode ticketDetails.tourFlag = TOUR_FLAG if TOUR_FLAG else 'dc' submit = Submit(ticketDetails) if submit.submit(): submit.showSubmitInfoPretty() break time.sleep(1) except Exception as e: Log.w(e) print(login.loginOut())
def __waitForOrderId(self): Log.v('正在排队获取订单!') count = 0 while True: count += 1 status, msg, waitTime, orderId, errorMsg = self._queryOrderWaitTime() if not Utils.check(status, 'queryOrderWaitTime: %s' % msg): return None Log.v('[%d]正在等待订单提交结果...' % count) if waitTime < 0: if orderId: Log.v('订单提交成功,订单号: %s' % orderId) return orderId elif errorMsg: Log.e(errorMsg) time.sleep(3) return None else: time.sleep(3) continue interval = waitTime // 60 Log.w('未出票,订单排队中...预估等待时间: %s 分钟' % (interval if interval <= 30 else '超过30')) if interval > 30: time.sleep(60) elif interval > 20: time.sleep(30) elif interval > 10: time.sleep(10) else: time.sleep(3) return None
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 main(): login = Login() Log.v('正在登录...') result, msg = login.login(USER_NAME, USER_PWD, IS_AUTO_CHECK_CAPTHCA) if not Utils.check(result, msg): Log.e(msg) return Log.v('%s,登录成功' % msg) seatTypesCode = SEAT_TYPE_CODE if SEAT_TYPE_CODE else [ SEAT_TYPE[key] for key in SEAT_TYPE.keys() ] passengerTypeCode = PASSENGER_TYPE_CODE if PASSENGER_TYPE_CODE else '1' count = 0 while True: # 死循环一直查票,直到下单成功 try: nowTime, status = deadline.do_fix_time() if status: Log.v('当前时间:%s 处于23点到6点之间,12306处于维护状态,暂不处理下单业务' % nowTime) continue count += 1 Log.v('第%d次访问12306网站' % count) print('-' * 40) ticketDetails = Query.loopQuery( TRAIN_DATE, FROM_STATION, TO_STATION, TrainUtils.passengerType2Desc(passengerTypeCode), TRAINS_NO, seatTypesCode, PASSENGERS_ID, POLICY_BILL, QUERY_TICKET_REFERSH_INTERVAL) Log.v('已为您查询到可用余票:%s' % ticketDetails) ticketDetails.passengersId = PASSENGERS_ID ticketDetails.ticketTypeCodes = passengerTypeCode ticketDetails.tourFlag = TOUR_FLAG if TOUR_FLAG else 'dc' submit = Submit(ticketDetails) if submit.submit(CHOOSE_SEATS): status, contents = submit.showSubmitInfoPretty() if status: flag = send_mail(mail_user, mailto_list, '12306订票结果通知', mail_host, mail_user, mail_pass, contents) if flag: Log.v("邮件发送成功!") else: Log.v("邮件发送失败!") sms_id = send_sms(ACCOUNT_SID, AUTO_TOKEN, FROM_NUM, TO_NUM, '小机机已经成功拿到小票票,请主人记得在30分钟内完成支付!!!') if sms_id: Log.v("短信提醒发送成功!") else: Log.v("短信提醒发送成功!") break time.sleep(1) except Exception as e: Log.w(e) print(login.loginOut())
def working(username=USER_NAME, password=USER_PWD, id_cards=PASSENGERS_ID, day=TRAIN_DATE, from_station=FROM_STATION, to_station=TO_STATION, seats=SEAT_TYPE_CODE, types=PASSENGER_TYPE_CODE, train_no=TRAINS_NO, polocy=POLICY_BILL, tour_flag=TOUR_FLAG, refersh=QUERY_TICKET_REFERSH_INTERVAL): GetFreeProxy.getAllProxy(THREAD_POOL_SIZE, THREAD_OR_PROCESS, IS_REFASH_IP_POOL) init_ip_pool() login = Login() Log.v('正在登录...') result, msg = login.login(username, password, IS_AUTO_CHECK_CAPTHCA) if not Utils.check(result, msg): Log.e(msg) return Log.v('%s,登录成功' % msg) seatTypesCode = seats if seats else [SEAT_TYPE[key] for key in SEAT_TYPE.keys()] passengerTypeCode = types if types else '1' count = 0 while True: # 死循环一直查票,直到下单成功 try: nowTime, status = deadline.do_fix_time() if status: Log.v('当前时间:%s 处于23点到6点之间,12306处于维护状态,暂不处理下单业务' % nowTime) continue count += 1 Log.v('第%d 次访问12306网站' % count) print('-' * 40) ticketDetails = Query.loopQuery(day, from_station, to_station, TrainUtils.passengerType2Desc(passengerTypeCode), train_no, seatTypesCode, id_cards, polocy, refersh) Log.v('已为您查询到可用余票:%s' % ticketDetails) ticketDetails.passengersId = id_cards ticketDetails.ticketTypeCodes = passengerTypeCode ticketDetails.tourFlag = tour_flag if tour_flag else 'dc' submit = Submit(ticketDetails) if submit.submit(CHOOSE_SEATS): status, contents = submit.showSubmitInfoPretty() if status: flag = send_mail(mail_user, mailto_list, '12306订票结果通知', mail_host, mail_user, mail_pass, contents) if flag: Log.v("邮件发送成功!") else: Log.v("邮件发送失败!") sms_id = send_sms(ACCOUNT_SID, AUTO_TOKEN, FROM_NUM, TO_NUM, '小机机已经成功拿到小票票,请主人记得在30分钟内完成支付!!!') if sms_id: Log.v("短信提醒发送成功!") else: Log.v("短信提醒发送成功!") break time.sleep(1) except Exception as e: Log.w("提交操作异常:" + e) print(login.loginOut())
def normalGet(url, params=None, **kwargs): try: response = requests.get(url, params=params, **kwargs) response.raise_for_status() response.encoding = response.apparent_encoding return response except: Log.e('can not visit url: ' + url) return None
def post(session, url, data=None, json=None, **kwargs): try: response = session.post(url, data, json, **kwargs) response.raise_for_status() response.encoding = response.apparent_encoding return response except: Log.e('can not visit url: ' + url) return None
def do_login(): 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): Log.e(msg) return False, login Log.v('%s,登录成功' % msg) return True, login
def get(session, url, **kwargs): try: response = session.get(url, **kwargs) response.raise_for_status() response.encoding = response.apparent_encoding return response except: Log.e('can not visit url: ' + url) raise return None
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 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 query(flag, base_url, trainDate, fromStation, toStation, passengerType=PASSENGER_TYPE_ADULT): params = collections.OrderedDict() params['leftTicketDTO.train_date'] = trainDate params['leftTicketDTO.from_station'] = city2code(fromStation) params['leftTicketDTO.to_station'] = city2code(toStation) params['purpose_codes'] = passengerType jsonRet = eHttp.send(queryUrls['query'], params=params) try: if jsonRet: return Query.__decode(jsonRet['data']['result'], passengerType) except Exception as e: Log.e(e) return []
def query(trainDate, fromStation, toStation, passengerType=PASSENGER_TYPE_ADULT): params = { r'leftTicketDTO.train_date': trainDate, r'leftTicketDTO.from_station': city2code(fromStation), r'leftTicketDTO.to_station': city2code(toStation), r'purpose_codes': passengerType } jsonRet = EasyHttp.send(queryUrls['query'], params=params) try: if jsonRet: return Query.__decode(jsonRet['data']['result'], passengerType) except Exception as e: Log.e(e) return []
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 query(trainDate, fromStation, toStation, passengerType=PASSENGER_TYPE_ADULT): params = { r"leftTicketDTO.train_date": trainDate, r"leftTicketDTO.from_station": city2code(fromStation), r"leftTicketDTO.to_station": city2code(toStation), r"purpose_codes": passengerType, } jsonRet = EasyHttp.send(queryUrls["query"], params=params) try: if jsonRet: return Query.__decode(jsonRet["data"]["result"], passengerType) except Exception as e: Log.e(e) return []
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官方网站进行支付!')
class zhihuAnj(): def __init__(self,url): self.m_url = url self.m_ret = dict() self.m_log = Log() def getHtml(self,url): # url = "http://www.zhihu.com/answer/23966524" # url = self.url + "/voters_profile" html = urllib.urlopen(url).read() return html; def getInfo(self,url): # html = self.getHtml(url); print html jsonRet = json.loads(html); # total = jsonRet['paging']['total'] # if int(total)>10: next = jsonRet['paging']['next'] follows = next.split('follows=') print follows[1] return total,follows[1] else: return total,None def getPayLoad(self,total,offset,follows): if follows != None: url = self.m_url + "/voters_profile?total="+str(total)+"&offset="+str(offset)+"&follows="+follows else: url = self.m_url + "/voters_profile" html = self.getHtml(url) try: jsonRet = json.loads(html) except Exception,e: self.m_log.e(e) return payLoad = jsonRet['payload'] return payLoad
def __query(trainDate, fromStation, toStation, passengerType=PASSENGER_TYPE_ADULT): params = { r'leftTicketDTO.train_date': trainDate, r'leftTicketDTO.from_station': city2code(fromStation), r'leftTicketDTO.to_station': city2code(toStation), r'purpose_codes': passengerType } response = NetUtils.normalGet(Query.__url, params=params, headers={ 'User-Agent': random.choice(USER_AGENT) }).json() response = response['data'] if 'data' in response else Log.e( "can not find key: 'data'") queryResults = response['result'] if 'result' in response else Log.e( "can not find key: 'result'") return Query.__decode(queryResults, passengerType)
def super_hero(love): Log.v('启动***超级英雄***线程') #免费代理ip访问 GetFreeProxy.getAllProxy(THREAD_POOL_SIZE, THREAD_OR_PROCESS, IS_REFASH_IP_POOL) init_ip_pool() EasyHttp.load_cookies(COOKIE_SAVE_ADDRESS) cookies = {c.name: c.value for c in EasyHttp.get_session().cookies} if 'uamtk' not in cookies or 'RAIL_DEVICEID' not in cookies: status, login = do_login(love) if not status: love.change_offline_status(True) return else: status, _ = check_user_login() if not status: status, login = do_login(love) if not status: love.change_offline_status(True) return Log.v('已登录状态,开始寻找小票票') seatTypesCode = SEAT_TYPE_CODE if SEAT_TYPE_CODE else [ SEAT_TYPE[key] for key in SEAT_TYPE.keys() ] passengerTypeCode = PASSENGER_TYPE_CODE if PASSENGER_TYPE_CODE else '1' Log.d("订单详情:日期[%s]/区间[%s至%s]%s%s/刷票间隔[%ss]" % (','.join(TRAIN_DATE), FROM_STATION, TO_STATION, '/出发时间段[' + '~'.join(leave_time) + ']' if leave_time else '', '/车次[' + ','.join(TRAINS_NO) + ']' if TRAINS_NO else '', QUERY_TICKET_REFERSH_INTERVAL)) count = 0 while True: try: nowTime, status = deadline.do_fix_time() if status: Log.v('当前时间:%s 处于23点到6点之间,12306处于维护状态,暂不处理下单业务' % nowTime) continue count += 1 Log.v('第%d次访问12306网站' % count) print('-' * 40) ticketDetails = Query.loopQuery( TRAIN_DATE, FROM_STATION, TO_STATION, TrainUtils.passengerType2Desc(passengerTypeCode), TRAINS_NO, seatTypesCode, PASSENGERS_ID, leave_time, POLICY_BILL, QUERY_TICKET_REFERSH_INTERVAL) status = love.get_login_status() # status,_ = check_user_login() if not status: #非登录状态有票,仅支持自动登录或第三方AI自动登录 if SELECT_AUTO_CHECK_CAPTHCA == CAPTCHA_CHECK_METHOD_HAND: Log.e("手动模式登录状态已过期,请手动重试...") status, login = do_login(love) if not status: Log.e("登录状态已过期,重试登录失败") love.change_offline_status(True) return # Log.v('已为您查询到可用余票:%s' % ticketDetails) Log.v('已为您查询到可用余票:[日期:%s,车次:%s,出发站:%s,到达站:%s,出发时间:%s,到达时间:%s]' % (ticketDetails.custom_date, ticketDetails.trainNo, ticketDetails.fromStation, ticketDetails.toStation, ticketDetails.leaveTime, ticketDetails.arriveTime)) ticketDetails.passengersId = PASSENGERS_ID ticketDetails.ticketTypeCodes = passengerTypeCode ticketDetails.tourFlag = TOUR_FLAG if TOUR_FLAG else 'dc' submit = Submit(ticketDetails) seats_default = copy.deepcopy(CHOOSE_SEATS) if submit.submit(seats_default): status, contents = submit.showSubmitInfoPretty() if status: Log.v("获取车票详情成功") flag = send_mail(mail_user, mailto_list, '12306订票结果通知', mail_host, mail_user, mail_pass, contents) if flag: Log.v("邮件发送成功!") else: Log.v("邮件发送失败!") sms_id = send_sms(ACCOUNT_SID, AUTO_TOKEN, FROM_NUM, TO_NUM, '小机机已经成功拿到小票票,请主人记得在30分钟内完成支付!!!') if sms_id: Log.v("短信提醒发送成功!") else: Log.v("短信提醒发送失败!") break time.sleep(1) except Exception as e: Log.w(e) login.loginOut() Log.d('注销登录成功') love.change_offline_status(True)
def check(target, log): if not target: Log.e(log) return False return True
def super_hero(love): Log.v('启动***超级英雄***线程') #免费代理ip访问 GetFreeProxy.getAllProxy(THREAD_POOL_SIZE, THREAD_OR_PROCESS, IS_REFASH_IP_POOL) init_ip_pool() EasyHttp.load_cookies(COOKIE_SAVE_ADDRESS) cookies = {c.name: c.value for c in EasyHttp.get_session().cookies} RAIL_EXPIRATION = cookies.get('RAIL_EXPIRATION') #(int(RAIL_EXPIRATION)-172800000) < int(time.time()*1000) if RAIL_EXPIRATION and int(RAIL_EXPIRATION) < int(time.time()*1000) : Log.d('cookie登录已过期,重新请求') status,login = do_login() if not status: love.change_status(True) return else: if not ('uamtk' in cookies and 'RAIL_DEVICEID' in cookies): status,login = do_login() if not status: love.change_status(True) return else: status = check_login() if not status: love.change_status(True) return login = Login() login._urlInfo = loginUrls['normal'] Log.v('已登录状态,开始寻找小票票') seatTypesCode = SEAT_TYPE_CODE if SEAT_TYPE_CODE else [SEAT_TYPE[key] for key in SEAT_TYPE.keys()] passengerTypeCode = PASSENGER_TYPE_CODE if PASSENGER_TYPE_CODE else '1' Log.d("订单详情:日期[%s]/区间[%s至%s]%s/车次[%s]/刷票间隔[%ss]"%(TRAIN_DATE,FROM_STATION,TO_STATION,'/出发时间段['+'~'.join(leave_time)+']' if leave_time else '',','.join(TRAINS_NO),QUERY_TICKET_REFERSH_INTERVAL)) count = 0 while True: try: nowTime, status = deadline.do_fix_time() if status: Log.v('当前时间:%s 处于23点到6点之间,12306处于维护状态,暂不处理下单业务' % nowTime) continue count += 1 Log.v('第%d次访问12306网站' % count) print('-' * 40) flag,ticketDetails = Query.loopQuery(TRAIN_DATE, FROM_STATION, TO_STATION, TrainUtils.passengerType2Desc(passengerTypeCode), TRAINS_NO, seatTypesCode, PASSENGERS_ID,leave_time, POLICY_BILL, QUERY_TICKET_REFERSH_INTERVAL,HEART_BEAT_PER_REQUEST_TIME) #非登录状态有票,仅支持自动登录或第三方AI自动登录 if not flag: if SELECT_AUTO_CHECK_CAPTHCA == CAPTCHA_CHECK_METHOD_HAND: Log.e("手动验证模式登录重试失败,请手动重试") return status, login = do_login() if not status: Log.e("自动验证模式登录重试失败自动登录失败,请手动重试") return # Log.v('已为您查询到可用余票:%s' % ticketDetails) Log.v('已为您查询到可用余票:[日期:%s,车次:%s,出发站:%s,到达站:%s,出发时间:%s,到达时间:%s]' % (ticketDetails.custom_date,ticketDetails.trainNo,ticketDetails.fromStation,ticketDetails.toStation,ticketDetails.leaveTime,ticketDetails.arriveTime)) ticketDetails.passengersId = PASSENGERS_ID ticketDetails.ticketTypeCodes = passengerTypeCode ticketDetails.tourFlag = TOUR_FLAG if TOUR_FLAG else 'dc' submit = Submit(ticketDetails) seats_default = copy.deepcopy(CHOOSE_SEATS) if (ticketDetails.seatType == SEAT_TYPE[SeatName.FIRST_CLASS_SEAT] or ticketDetails.seatType == SEAT_TYPE[SeatName.SECOND_CLASS_SEAT]) and not seats_default: results_seat = [] for i in range(len(PASSENGERS_ID)): random_seat = random.choice(NUM_SEAT)+random.choice(LETTER_SEAT) if random_seat in results_seat: continue results_seat.append(random_seat) seats_default.extend(results_seat) if submit.submit(seats_default): status, contents = submit.showSubmitInfoPretty() if status: Log.v("获取车票详情成功") flag = send_mail(mail_user, mailto_list, '12306订票结果通知', mail_host, mail_user, mail_pass, contents) if flag: Log.v("邮件发送成功!") else: Log.v("邮件发送失败!") sms_id = send_sms(ACCOUNT_SID,AUTO_TOKEN,FROM_NUM,TO_NUM,'小机机已经成功拿到小票票,请主人记得在30分钟内完成支付!!!') if sms_id: Log.v("短信提醒发送成功!") else: Log.v("短信提醒发送失败!") break time.sleep(1) except Exception as e: Log.w(e) login.loginOut() Log.d('注销登录成功') love.change_status(True)
def main(): #免费代理ip访问 GetFreeProxy.getAllProxy(THREAD_POOL_SIZE, THREAD_OR_PROCESS, IS_REFASH_IP_POOL) init_ip_pool() EasyHttp.load_cookies(COOKIE_SAVE_ADDRESS) cookies = {c.name: c.value for c in EasyHttp.get_session().cookies} RAIL_EXPIRATION = cookies.get('RAIL_EXPIRATION') #(int(RAIL_EXPIRATION)-172800000) < int(time.time()*1000) if RAIL_EXPIRATION and int(RAIL_EXPIRATION) < int(time.time() * 1000): Log.d('cookie登录已过期,重新请求') status, login = do_login() if not status: return else: if not ('uamtk' in cookies and 'RAIL_DEVICEID' in cookies): status, login = do_login() if not status: return else: status = check_login() if not status: return login = Login() login._urlInfo = loginUrls['normal'] Log.v('已登录状态,开始寻找小票票') seatTypesCode = SEAT_TYPE_CODE if SEAT_TYPE_CODE else [ SEAT_TYPE[key] for key in SEAT_TYPE.keys() ] passengerTypeCode = PASSENGER_TYPE_CODE if PASSENGER_TYPE_CODE else '1' count = 0 while True: # 死循环一直查票,直到下单成功 try: nowTime, status = deadline.do_fix_time() if status: Log.v('当前时间:%s 处于23点到6点之间,12306处于维护状态,暂不处理下单业务' % nowTime) continue count += 1 Log.v('第%d次访问12306网站' % count) print('-' * 40) ticketDetails = Query.loopQuery( TRAIN_DATE, FROM_STATION, TO_STATION, TrainUtils.passengerType2Desc(passengerTypeCode), TRAINS_NO, seatTypesCode, PASSENGERS_ID, POLICY_BILL, QUERY_TICKET_REFERSH_INTERVAL) Log.v('已为您查询到可用余票:%s' % ticketDetails) ticketDetails.passengersId = PASSENGERS_ID ticketDetails.ticketTypeCodes = passengerTypeCode ticketDetails.tourFlag = TOUR_FLAG if TOUR_FLAG else 'dc' submit = Submit(ticketDetails) seats_default = copy.deepcopy(CHOOSE_SEATS) if (ticketDetails.seatType == SEAT_TYPE[SeatName.FIRST_CLASS_SEAT] or ticketDetails.seatType == SeatName.SECOND_CLASS_SEAT) and not seats_default: results_seat = [] for i in range(len(PASSENGERS_ID)): random_seat = random.choice(NUM_SEAT) + random.choice( LETTER_SEAT) if random_seat in results_seat: continue results_seat.append(random_seat) seats_default.extend(results_seat) #仅支持自动登录或第三方AI自动登录 status = check_re_login() if not status and SELECT_AUTO_CHECK_CAPTHCA == CAPTCHA_CHECK_METHOD_MYSELF: status, login = do_login() if not status: Log.e("自动登录失败,请手动重试") return if submit.submit(seats_default): status, contents = submit.showSubmitInfoPretty() if status: Log.v("获取车票详情成功") flag = send_mail(mail_user, mailto_list, '12306订票结果通知', mail_host, mail_user, mail_pass, contents) if flag: Log.v("邮件发送成功!") else: Log.v("邮件发送失败!") sms_id = send_sms(ACCOUNT_SID, AUTO_TOKEN, FROM_NUM, TO_NUM, '小机机已经成功拿到小票票,请主人记得在30分钟内完成支付!!!') if sms_id: Log.v("短信提醒发送成功!") else: Log.v("短信提醒发送失败!") break time.sleep(1) except Exception as e: Log.w(e) login.loginOut() Log.d('注销登录成功')