美文网首页
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.构造时间参数以及下单购票

    构造时间参数以及下单购票 学习目标 了解 构造时间参数 了解 下单购票逻辑 5.1 构造时间参数 5.2 下单购票...

  • Java 日期类Date 学习

    Java日期构造 构造函数1 声明一个日期, 默认返回当前系统时间 Date() 构造函数2 接收一个参数,该参数...

  • JavaScript - 时间对象 Date

    Date 类型提供了有关日期和时间的信息,包括当前日期和时间以及相关的计算功能。 创建日期对象: 构造函数不传参数...

  • 创建型之建造者模式

    建造者模式(Builder Pattern) 使用简单的主体对象,通过不同的构造参数、构造参数的数目、构造参数的数...

  • Swift参数及泛型参数参考!

    本节涉及泛型类型、泛型函数以及泛型构造器的参数,包括形参和实参。声明泛型类型、函数或构造器时,须指定相应的类型参数...

  • Spring-ioc-配置

    创建对象的方式 本质就是调用对象的构造函数,不指定为调用无参构造函数 通过参数下标构造 通过参数名称构造 通过参数...

  • swift值类型struct的初始化

    1. 不带参数的构造器init 2. 构造参数 第一个构造器有一个构造参数,其外部名字为fromFahrenhei...

  • [译]Scala Extractor Objects

    Extractor Object是有unapply方法的对象。apply方法像是构造函数,可以带参数以及创建对象,...

  • JAVA 的继承-子类与父类之间的复杂关系

    调用子类,先进行父类的参数定义和构造器构造,再进行子类的参数定义和构造器构造;如果子类构造器中没有 super()...

  • kotlin默认参数以及@JvmOverloads

    kotlin默认参数方法以及@JvmOverloads 我们先来看看java中的构造方法 我们都知道java方法中...

网友评论

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

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