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): # 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 querySpec(trainDate, fromStation, toStation, passengerType=PASSENGER_TYPE_ADULT, trainsNo=[], seatTypes=[SEAT_TYPE[key] for key in SEAT_TYPE]): for ticket in Query.query(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' % (seatTypeName, seatTypeProperty)) ticket.seatType = SEAT_TYPE[seatTypeName] yield ticket return []
def main(): GetFreeProxy.getAllProxy(THREAD_POOL_SIZE, THREAD_OR_PROCESS, IS_REFASH_IP_POOL) init_ip_pool() 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 _checkOrderInfo(self, passengersDetails, seatType, ticketTypeCodes=1): formData = { 'cancel_flag': self.__ticket.ticketInfoForPassengerForm['orderRequestDTO']['cancel_flag'] or '2', 'bed_level_order_num': self.__ticket.ticketInfoForPassengerForm['orderRequestDTO'][ 'bed_level_order_num'] or '000000000000000000000000000000', 'passengerTicketStr': TrainUtils.passengerTicketStrs(seatType, passengersDetails, ticketTypeCodes), 'oldPassengerStr': TrainUtils.oldPassengerStrs(passengersDetails), 'tour_flag': self.__ticket.ticketInfoForPassengerForm['tour_flag'] or 'dc', 'randCode': '', 'whatsSelect': '1', '_json_att': '', 'REPEAT_SUBMIT_TOKEN': self.__ticket.repeatSubmitToken, } jsonRet = EasyHttp.send(self._urlInfo['checkOrderInfo'], data=formData) submitStatus = '' errMsg = '' if jsonRet['data']: submitStatus = jsonRet['data']['submitStatus'] errMsg = jsonRet['data']['errMsg'] if 'errMsg' in jsonRet['data'] else 'submit falied' return jsonRet['status'], jsonRet['messages'], submitStatus, errMsg
def _confirmSingleOrGoForQueue(self, passengersDetails,choose_seat): formData = { 'passengerTicketStr': TrainUtils.passengerTicketStrs(self.__ticket.seatType, passengersDetails, self.__ticket.ticketTypeCodes), 'oldPassengerStr': TrainUtils.oldPassengerStrs(passengersDetails), 'randCode': '', 'purpose_codes': self.__ticket.ticketInfoForPassengerForm['purpose_codes'], 'key_check_isChange': self.__ticket.ticketInfoForPassengerForm['key_check_isChange'], 'leftTicketStr': self.__ticket.ticketInfoForPassengerForm['leftTicketStr'], 'train_location': self.__ticket.ticketInfoForPassengerForm['train_location'], 'choose_seats': ''.join(choose_seat) or '', 'seatDetailType': '000', # todo::make clear 000 comes from 'whatsSelect': '1', 'roomType': '00', # todo::make clear this value comes from 'dwAll': 'N', '_json_att': '', 'REPEAT_SUBMIT_TOKEN': self.__ticket.repeatSubmitToken, } jsonRet = eHttp.send(self._urlInfo['confirmForQueue'], data=formData) return jsonRet['status'], jsonRet['messages'], jsonRet['data']['submitStatus'], jsonRet['data'][ 'errMsg'] if 'errMsg' in jsonRet['data'] else None
def _confirmSingleOrGoForQueue(self, passengersDetails): formData = { "passengerTicketStr": TrainUtils.passengerTicketStrs(self.__ticket.seatType, passengersDetails, self.__ticket.ticketTypeCodes), "oldPassengerStr": TrainUtils.oldPassengerStrs(passengersDetails), "randCode": "", "purpose_codes": self.__ticket.ticketInfoForPassengerForm["purpose_codes"], "key_check_isChange": self.__ticket.ticketInfoForPassengerForm["key_check_isChange"], "leftTicketStr": self.__ticket.ticketInfoForPassengerForm["leftTicketStr"], "train_location": self.__ticket.ticketInfoForPassengerForm["train_location"], "choose_seats": "".join(CHOOSE_SEATS) or "", "seatDetailType": "000", # todo::make clear 000 comes from "whatsSelect": "1", "roomType": "00", # todo::make clear this value comes from "dwAll": "N", "_json_att": "", "REPEAT_SUBMIT_TOKEN": self.__ticket.repeatSubmitToken, } jsonRet = EasyHttp.send(self._urlInfo["confirmForQueue"], data=formData) return ( jsonRet["status"], jsonRet["messages"], jsonRet["data"]["submitStatus"], jsonRet["data"]["errMsg"] if "errMsg" in jsonRet["data"] else None, )
def _checkOrderInfo(self, passengersDetails, seatType, ticketTypeCodes=1): url = r'https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo' # self.__ticket.seatType = seatType # self.__ticket.ticketTypeCodes = ticketTypeCodes # self.passengerDetails = passengerDetails formData = { 'cancel_flag': self.__ticket.ticketInfoForPassengerForm['orderRequestDTO'] ['cancel_flag'] or '2', 'bed_level_order_num': self.__ticket.ticketInfoForPassengerForm['orderRequestDTO'] ['bed_level_order_num'] or '000000000000000000000000000000', 'passengerTicketStr': TrainUtils.passengerTicketStrs(seatType, passengersDetails, ticketTypeCodes), 'oldPassengerStr': TrainUtils.oldPassengerStrs(passengersDetails), 'tour_flag': self.__ticket.ticketInfoForPassengerForm['tour_flag'] or 'dc', 'randCode': '', 'whatsSelect': '1', '_json_att': '', 'REPEAT_SUBMIT_TOKEN': self.__ticket.repeatSubmitToken, } headers = { 'User-Agent': FIREFOX_USER_AGENT, 'Referer': r'https://kyfw.12306.cn/otn/confirmPassenger/initDc', 'Connection': 'keep-alive', } response = NetUtils.post(self.__session, url, formData, headers=headers).json() return response['status'], response['messages'], response['data']['submitStatus'], \ response['data']['errMsg'] if 'errMsg' in response['data'] else 'submit falied'
def querySpec(session, trainDate, fromStation, toStation, passengerType=PASSENGER_TYPE_ADULT, seatTypes=[SEAT_TYPE[key] for key in SEAT_TYPE]): for ticket in Query.query(session, 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 None
def _submitOrderRequest(self, tourFlag='dc'): formData = { 'secretStr': TrainUtils.undecodeSecretStr(self.__ticket.secretStr), # 'secretStr': self.__ticket.secretStr, # 'secretStr': urllib.parse.unquote(self.__ticket.secretStr), 'train_date': Utils.formatDate(self.__ticket.startDate), # 2018-01-04 'back_train_date': time.strftime("%Y-%m-%d", time.localtime()), # query date:2017-12-31 'tour_flag': tourFlag, 'purpose_codes': self.__ticket.passengerType, 'query_from_station_name': self.__ticket.fromStation, 'query_to_station_name': self.__ticket.toStation, 'undefined': '', } jsonRet = EasyHttp.send(self._urlInfo['submitOrderRequest'], data=formData) # print('submitOrderRequest %s' % jsonRet) return jsonRet['status'], jsonRet['messages']
def _submitOrderRequest(self, tourFlag='dc'): url = r'https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest' headers = { 'User-Agent': FIREFOX_USER_AGENT, # 'Referer': r'https://kyfw.12306.cn/otn/leftTicket/init?random={}'.format(time.time() * 1000), 'Referer': 'https://kyfw.12306.cn/otn/leftTicket/init', 'Accept': r'*/*', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'en-US,en;q=0.5', 'Connection': 'keep-alive', # 'Content-Length':'444', 'Content-Type': r'application/x-www-form-urlencoded; charset=UTF-8', 'Host': r'kyfw.12306.cn', 'X-Requested-With': 'XMLHttpRequest', 'Cache-Control': 'no-cache', 'If-Modified-Since': '0', } formData = { 'secretStr': TrainUtils.undecodeSecretStr(self.__ticket.secretStr), # 'secretStr': self.__ticket.secretStr, # 'secretStr': urllib.parse.unquote(self.__ticket.secretStr), 'train_date': Utils.formatDate(self.__ticket.startDate), # 2018-01-04 # todo::check time style 'back_train_date': time.strftime("%Y-%m-%d", time.localtime()), # query date:2017-12-31 'tour_flag': tourFlag, 'purpose_codes': self.__ticket.passengerType, 'query_from_station_name': self.__ticket.fromStation, 'query_to_station_name': self.__ticket.toStation, 'undefined': '', } response = self.__session.post(url, formData, headers=headers) # response = NetUtil.post(self.__session, url, formData, headers=headers) print(response.text) response = response.json() result = response['status'] if 'status' in response else False msg = response[ 'messages'] if 'messages' in response else None # list type return result, msg
def _submitOrderRequest(self, tourFlag="dc"): formData = { "secretStr": TrainUtils.undecodeSecretStr(self.__ticket.secretStr), # 'secretStr': self.__ticket.secretStr, # 'secretStr': urllib.parse.unquote(self.__ticket.secretStr), "train_date": Utils.formatDate(self.__ticket.startDate), # 2018-01-04 "back_train_date": time.strftime("%Y-%m-%d", time.localtime()), # query date:2017-12-31 "tour_flag": tourFlag, "purpose_codes": self.__ticket.passengerType, "query_from_station_name": self.__ticket.fromStation, "query_to_station_name": self.__ticket.toStation, "undefined": "", } jsonRet = EasyHttp.send(self._urlInfo["submitOrderRequest"], data=formData) print("submitOrderRequest %s" % jsonRet) return jsonRet["status"], jsonRet["messages"]
def _submitOrderRequest(self, tourFlag='dc'): formData = { 'secretStr': TrainUtils.undecodeSecretStr(self.__ticket.secretStr), 'train_date': formatDate(self.__ticket.startDate), # 2018-10-05 'back_train_date': time.strftime("%Y-%m-%d", time.localtime()), # query date:2017-12-31 'tour_flag': tourFlag, 'purpose_codes': self.__ticket.passengerType, 'query_from_station_name': self.__ticket.fromStation, 'query_to_station_name': self.__ticket.toStation, 'undefined': '', } order_request = copy.deepcopy(self._urlInfo['submitOrderRequest']) order_request['headers']['Referer'] = self._urlInfo['submitOrderRequest']['headers']['Referer']+ '?linktypeid='+tourFlag response = eHttp.post_custom(order_request, data=formData) if response and response.status_code == 302: self._urlInfo['submitOrderRequest']['url'] = response.headers['Location'] response = eHttp.post_custom(self._urlInfo['submitOrderRequest'], data=formData) if response and response.status_code == requests.codes.ok: return True,'ok' return False,'failed'
def main(): #登陆微信 weChat = WeChat() weChat.login() UserName = weChat.getUserName() weChat.sendMessage('微信登陆成功',UserName) 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 weChat.sendMessage('订单错误,请及时查看',UserName) input('请确认错误信息') time.sleep(1) except Exception as e: Log.w(e) print(login.loginOut())
def _submitOrderRequest(self, tourFlag='dc'): formData = { 'secretStr': TrainUtils.undecodeSecretStr(self.__ticket.secretStr), # 'secretStr': self.__ticket.secretStr, # 'secretStr': urllib.parse.unquote(self.__ticket.secretStr), 'train_date': Utils.formatDate(self.__ticket.startDate), # 2018-01-04 'back_train_date': time.strftime("%Y-%m-%d", time.localtime()), # query date:2017-12-31 'tour_flag': tourFlag, 'purpose_codes': self.__ticket.passengerType, 'query_from_station_name': self.__ticket.fromStation, 'query_to_station_name': self.__ticket.toStation, 'undefined': '', } self._urlInfo['submitOrderRequest']['headers']['Referer'] = self._urlInfo['submitOrderRequest']['headers']['Referer']+ '?linktypeid='+tourFlag # jsonRet = EasyHttp.send(self._urlInfo['submitOrderRequest'], data=formData) response = EasyHttp.post_custom(self._urlInfo['submitOrderRequest'], data=formData) # print('submitOrderRequest %s' % jsonRet) if response and response.status_code == 302: self._urlInfo['submitOrderRequest']['url'] = response.headers['Location'] response = EasyHttp.post_custom(self._urlInfo['submitOrderRequest'], data=formData) if response and response.status_code == requests.codes.ok: return True,'ok' return False,'failed'
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 showSubmitInfoPretty(self): jsonTicketInfo = self._queryMyOrderNoComplete() 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))
def _confirmSingleOrGoForQueue(self, passengersDetails): url = r'https://kyfw.12306.cn/otn/confirmPassenger/confirmGoForQueue' if self.__ticket.tourFlag == TourFlag.GO_BACK \ else r'https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue' formData = { 'passengerTicketStr': TrainUtils.passengerTicketStrs(self.__ticket.seatType, passengersDetails, self.__ticket.ticketTypeCodes), 'oldPassengerStr': TrainUtils.oldPassengerStrs(passengersDetails), 'randCode': '', 'purpose_codes': self.__ticket.ticketInfoForPassengerForm['purpose_codes'], 'key_check_isChange': self.__ticket.ticketInfoForPassengerForm['key_check_isChange'], 'leftTicketStr': self.__ticket.ticketInfoForPassengerForm['leftTicketStr'], 'train_location': self.__ticket.ticketInfoForPassengerForm['train_location'], 'choose_seats': '', # todo::how to choose seats 'seatDetailType': '000', # todo::make clear 000 comes from 'whatsSelect': '1', 'roomType': '00', # todo::make clear this value comes from 'dwAll': 'N', '_json_att': '', 'REPEAT_SUBMIT_TOKEN': self.__ticket.repeatSubmitToken, } headers = { 'User-Agent': FIREFOX_USER_AGENT, 'Referer': r'https://kyfw.12306.cn/otn/confirmPassenger/{}'.format( 'initWc' if self.__ticket.tourFlag == TourFlag.GO_BACK else 'initDc'), 'Connection': 'keep-alive', r'Accept': r'application/json, text/javascript, */*; q=0.01', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'en-US,en;q=0.5', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Host': 'kyfw.12306.cn', 'X-Requested-With': 'XMLHttpRequest', } response = NetUtils.post(self.__session, url, data=formData, headers=headers).json() return response['status'], response['messages'], response['data'][ 'submitStatus'], response['data'][ 'errMsg'] if 'errMsg' in response['data'] else None
session = requests.session() login = Login(session) for count in range(1, 10, 1): Log.v('[%d]正在进行登录...' % count) result, msg = login.login(userName, userPwd, type=(count - 1) % 2) if Utils.check(result, msg): break Log.w('登录失败,正在重新进行登录...') if not Utils.check(login.isLogin(), '登录失败,程序退出!'): exit(-1) Log.v('%s,登录成功' % msg) ticketDetails = Query.loopQuery( session, trainDate, fromStation, toStation, TrainUtils.passengerType2Desc(passengerTypeCode), seatTypesCode) if not Utils.check(ticketDetails, '刷票失败!'): exit(-1) Log.v('已为您查询到可用余票:%s' % ticketDetails) ticketDetails.passengersId = passengersId ticketDetails.ticketTypeCodes = passengerTypeCode ticketDetails.tourFlag = tourFlag submit = Submit(session, ticketDetails) try: submit.submit() except Exception as e: Log.w('exception occured!') traceback.print_exc() finally: login.logOut()
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: response = EasyHttp.post_custom(loginUrls['normal']['conf']) if not response or not response.json(): Log.d('登录状态检查失败,重新请求') status, login = do_login() if not status: return resp = response.json() login_status = resp.get('data').get('is_login') Log.d('登录状态:%s' % login_status) if 'Y' != login_status: Log.d('登录状态已过期,重新请求') status, login = do_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) if submit.submit(seats_default): 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) login.loginOut() Log.d('注销登录成功')
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)
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, POLICY_BILL): if ticketDetails: return ticketDetails time.sleep(timeInterval) if __name__ == "__main__": for tecket in Query.query(1, queryUrls['query']['url'], '2019-07-31', '福州', '长汀', 'ADULT'): print(tecket) if not TrainUtils.filterTrain(tecket, ['D6575']): continue for seatTypeName, seatTypeProperty in TrainUtils.seatWhich(['O'], tecket): if seatTypeProperty and seatTypeProperty != '无': Log.v('%s %s: %s' % (tecket.trainNo, seatTypeName, seatTypeProperty)) try: remind_num = int(seatTypeProperty) except Exception as e: remind_num = 100 tecket.seatType = SEAT_TYPE[seatTypeName] tecket.remindNum = remind_num print('tttt', tecket) # Query.outputPretty('2019-07-31', '福州', '长汀')
def showSubmitInfoPretty(self): status, msg, jsonTicketInfo = self._queryMyOrderNoComplete() if not Utils.check(status, msg): return False, 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
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') #当前实际显示有效时间为4天,实际访问可下单时间大概为2天(细节可按实际情况调节) if 'RAIL_EXPIRATION' in cookies and (int(RAIL_EXPIRATION) - 172800000) < int(time.time() * 1000): Log.v('cookie登录已过期,重新请求') EasyHttp.removeCookies() 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: login = Login() 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) 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) login.loginOut() Log.d('注销登录成功')
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): 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())