美文网首页
46.构造时间参数以及下单购票

46.构造时间参数以及下单购票

作者: M_小七 | 来源:发表于2020-08-30 16:43 被阅读0次

    构造时间参数以及下单购票

    学习目标
    1. 了解 构造时间参数
    2. 了解 下单购票逻辑

    5.1 构造时间参数

    # 12306.utils.parse_date
    
    import datetime
    
    def parseDate(train_date):
        """
        :param train_date: '2017-12-12'
        :return:
        """
        week_name = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
        month_name = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split()
        y, m, d = map(int, train_date.split("-"))
        weekday = datetime.datetime(y, m, d).weekday()
        # Fri Nov 24 2017 00:00:00 GMT+0800 (中国标准时间)
        return "{0} {1} {2} {3} 00:00:00 GMT+0800 (中国标准时间)".format(week_name[weekday], month_name[m - 1], d, y)
    
    

    5.2 下单购票

    # 12306.funk12306.Funk12306.buy_ticket
    
            # 提交订单,并获取排队人数,和车票的真实余数
            url = 'https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount'
            data = {
                'train_date': parseDate(train_date),  # Fri Nov 24 2017 00:00:00 GMT+0800 (中国标准时间)
                'train_no': train_info_dict['train_no'],  # 6c0000G31205
                'stationTrainCode': train_info_dict['stationTrainCode'],  # G312
                'seatType': seat_type,  # 席别
                'fromStationTelecode': train_info_dict['from_station'],  # one_train[6]
                'toStationTelecode': train_info_dict['to_station'],  # ? one_train[7]
                'leftTicket': train_info_dict['leftTicket'],  # one_train[12]
                'purpose_codes': '00',
                'train_location': train_info_dict['train_location'],  # one_train[15]
                '_json_att': '',
                'REPEAT_SUBMIT_TOKEN': repeat_submit_token
            }
            resp = self.s.post(url, data=data)
            print(resp.text)
            print('此时排队买票的人数为:{}'.format(json.loads(resp.text)['data']['count']))
            ticket = json.loads(resp.text)['data']['ticket']
            print('此时该车次的余票数量为:{}'.format(ticket))
            if ticket == '0':
                print('没有余票,购票失败')
                return '没有余票,购票失败'
    
            # 确认订单,进行扣票 需要 key_check_isChange
            url = 'https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue'
            data = {
                'passengerTicketStr': passengerTicketStr.encode('utf-8'),
                'oldPassengerStr': oldPassengerStr.encode('utf-8'),
                'randCode': '',
                'purpose_codes': '00',
                'key_check_isChange': key_check_isChange,
                'leftTicketStr': leftTicket,
                'train_location': train_location,  # one_train[15]
                'choose_seats': '',  # 选择坐席 ABCDEF 上中下铺 默认为空不选
                'seatDetailType': '000',
                'whatsSelect': '1',
                'roomType': '00',
                'dwAll': 'N',  # ?
                '_json_att': '',
                'REPEAT_SUBMIT_TOKEN': repeat_submit_token
            }
            resp = self.s.post(url, data=data)
            print(json.loads(resp.text))
            if json.loads(resp.text)['status'] == False or json.loads(resp.text)['data']['submitStatus'] == False:
                print('扣票失败')
                return '扣票失败'
    
            # 排队等待 返回waittime  获取 requestID 和 orderID
            timestamp = str(int(time.time() * 1000))  # str(time.time() * 1000)[:-4]
            url = 'https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime?random=%s&tourFlag=dc&_json_att=&REPEAT_SUBMIT_TOKEN=%s' % (
                timestamp, repeat_submit_token)
            resp = self.s.get(url)
            print(resp.text)
            try:
                orderID = json.loads(resp.text)['data']['orderId']
            except:
                # 排队等待 返回waittime  获取 requestID 和 orderID
                timestamp = str(int(time.time() * 1000)) # str(time.time() * 1000)[:-4]
                url = 'https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime?random=%s&tourFlag=dc&_json_att=&REPEAT_SUBMIT_TOKEN=%s' % (
                    timestamp, repeat_submit_token)
                resp = self.s.get(url)
                print(resp.text)
                try:
                    orderID = json.loads(resp.text)['data']['orderId']
                except:
                    return '购票失败'
    
            # 订单结果
            url = 'https://kyfw.12306.cn/otn/confirmPassenger/resultOrderForDcQueue'
            data = {
                'orderSequence_no': orderID,
                '_json_att': '',
                'REPEAT_SUBMIT_TOKEN': repeat_submit_token
            }
            resp = self.s.post(url, data=data)
            print(resp.text)
    

    5.3 组织运行逻辑

    # 12306.funk12306.Funk12306.run
        def run(self):
            # 登录 获取cookies
            self.get_cookies()
            # 买票
            self.buy_ticket()
            
    if __name__ == '__main__':
        username = input('请输入12306账号:')
        password = input('请输入12306密码:')
    
        funk = Funk12306(username, password)
        funk.run()
    

    小结
    1. 了解 构造时间参数
    2. 了解 下单购票逻辑

    相关文章

      网友评论

          本文标题:46.构造时间参数以及下单购票

          本文链接:https://www.haomeiwen.com/subject/mxeerktx.html