下面是关于“利用Python代码写的12306订票代码”的完整攻略:
1. 背景介绍
12306是中国铁路客户服务中心开发的一套网络订票系统,也是全国人民购买火车票的主要途径之一。由于12306订票系统访问量大、用户集中,往往会出现抢票难的情况,因此有些程序员开发了一些自动化的代码来辅助用户进行抢票,提高购票成功率。
2. 编写过程
2.1 获取登录验证码
在进行订票前需要登录12306系统,因此需要获取登录页面的验证码。下面是获取验证码的Python代码示例:
import requests
import re
from PIL import Image
# 获取登录页面html
url = 'https://kyfw.12306.cn/otn/login/init'
html = requests.get(url).text
# 解析登录页面获取验证码图片地址
img_url = re.findall(r'id="loginImg".*?src="(.*?)".*?', html)[0]
# 下载验证码图片并打开
img = Image.open(requests.get(img_url, stream=True).raw)
img.show()
# 获取用户输入的验证码
code = input('请输入验证码:')
2.2 提交登录信息
在获取了验证码之后,需要提交登录表单来进行登录,下面是Python代码示例:
import requests
# 构建登录表单
data = {
'loginUserDTO.user_name': 'username',
'userDTO.password': 'password',
'randCode': code,
'_json_att': ''
}
# 提交登录表单
url = 'https://kyfw.12306.cn/passport/web/login'
response = requests.post(url, data=data, allow_redirects=False)
# 检查登录是否成功,成功的话会返回302跳转链接
if response.status_code == 302:
print('登录成功!')
else:
print('登录失败,请检查用户名和密码以及验证码是否正确。')
2.3 查询车票信息
登录成功后,需要查询车票信息来进行抢票,下面是Python代码示例:
import requests
import json
# 构建查询车次的url
date = '2022-01-02'
from_station = 'CQW'
to_station = 'BJP'
url = f'https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={date}&leftTicketDTO.from_station={from_station}&leftTicketDTO.to_station={to_station}&purpose_codes=ADULT'
# 查询车次信息
response = requests.get(url)
data = json.loads(response.text)
# 解析车次信息
results = data['data']['result']
for result in results:
items = result.split('|')
train_no = items[2]
start_station = items[6]
end_station = items[7]
start_time = items[8]
end_time = items[9]
duration = items[10]
print(f'车次:{train_no},出发站:{start_station},到达站:{end_station},出发时间:{start_time},到达时间:{end_time},历时:{duration}')
2.4 提交抢票请求
查询到符合要求的车次后,就可以提交抢票请求了,下面是Python代码示例:
import requests
# 构建提交抢票信息的url和表单
train_date = '2022-01-02'
train_no = 'G101'
from_station = 'CQW'
to_station = 'BJP'
passenger_name = '张三'
data = {
'secretStr': '',
'train_date': train_date,
'back_train_date': '2022-01-01',
'tour_flag': 'dc',
'purpose_codes': 'ADULT',
'query_from_station_name': '重庆万州',
'query_to_station_name': '北京',
'undefined': '',
'cancel_flag': '2',
'bed_level_order_num': '000000000000000000000000000000',
'passengerTicketStr': f'1,0,1,{passenger_name},1,ID Card,15723456789N,,
'oldPassengerStr': f'{passenger_name},1,ID Card,15723456789N_',
'tour_flag': 'dc',
'randCode': ''
}
url = f'https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest'
response = requests.post(url, data=data)
# 检查提交是否成功,成功的话会返回json格式的数据,其中submitStatus为True
if response.json()['status'] == True:
print('提交抢票请求成功!')
else:
print('提交失败,请检查信息是否正确。')
3. 注意事项
- 对于使用自动化代码抢票的行为,12306官方并不支持,因此使用此代码可能会存在一定风险。
- 本文提供的代码仅供学习交流使用,请勿用于非法用途。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用python代码写的12306订票代码 - Python技术站