Esempio n. 1
0
 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 []
Esempio n. 2
0
 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 []
Esempio n. 3
0
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())
Esempio n. 4
0
 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
Esempio n. 5
0
 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
Esempio n. 6
0
 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,
     )
Esempio n. 7
0
 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'
Esempio n. 8
0
 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
Esempio n. 9
0
 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']
Esempio n. 10
0
 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
Esempio n. 11
0
 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"]
Esempio n. 12
0
 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'
Esempio n. 13
0
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())
Esempio n. 14
0
 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'
Esempio n. 15
0
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())
Esempio n. 16
0
    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))
Esempio n. 17
0
 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
Esempio n. 18
0
    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()
Esempio n. 19
0
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('注销登录成功')
Esempio n. 20
0
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)
Esempio n. 21
0
                  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', '福州', '长汀')
Esempio n. 22
0
    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
Esempio n. 23
0
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)
Esempio n. 24
0
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('注销登录成功')
Esempio n. 25
0
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())