Exemplo n.º 1
0
    def step_5_confirm_queue(self, step_5_data):
        '''
        在查询页点击“预订”之后的直到下单一共有以下几个步骤,第五个步骤使用当前方法来实现
        提交订单请求->确认乘客信息->检查订单信息->获得队列信息->确认队列信息->打印票价
        :return:
        '''
        print '******************************正在确认队列信息NO.5'

        url = 'https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue'

        # 从文件加载cookie
        cookie = load_cookie()
        self.session.cookies.update(cookie)

        response = self.session.post(url, data=step_5_data)

        # 检测cookie是否变化,如果有则更新,无则不变
        dict_cookie = dict(cookie)
        check_new_cookie(response.headers, dict_cookie)

        if re.search("data....submitStatus..true", response.text):
            #print '>>>>>状态:OK!<<<<<'
            #print '模块:step_5,正在调试!,确认无误,可删掉此处断点', sys.exit()

            time.sleep(2)
            # 调用执行第六个步骤即查询票价的方法
            self.step_6_check_ticket_price()

        else:
            msg = re.search("messages...(.*?).,", response.text).group(1)
            print msg, response.text, sys.exit()
Exemplo n.º 2
0
    def step_4_get_queue_count(self, step_4_data, step_5_data):
        '''
        在查询页点击“预订”之后的直到下单一共有以下几个步骤,第四个步骤使用当前方法来实现
        提交订单请求->确认乘客信息->检查订单信息->获得队列信息->确认队列信息->提交订单成功
        :return:
        '''
        print '******************************正在获取队列信息NO.4'

        url = 'https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount'

        # 从文件加载cookie
        cookie = load_cookie()
        self.session.cookies.update(cookie)

        response = self.session.post(url, step_4_data)
        #print response.text

        # 检测cookie是否变化,如果有则更新,无则不变
        dict_cookie = dict(cookie)
        check_new_cookie(response.headers, dict_cookie)

        if re.search("status..true.*?messages....,", response.text):
            #print '>>>>>状态:OK!<<<<<'
            #print '模块:step_4,正在调试!,确认无误,可删掉此处断点', sys.exit()
            #调用执行第五个步骤的方法
            #print step_5_data
            self.step_5_confirm_queue(step_5_data)
        else:
            msg = re.search("messages...(.*?).,", response.text).group(1)
            print msg
Exemplo n.º 3
0
    def step_3_check_order(self, step_4_data, step_5_data):
        '''
        在查询页点击“预订”之后的直到下单一共有以下几个步骤,第三个步骤使用当前方法来实现
        提交订单请求->确认乘客信息->检查订单信息->获得队列信息->确认队列信息->提交订单成功
        :return:
        '''
        print '******************************正在检查订单信息NO.3'
        check_order_url = 'https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo'

        order_data = {
            'oldPassengerStr': step_5_data['oldPassengerStr'],
            'passengerTicketStr': step_5_data['passengerTicketStr'],
            'tour_flag': 'dc',
            'whatsSelect': '1',
            'cancel_flag': '2',
            'randCode': '',
            '_json_att': '',
            'bed_level_order_num': '000000000000000000000000000000',
            'REPEAT_SUBMIT_TOKEN': step_4_data['REPEAT_SUBMIT_TOKEN']
        }

        # 从文件加载cookie
        cookie = load_cookie()
        self.session.cookies.update(cookie)

        response = self.session.post(check_order_url, data=order_data)

        # 检测cookie是否变化,如果有则更新,无则不变
        dict_cookie = dict(cookie)
        check_new_cookie(response.headers, dict_cookie)

        if re.search('submitStatus..(.*?),', response.text).group(1) == 'true':
            #print '>>>>>状态:OK!<<<<<'
            #print '模块:step_3,正在调试!,确认无误,可删掉此处断点',sys.exit()
            # 调用执行第四个步骤的方法
            self.step_4_get_queue_count(step_4_data, step_5_data)
        else:
            print '#####订票信息检查失败#####\n', response.text
