def isLogin(self): formData = {'_json_att': ''} jsonRet = EasyHttp.send(self._urlInfo['checkUser']) Log.d('checkUser: %s' % jsonRet) return jsonRet['data'][ 'flag'] if jsonRet and 'data' in jsonRet and 'flag' in jsonRet[ 'data'] else False
def verifyCodeAuto(self): try: response = EasyHttp.send(autoVerifyUrls['12305']) if response['result_code'] != '0': return None, False img_base64 = response['image'] # result = eval(response.split("(")[1].split(")")[0]).get("image") # img_base64 = result body = {'base64': img_base64} response = EasyHttp.post_custom(autoVerifyUrls['api'],data=json.dumps(body)).json() # response = requests.post(autoVerifyUrls['api']['url'],json=body,headers ={ # 'Content-Type': 'application/json', # }).json() if response['success'] != True: return None, False body = { 'check': response['data']['check'], 'img_buf': img_base64, 'logon': 1, 'type': 'D', '=':'' } response = EasyHttp.post_custom(autoVerifyUrls['img_url'],data=json.dumps(body)).json() content = str(response['res']) results = content.replace('(','').replace(')','') Log.d('识别坐标:%s'%results) except Exception as e: Log.w(e) return None, False return results, self._captchaAutoCheck(results)
def validUsefulProxy(params): """ 检验代理是否可用 """ marks = params.split('&&') if isinstance(marks[1], bytes): marks[1] = marks[1].decode('utf8') proxies = {"http": "http://{proxy}".format(proxy=marks[1])} flag = None try: # 超过20秒的代理就不要了 r = requests.get('http://httpbin.org/ip', proxies=proxies, timeout=10, verify=False) if r.status_code == 200 and r.json().get("origin"): # logger.info('%s is ok' % proxy) 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 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 wrapper(*args, **kw): reslut = False msg = '' for count in range(3): reslut, msg = func(*args, **kw) if reslut: break if count > 1: Log.d(msg) return reslut, msg
def check_re_login(): response = EasyHttp.post_custom(loginUrls['normal']['conf']) if not response or not response.json(): return False resp = response.json() login_status = resp.get('data').get('is_login') Log.d('登录状态:%s' % login_status) if 'Y' != login_status: Log.d('登录状态已过期') return False return True
def wrapper(*args, **kw): reslut = False msg = '' for count in range(4): reslut, msg = func(*args, **kw) if reslut: break #目测12306拉取状态最少3次,最多次数暂定为4 if count > 2: Log.d(msg) return reslut, msg
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 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)
def main(): eHttp.load_cookies(COOKIE_SAVE_ADDRESS) cookies = {c.name: c.value for c in eHttp.get_session().cookies} if not ('uamtk' in cookies and 'RAIL_DEVICEID' in cookies): status,login = do_login() if not status: return else: response = eHttp.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') login_name = resp.get('data').get('name') 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'] if login_name is not None: Log.v(login_name + ': 已登录状态,开始寻找车票') count = 0 while True: # 死循环查票直到下单成功 try: nowTime, status = do_fix_time() if status: Log.v('当前时间:%s 处于23点到6点之间,12306处于维护状态,暂不处理下单业务' % nowTime) continue count += 1 Log.v('\n第%d次访问12306网站' % count) print('-' * 40) ticketDetails = Query.loopQuery(TRAIN_DATE, FROM_STATION, TO_STATION, passengerType2Desc(PASSENGER_TYPE_CODE), TRAINS_NO, SEAT_TYPE_CODE, PASSENGERS_ID, POLICY_BILL, QUERY_TICKET_REFERSH_INTERVAL) Log.v('已为您查询到可用余票:%s' % ticketDetails) ticketDetails.passengersId = PASSENGERS_ID ticketDetails.ticketTypeCodes = PASSENGER_TYPE_CODE ticketDetails.tourFlag = TOUR_FLAG 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): Log.v("您已成功订购火车票!请在30分钟内前往12306官方网站进行支付") break else: Log.v("购票失败,重新请求") time.sleep(5) except Exception as e: Log.w(e) time.sleep(5)
seatTypes = input( '请输入座位类别(多个以,分隔,默认:所有)%s: ' % (['%s:%s' % (seat, code) for seat, code in SEAT_TYPE.items()])).strip().split(',') seatTypesCode = seatTypes if seatTypes[0] else [ SEAT_TYPE[key] for key in SEAT_TYPE.keys() ] passengerTypeCode = input('请输入购票类型(默认:成人):%s:' % ([ '%s:%s' % (name, code) for name, code in PASSENGER_TICKET_TYPE_CODES.items() ])).strip() or '1' passengersId = input('请输入乘客身份证号(多个以,分隔): ').strip().split(',') tourFlag = input('单程:%s,往返:%s(默认%s): ' % (TourFlag.SINGLE, TourFlag.GO_BACK, TourFlag.SINGLE)).strip() or TourFlag.SINGLE Log.d('出发日期: %s,座位类别: %s,乘客类型: %s,车票类型: %s' % (trainDate, seatTypesCode, passengerTypeCode, tourFlag)) 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,
def isLogin(self): formData = {"_json_att": ""} jsonRet = EasyHttp.send(self._urlInfo["checkUser"]) Log.d("checkUser: %s" % jsonRet) return (jsonRet["data"]["flag"] if jsonRet and "data" in jsonRet and "flag" in jsonRet["data"] else False)