构造时间参数以及下单购票
学习目标
- 了解 构造时间参数
- 了解 下单购票逻辑
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()
小结
- 了解 构造时间参数
- 了解 下单购票逻辑
网友评论