Exemplo n.º 4
0
    def step_6_check_ticket_price(self):
        '''
        在查询页点击“预订”之后的直到下单一共有以下几个步骤,第六个步骤使用当前方法来实现
        提交订单请求->确认乘客信息->检查订单信息->获得队列信息->确认队列信息->打印票价
        :return:
        '''
        print '******************************正在查询订票结果NO.6'
        post_data = {'_json_att': ''}
        url = 'https://kyfw.12306.cn/otn/queryOrder/queryMyOrderNoComplete'

        # 从文件加载cookie
        cookie = load_cookie()
        self.session.cookies.update(cookie)

        response = self.session.post(url, data=post_data)
        html = response.content

        # 检测cookie是否变化,如果有则更新,无则不变
        dict_cookie = dict(cookie)
        check_new_cookie(response.headers, dict_cookie)

        check_false_url = 'https://kyfw.12306.cn/otn/queryOrder/initNoCompleteQueue'
        check_true = re.search(self.__passager_name, html)
        check_true_1 = re.search('from_station', html)

        false_msg = self.session.get(check_false_url).content
        check_false = re.search('出票失败', false_msg)
        if check_false:
            print '(︶︿︶) 出票失败了,账号可能单日撤单次数超过3次,请通过浏览器检查!'
            sys.exit()
        elif check_true and check_true_1:
            modify_time = re.search('reserve_time...(.*?).,', html).group(1)
            fromStation = re.search('from_station_name_page....(.*?)..,',
                                    html).group(1)
            toStation = re.search('to_station_name_page....(.*?)..,',
                                  html).group(1)
            startTime = re.search('start_train_date_page...(.*?).,',
                                  html).group(1)
            passengerName = re.search('passenger_name...(.*?).,',
                                      html).group(1)

            print '^_^订票成功!下单时间:%s ,票面信息:\n乘客:%s  出发站:%s  到达站:%s  开车时间:%s'% (modify_time,\
                                                                          passengerName,fromStation,toStation,startTime)
            print '请在30分钟内付款,否则订单将失效!'  #,response.content
            sys.exit()
        elif check_true:
            modify_time = re.search('requestTime...(.*?).,', html).group(1)
            fromStation = re.search('fromStationName...(.*?).,', html).group(1)
            toStation = re.search('toStationName...(.*?).,', html).group(1)
            startTime = re.search('startTimeString...(.*?).,', html).group(1)
            passengerName = re.search('passengerName...(.*?).,', html).group(1)

            print '^_^订票成功!下单时间:%s ,票面信息:\n乘客:%s  出发站:%s  到达站:%s  开车时间:%s' % (modify_time, \
                                                                              passengerName, fromStation, toStation,
                                                                              startTime)
            print '请在30分钟内付款,否则订单将失效!'  # ,response.content
            sys.exit()
        else:
            print '由于查询订票结果的url返回内容不易判断,请使用浏览器检查,一般到达此步90%抢票成功!\n' \
                  '12306系统忙或维护时间!请手动检查\n'
            sys.exit()
Exemplo n.º 5
0
    def step_2_confirm_passager(self, seat_code):
        '''
        在查询页点击“预订”之后的直到下单一共有以下几个步骤,第二个步骤使用当前方法来实现
        提交订单请求->确认乘客信息->检查订单信息->获得队列信息->确认队列信息->提交订单成功
        :param dict_cookie:
        :return:
        '''
        print '******************************正在确认旅客信息NO.2'

        confirm_url = 'https://kyfw.12306.cn/otn/confirmPassenger/initDc'
        #从文件加载cookie
        cookie = load_cookie()
        self.session.cookies.update(cookie)

        response = self.session.post(confirm_url)

        # 检测cookie是否变化,如果有则更新,无则不变
        dict_cookie = dict(cookie)
        check_new_cookie(response.headers, dict_cookie)

        if re.search('退出', response.content):  #李磊

            #print '>>>>>状态:OK!<<<<<'

            #通过开车日期计算出星期几并换算为英文的星期,传递到step_4_data字典中
            date = self.train_date.split('-')

            week = datetime.datetime(int(date[0]), int(date[1]),
                                     int(date[2])).strftime("%w")

            # 定义一个字典存放一些参数,参数将被传递到执行第4个操作的方法中
            step_4_data = {}
            step_4_data['train_date'] = '%s %s %s %s 00:00:00 GMT+0800 (中国标准时间)'%(week_dict[week],\
                                                                                  month_dict[date[1]],date[2],date[0])
            step_4_data['train_no'] = re.search("train_no...(\w+)",
                                                response.text).group(1)
            step_4_data['stationTrainCode'] = re.search(
                "station_train_code...(\w+)", response.text).group(1)
            step_4_data['seatType'] = seat_code
            step_4_data['fromStationTelecode'] = re.search(
                "from_station_telecode...(\w+)", response.text).group(1)
            step_4_data['toStationTelecode'] = re.search(
                "to_station_telecode...(\w+)", response.text).group(1)
            step_4_data['leftTicket'] = re.search("leftTicketStr...(.*?)'",
                                                  response.text).group(1)
            step_4_data['purpose_codes'] = re.search("purpose_codes...(\w+)",
                                                     response.text).group(1)
            step_4_data['train_location'] = re.search(
                "dc...train_location...(\w+)", response.text).group(1)
            step_4_data['REPEAT_SUBMIT_TOKEN'] = re.search(
                "RepeatSubmitToken....(\w+)", response.text).group(1)

            #定义一个字典存放一些参数,参数将被传递到执行第5个操作的方法中
            step_5_data = {}
            #找到乘客的身份证号和手机号
            session = self.session
            ID, CELL_NO = get_passager_id(session, self.__passager_name,
                                          step_4_data['REPEAT_SUBMIT_TOKEN'])
            step_5_data['passengerTicketStr'] = '%s,0,1,%s,1,%s,%s,N'% (seat_code,self.__passager_name,\
                                                                                       ID,CELL_NO)  ######
            step_5_data['oldPassengerStr'] = '%s,1,%s,1_' % (
                self.__passager_name, ID)
            step_5_data['randCode'] = ''
            step_5_data['purpose_codes'] = step_4_data['purpose_codes']
            step_5_data['key_check_isChange'] = re.search(
                'key_check_isChange...(.*?).,', response.text).group(1)
            step_5_data['leftTicketStr'] = re.search('leftTicketStr...(.*?).,',
                                                     response.text).group(1)
            step_5_data['train_location'] = step_4_data['train_location']
            step_5_data['choose_seats'] = ''
            step_5_data['seatDetailType'] = '000'
            step_5_data['whatsSelect'] = '1'
            step_5_data['roomType'] = '00'
            step_5_data['dwAll'] = 'N'
            step_5_data['_json_att'] = ''
            step_5_data['REPEAT_SUBMIT_TOKEN'] = step_4_data[
                'REPEAT_SUBMIT_TOKEN']

            #print 'step_4_data--->',step_4_data,'\n','step_5_data--->',step_5_data
            # print '模块:step_2,正在调试!,确认无误,可删掉此处断点'
            # sys.exit()

            # 调用执行第三个步骤的函数
            self.step_3_check_order(step_4_data, step_5_data)

        else:
            if re.search('登录', response.content):
                print '#####Cookie失效,被重定向到登录页面!#####'
            else:
                print '#####未知页面!#####', response.text
Exemplo n.º 6
0
class PAPAPA12306:
    '''
    初始化参数
    '''
    check_url = 'https://kyfw.12306.cn/otn/leftTicket/queryA?leftTicketDTO.train_date=' \
                '{date}&leftTicketDTO.from_station={Departure}&leftTicketDTO.to_station=' \
                '{Destination}&purpose_codes={Type}'
    session = requests.session()
    header = {'User-Agent': ua}
    session.headers = header
    # 从文件加载cookie
    cookie = load_cookie()
    session.cookies.update(cookie)
    session.verify = False
    #忽略ssl警告信息
    requests.packages.urllib3.disable_warnings()
    # train_date = raw_input('输入乘车日期(如2018-01-01):')
    # __from_station = raw_input('输入起始站点:')
    # __to_station = raw_input('输入到达站点:')
    # __passager_name = raw_input('输入乘客姓名:')
    #__purpose_codes = raw_input('输入车票类型(成人-1,学生-2):')
    ##########################################################################################
    train_date = '2018-01-16'  #开车日期                                                 #
    __from_station = '上海'  #出发站                                                   #
    __to_station = '北京'  #到达站                                                   #
    __purpose_codes = '1'  #忽略                                                          #
    __passager_name = '玲玲'  #旅客姓名                                                 #
    __seat_type = ["硬座"]  #指定坐席类别,可定义多个,靠前优先                            #
    specific_train = ["G104"
                      ]  #指定车次                                                #
    ##########################################################################################

    #定义列表1存放坐席类型对应的第一种代号类型,如'商务座':'business_class',用于后续判断该坐席是否有票
    seat_type = []
    for i in __seat_type:
        seat_type.append(seat_dict[i])

    times = 1
    __NOW_HOUR = int(time.strftime('%H'))
    __NOW_MIN = int(time.strftime('%M'))
    __NOW_SEC = int(time.strftime('%S'))

    def write_data(self):
        '''
        构造查票参数
        :return:
        '''

        train_date = self.train_date
        __from_station = self.__from_station
        __to_station = self.__to_station
        __purpose_codes = self.__purpose_codes
        if __purpose_codes == '1':
            purpose_codes = 'ADULT'
        elif __purpose_codes == '2':
            purpose_codes = '0X00'
        try:
            #print station_dict[u'北京'.encode('gbk')],'111'
            check_url = self.check_url.format(
                date=train_date,
                Departure=station_dict[unicode(__from_station).encode('gbk')],
                Destination=station_dict[unicode(__to_station).encode('gbk')],
                Type=purpose_codes)
            #print check_url
            self.check_ticket_exist(check_url)

        except KeyError:
            print '#####站点不存在!#####'
        except requests.exceptions.SSLError:
            print '无法访问,请关闭SSL验证!'
        # except Exception,e:
        #     print '[write_data.error]-->','查票页面出错,请用浏览器测试!'

    def check_ticket_exist(self, check_url, times=times, proxies=None):
        '''
        查询是否有票
        :param check_url:
        :return:
        '''

        print '******************************正在查询是否有票'
        try:
            response = self.session.get(check_url, proxies=proxies)

            #检测cookie是否变化,如果有则更新cookie文件,无则不变
            dict_cookies = dict(self.cookie)
            check_new_cookie(response.headers, dict_cookies)

            #把字典类型的cookie传递给下一个函数

            html = response.content
            json_data = json.loads(response.text)

        except ValueError:
            print '>>>>>切换代理中'
            times += 1
            self.check_ticket_exist(check_url, times, proxies=Proxies)
        except requests.exceptions.ConnectionError:
            print '>>>>代理失效,重试中<<<<'
            times += 1
            time.sleep(2)
            self.check_ticket_exist(check_url, times, proxies=Proxies)

        if json_data['status'] is True:
            print '>>>>>查询状态:成功!<<<<<'
        else:
            if re.search('status":false', html):
                if re.search('queryA', check_url):
                    self.check_url = re.sub('queryA', 'queryZ', check_url)
                    self.write_data()
                elif re.search('queryZ', check_url):
                    self.check_url = re.sub('queryZ', 'queryA', check_url)
                    self.write_data()
                else:
                    print '查票url有误,请检查!'
                    sys.exit()
            else:
                print '#####查询状态:失败!#####'
                print response.text
                sys.exit()
        #print '>>>>>自动分析站点<<<<<'
        # for i in json_data['data']['map'].values():
        #     print i
        secret_str_list = re.findall('"([\w%]+)[|]', html)
        #print secret_str_list,len(secret_str_list)
        result_list = re.findall('[^"].预订[|]\w+[|](.*?)"', html, re.M)

        if len(result_list) == 0:
            print '#####没有搜索到有效车次结果,当前可能为系统维护时间#####'
            sys.exit()
        else:

            #print '搜索到%s个车次' % len(result_list)
            pass
        Specific_train = self.specific_train

        from cookie_12306 import Rule  #导入预先定义好的规则库
        rule = Rule()  #实例化规则库
        try:
            for t in Specific_train:  #遍历之前指定的车次

                for result in result_list:  #遍历查询到的所有车次
                    if re.search(t, result):  #在查询结果中找到指定车次
                        #print result
                        index = result_list.index(result)
                        secret_str = secret_str_list[
                            index]  #找到对应车次的secret_str字符串值,后面要用

                        list = result.split('|')
                        if list[0].startswith('G'):
                            __dict = rule.check_G_train(list)
                            for seat in self.seat_type:
                                if __dict[seat] and __dict[seat] != '无':
                                    #下单
                                    print '^_^有票! 车次:%s 座席:%s,正在订票!' % (t,
                                                                        seat)
                                    seat_code = seat_type_dict[seat]
                                    self.step_1_submit_train(self.train_date,self.__from_station,self.__to_station,secret_str\
                                                             ,seat_code)

                        elif list[0].startswith('D'):
                            __dict = rule.check_D_train(list)
                            for seat in self.seat_type:
                                if __dict[seat] and __dict[seat] != '无':
                                    #下单
                                    print '^_^有票! 车次:%s 座席:%s,正在订票!' % (t,
                                                                        seat)
                                    seat_code = seat_type_dict[seat]
                                    self.step_1_submit_train(self.train_date, self.__from_station, self.__to_station,secret_str\
                                                             ,seat_code)

                        elif list[0].startswith('K'):
                            __dict = rule.check_K_train(list)
                            for seat in self.seat_type:
                                if __dict[seat] and __dict[seat] != '无':
                                    #下单
                                    print '^_^有票! 车次:%s 座席:%s,正在订票!' % (t,
                                                                        seat)
                                    seat_code = seat_type_dict[seat]
                                    self.step_1_submit_train(self.train_date, self.__from_station, self.__to_station,secret_str\
                                                             ,seat_code)

                        elif list[0].startswith('T'):
                            __dict = rule.check_T_train(list)
                            for seat in self.seat_type:
                                if __dict[seat] and __dict[seat] != '无':
                                    #下单
                                    print '^_^有票! 车次:%s 座席:%s,正在订票!' % (t,
                                                                        seat)
                                    seat_code = seat_type_dict[seat]
                                    self.step_1_submit_train(self.train_date, self.__from_station, self.__to_station,secret_str\
                                                             ,seat_code)
                else:
                    print "(︶︿︶) %s无票!" % t

            else:

                NOW_HOUR = int(time.strftime('%H'))
                NOW_MIN = int(time.strftime('%M'))
                NOW_SEC = int(time.strftime('%S'))
                HOUR = NOW_HOUR - self.__NOW_HOUR
                MIN = NOW_MIN - self.__NOW_MIN
                SEC = NOW_SEC - self.__NOW_SEC
                print '#####已查票%d次,用时%d时%d分%d秒#####' % (times, HOUR, MIN, SEC)
                times += 1
                self.check_ticket_exist(check_url, times)

        except KeyError:
            print '该车次没有这种座席!(若误判,请更新程序)'
            pass

    def step_1_submit_train(self, fromDate, fromStation, toStation, scret_str,
                            seat_code):
        '''
        在查询页点击“预订”之后的直到下单一共有以下几个步骤,第一个步骤使用当前方法来实现
        提交订单请求->确认乘客信息->检查订单信息->获得队列信息->确认队列信息->提交订单成功
        :return:
        '''

        submit_order_url = 'https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest'
        check_user_url = 'https://kyfw.12306.cn/otn/login/checkUser'
        self.header['Origin'] = 'https://kyfw.12306.cn'
        self.header[
            'Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'
        self.header['Content-Length'] = '0'
        #print self.header

        #从文件加载cookie
        cookie = load_cookie()
        self.session.cookies.update(cookie)

        print '检查登录状态'
        response = self.session.post(check_user_url, headers=self.header)

        # 检测cookie是否变化,如果有则更新cookie文件,无则不变
        dict_cookie = dict(cookie)
        check_new_cookie(response.headers, dict_cookie)

        if re.search('flag..(.*?)}', response.text).group(1) == 'false':
            print '未登录!'
            sys.exit()
        #更新cookies(将始到站和出发日期写入cookie)  /otn/confirmPassenger/checkOrderInfo

        dict_cookie['_jc_save_fromDate'] = fromDate
        dict_cookie['_jc_save_fromStation'] = quote(fromStation)
        dict_cookie['_jc_save_toStation'] = quote(toStation)
        #将修改后cookie写入文件
        with open('cookie12306.txt', 'wb') as f:
            json.dump(dict_cookie, f)

        submit_cookie = requests.utils.cookiejar_from_dict(dict_cookie)
        self.session.cookies = submit_cookie

        #构造submit_order 表单参数
        submit_data = {
            'secretStr': unquote(scret_str),
            'train_date': fromDate,  #开车日期
            'back_train_date':
            '2018-1-20',  #回程日期,随意定义,不购买往返票,所以这个参数不起作用,程序暂不实现此功能
            'tour_flag': 'dc',
            'purpose_codes': 'ADULT',
            'query_from_station_name': fromStation,
            'query_to_station_name': toStation,
            'undefined': ''
        }
        print '******************************正在提交订单请求NO.1'
        # 从文件加载cookie
        cookie = load_cookie()
        self.session.cookies.update(cookie)

        response = self.session.post(submit_order_url, data=submit_data)
        # 检测cookie是否变化,如果有则更新,无则不变
        dict_cookie = dict(cookie)
        check_new_cookie(response.headers, dict_cookie)

        try:
            _dict = json.loads(response.text)
            #判断提交订单信息是否成功,这里只是下单步骤中的第一步
            if _dict['status'] == True and _dict['messages'] == []:
                #print '>>>>>状态:OK!<<<<<'

                #调用执行第二个步骤的函数
                self.step_2_confirm_passager(seat_code)

            else:
                if re.search(u'未处理', _dict['messages'][0]):
                    print '#####提示:账号有未处理的订单!#####'
                    sys.exit()
                else:
                    #打印未能成功提交订单请求的提示信息
                    for i in _dict['messages']:
                        print i
        except ValueError:
            #判断是否被重定向
            if re.search(u'登录', response.text):
                print '#####cookie失效,被重定向到登录页,请重新填充cookie!#####'
                sys.exit()
            else:
                #如果是其他错误,打印得到的页面
                print response.text

    def step_2_confirm_passager(self, seat_code):
        '''
        在查询页点击“预订”之后的直到下单一共有以下几个步骤,第二个步骤使用当前方法来实现
        提交订单请求->确认乘客信息->检查订单信息->获得队列信息->确认队列信息->提交订单成功
        :param dict_cookie:
        :return:
        '''
        print '******************************正在确认旅客信息NO.2'

        confirm_url = 'https://kyfw.12306.cn/otn/confirmPassenger/initDc'
        #从文件加载cookie
        cookie = load_cookie()
        self.session.cookies.update(cookie)

        response = self.session.post(confirm_url)

        # 检测cookie是否变化,如果有则更新,无则不变
        dict_cookie = dict(cookie)
        check_new_cookie(response.headers, dict_cookie)

        if re.search('退出', response.content):  #李磊

            #print '>>>>>状态:OK!<<<<<'

            #通过开车日期计算出星期几并换算为英文的星期,传递到step_4_data字典中
            date = self.train_date.split('-')

            week = datetime.datetime(int(date[0]), int(date[1]),
                                     int(date[2])).strftime("%w")

            # 定义一个字典存放一些参数,参数将被传递到执行第4个操作的方法中
            step_4_data = {}
            step_4_data['train_date'] = '%s %s %s %s 00:00:00 GMT+0800 (中国标准时间)'%(week_dict[week],\
                                                                                  month_dict[date[1]],date[2],date[0])
            step_4_data['train_no'] = re.search("train_no...(\w+)",
                                                response.text).group(1)
            step_4_data['stationTrainCode'] = re.search(
                "station_train_code...(\w+)", response.text).group(1)
            step_4_data['seatType'] = seat_code
            step_4_data['fromStationTelecode'] = re.search(
                "from_station_telecode...(\w+)", response.text).group(1)
            step_4_data['toStationTelecode'] = re.search(
                "to_station_telecode...(\w+)", response.text).group(1)
            step_4_data['leftTicket'] = re.search("leftTicketStr...(.*?)'",
                                                  response.text).group(1)
            step_4_data['purpose_codes'] = re.search("purpose_codes...(\w+)",
                                                     response.text).group(1)
            step_4_data['train_location'] = re.search(
                "dc...train_location...(\w+)", response.text).group(1)
            step_4_data['REPEAT_SUBMIT_TOKEN'] = re.search(
                "RepeatSubmitToken....(\w+)", response.text).group(1)

            #定义一个字典存放一些参数,参数将被传递到执行第5个操作的方法中
            step_5_data = {}
            #找到乘客的身份证号和手机号
            session = self.session
            ID, CELL_NO = get_passager_id(session, self.__passager_name,
                                          step_4_data['REPEAT_SUBMIT_TOKEN'])
            step_5_data['passengerTicketStr'] = '%s,0,1,%s,1,%s,%s,N'% (seat_code,self.__passager_name,\
                                                                                       ID,CELL_NO)  ######
            step_5_data['oldPassengerStr'] = '%s,1,%s,1_' % (
                self.__passager_name, ID)
            step_5_data['randCode'] = ''
            step_5_data['purpose_codes'] = step_4_data['purpose_codes']
            step_5_data['key_check_isChange'] = re.search(
                'key_check_isChange...(.*?).,', response.text).group(1)
            step_5_data['leftTicketStr'] = re.search('leftTicketStr...(.*?).,',
                                                     response.text).group(1)
            step_5_data['train_location'] = step_4_data['train_location']
            step_5_data['choose_seats'] = ''
            step_5_data['seatDetailType'] = '000'
            step_5_data['whatsSelect'] = '1'
            step_5_data['roomType'] = '00'
            step_5_data['dwAll'] = 'N'
            step_5_data['_json_att'] = ''
            step_5_data['REPEAT_SUBMIT_TOKEN'] = step_4_data[
                'REPEAT_SUBMIT_TOKEN']

            #print 'step_4_data--->',step_4_data,'\n','step_5_data--->',step_5_data
            # print '模块:step_2,正在调试!,确认无误,可删掉此处断点'
            # sys.exit()

            # 调用执行第三个步骤的函数
            self.step_3_check_order(step_4_data, step_5_data)

        else:
            if re.search('登录', response.content):
                print '#####Cookie失效,被重定向到登录页面!#####'
            else:
                print '#####未知页面!#####', response.text

    def step_3_check_order(self, step_4_data, step_5_data):
        '''
        在查询页点击“预订”之后的直到下单一共有以下几个步骤,第三个步骤使用当前方法来实现
        提交订单请求->确认乘客信息->检查订单信息->获得队列信息->确认队列信息->提交订单成功
        :return:
        '''
        print '******************************正在检查订单信息NO.3'
        check_order_url = 'https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo'

        order_data = {
            'oldPassengerStr': step_5_data['oldPassengerStr'],
            'passengerTicketStr': step_5_data['passengerTicketStr'],
            'tour_flag': 'dc',
            'whatsSelect': '1',
            'cancel_flag': '2',
            'randCode': '',
            '_json_att': '',
            'bed_level_order_num': '000000000000000000000000000000',
            'REPEAT_SUBMIT_TOKEN': step_4_data['REPEAT_SUBMIT_TOKEN']
        }

        # 从文件加载cookie
        cookie = load_cookie()
        self.session.cookies.update(cookie)

        response = self.session.post(check_order_url, data=order_data)

        # 检测cookie是否变化,如果有则更新,无则不变
        dict_cookie = dict(cookie)
        check_new_cookie(response.headers, dict_cookie)

        if re.search('submitStatus..(.*?),', response.text).group(1) == 'true':
            #print '>>>>>状态:OK!<<<<<'
            #print '模块:step_3,正在调试!,确认无误,可删掉此处断点',sys.exit()
            # 调用执行第四个步骤的方法
            self.step_4_get_queue_count(step_4_data, step_5_data)
        else:
            print '#####订票信息检查失败#####\n', response.text

    def step_4_get_queue_count(self, step_4_data, step_5_data):
        '''
        在查询页点击“预订”之后的直到下单一共有以下几个步骤,第四个步骤使用当前方法来实现
        提交订单请求->确认乘客信息->检查订单信息->获得队列信息->确认队列信息->提交订单成功
        :return:
        '''
        print '******************************正在获取队列信息NO.4'

        url = 'https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount'

        # 从文件加载cookie
        cookie = load_cookie()
        self.session.cookies.update(cookie)

        response = self.session.post(url, step_4_data)
        #print response.text

        # 检测cookie是否变化,如果有则更新,无则不变
        dict_cookie = dict(cookie)
        check_new_cookie(response.headers, dict_cookie)

        if re.search("status..true.*?messages....,", response.text):
            #print '>>>>>状态:OK!<<<<<'
            #print '模块:step_4,正在调试!,确认无误,可删掉此处断点', sys.exit()
            #调用执行第五个步骤的方法
            #print step_5_data
            self.step_5_confirm_queue(step_5_data)
        else:
            msg = re.search("messages...(.*?).,", response.text).group(1)
            print msg

    def step_5_confirm_queue(self, step_5_data):
        '''
        在查询页点击“预订”之后的直到下单一共有以下几个步骤,第五个步骤使用当前方法来实现
        提交订单请求->确认乘客信息->检查订单信息->获得队列信息->确认队列信息->打印票价
        :return:
        '''
        print '******************************正在确认队列信息NO.5'

        url = 'https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue'

        # 从文件加载cookie
        cookie = load_cookie()
        self.session.cookies.update(cookie)

        response = self.session.post(url, data=step_5_data)

        # 检测cookie是否变化,如果有则更新,无则不变
        dict_cookie = dict(cookie)
        check_new_cookie(response.headers, dict_cookie)

        if re.search("data....submitStatus..true", response.text):
            #print '>>>>>状态:OK!<<<<<'
            #print '模块:step_5,正在调试!,确认无误,可删掉此处断点', sys.exit()

            time.sleep(2)
            # 调用执行第六个步骤即查询票价的方法
            self.step_6_check_ticket_price()

        else:
            msg = re.search("messages...(.*?).,", response.text).group(1)
            print msg, response.text, sys.exit()

    def step_6_check_ticket_price(self):
        '''
        在查询页点击“预订”之后的直到下单一共有以下几个步骤,第六个步骤使用当前方法来实现
        提交订单请求->确认乘客信息->检查订单信息->获得队列信息->确认队列信息->打印票价
        :return:
        '''
        print '******************************正在查询订票结果NO.6'
        post_data = {'_json_att': ''}
        url = 'https://kyfw.12306.cn/otn/queryOrder/queryMyOrderNoComplete'

        # 从文件加载cookie
        cookie = load_cookie()
        self.session.cookies.update(cookie)

        response = self.session.post(url, data=post_data)
        html = response.content

        # 检测cookie是否变化,如果有则更新,无则不变
        dict_cookie = dict(cookie)
        check_new_cookie(response.headers, dict_cookie)

        check_false_url = 'https://kyfw.12306.cn/otn/queryOrder/initNoCompleteQueue'
        check_true = re.search(self.__passager_name, html)
        check_true_1 = re.search('from_station', html)

        false_msg = self.session.get(check_false_url).content
        check_false = re.search('出票失败', false_msg)
        if check_false:
            print '(︶︿︶) 出票失败了,账号可能单日撤单次数超过3次,请通过浏览器检查!'
            sys.exit()
        elif check_true and check_true_1:
            modify_time = re.search('reserve_time...(.*?).,', html).group(1)
            fromStation = re.search('from_station_name_page....(.*?)..,',
                                    html).group(1)
            toStation = re.search('to_station_name_page....(.*?)..,',
                                  html).group(1)
            startTime = re.search('start_train_date_page...(.*?).,',
                                  html).group(1)
            passengerName = re.search('passenger_name...(.*?).,',
                                      html).group(1)

            print '^_^订票成功!下单时间:%s ,票面信息:\n乘客:%s  出发站:%s  到达站:%s  开车时间:%s'% (modify_time,\
                                                                          passengerName,fromStation,toStation,startTime)
            print '请在30分钟内付款,否则订单将失效!'  #,response.content
            sys.exit()
        elif check_true:
            modify_time = re.search('requestTime...(.*?).,', html).group(1)
            fromStation = re.search('fromStationName...(.*?).,', html).group(1)
            toStation = re.search('toStationName...(.*?).,', html).group(1)
            startTime = re.search('startTimeString...(.*?).,', html).group(1)
            passengerName = re.search('passengerName...(.*?).,', html).group(1)

            print '^_^订票成功!下单时间:%s ,票面信息:\n乘客:%s  出发站:%s  到达站:%s  开车时间:%s' % (modify_time, \
                                                                              passengerName, fromStation, toStation,
                                                                              startTime)
            print '请在30分钟内付款,否则订单将失效!'  # ,response.content
            sys.exit()
        else:
            print '由于查询订票结果的url返回内容不易判断,请使用浏览器检查,一般到达此步90%抢票成功!\n' \
                  '12306系统忙或维护时间!请手动检查\n'
            sys.exit()
Exemplo n.º 7
0
    def step_1_submit_train(self, fromDate, fromStation, toStation, scret_str,
                            seat_code):
        '''
        在查询页点击“预订”之后的直到下单一共有以下几个步骤,第一个步骤使用当前方法来实现
        提交订单请求->确认乘客信息->检查订单信息->获得队列信息->确认队列信息->提交订单成功
        :return:
        '''

        submit_order_url = 'https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest'
        check_user_url = 'https://kyfw.12306.cn/otn/login/checkUser'
        self.header['Origin'] = 'https://kyfw.12306.cn'
        self.header[
            'Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'
        self.header['Content-Length'] = '0'
        #print self.header

        #从文件加载cookie
        cookie = load_cookie()
        self.session.cookies.update(cookie)

        print '检查登录状态'
        response = self.session.post(check_user_url, headers=self.header)

        # 检测cookie是否变化,如果有则更新cookie文件,无则不变
        dict_cookie = dict(cookie)
        check_new_cookie(response.headers, dict_cookie)

        if re.search('flag..(.*?)}', response.text).group(1) == 'false':
            print '未登录!'
            sys.exit()
        #更新cookies(将始到站和出发日期写入cookie)  /otn/confirmPassenger/checkOrderInfo

        dict_cookie['_jc_save_fromDate'] = fromDate
        dict_cookie['_jc_save_fromStation'] = quote(fromStation)
        dict_cookie['_jc_save_toStation'] = quote(toStation)
        #将修改后cookie写入文件
        with open('cookie12306.txt', 'wb') as f:
            json.dump(dict_cookie, f)

        submit_cookie = requests.utils.cookiejar_from_dict(dict_cookie)
        self.session.cookies = submit_cookie

        #构造submit_order 表单参数
        submit_data = {
            'secretStr': unquote(scret_str),
            'train_date': fromDate,  #开车日期
            'back_train_date':
            '2018-1-20',  #回程日期,随意定义,不购买往返票,所以这个参数不起作用,程序暂不实现此功能
            'tour_flag': 'dc',
            'purpose_codes': 'ADULT',
            'query_from_station_name': fromStation,
            'query_to_station_name': toStation,
            'undefined': ''
        }
        print '******************************正在提交订单请求NO.1'
        # 从文件加载cookie
        cookie = load_cookie()
        self.session.cookies.update(cookie)

        response = self.session.post(submit_order_url, data=submit_data)
        # 检测cookie是否变化,如果有则更新,无则不变
        dict_cookie = dict(cookie)
        check_new_cookie(response.headers, dict_cookie)

        try:
            _dict = json.loads(response.text)
            #判断提交订单信息是否成功,这里只是下单步骤中的第一步
            if _dict['status'] == True and _dict['messages'] == []:
                #print '>>>>>状态:OK!<<<<<'

                #调用执行第二个步骤的函数
                self.step_2_confirm_passager(seat_code)

            else:
                if re.search(u'未处理', _dict['messages'][0]):
                    print '#####提示:账号有未处理的订单!#####'
                    sys.exit()
                else:
                    #打印未能成功提交订单请求的提示信息
                    for i in _dict['messages']:
                        print i
        except ValueError:
            #判断是否被重定向
            if re.search(u'登录', response.text):
                print '#####cookie失效,被重定向到登录页,请重新填充cookie!#####'
                sys.exit()
            else:
                #如果是其他错误,打印得到的页面
                print response.text