下面是Python实现12306自动抢火车票功能的完整攻略。
一、前期准备
1. 确定目标站点和车次
首先需要确认需要抢票的站点和车次,可以通过12306官网查询。在代码中需要提前设置好这些信息。
2. 安装必要的库
需要安装的库有:
- requests:用于发送HTTP请求,获取页面内容;
- Pillow:用于处理图片。
可以通过以下命令安装:
pip install requests Pillow
3. 获取验证码图片
在抢票过程中,需要先验证身份信息,其中涉及到验证码的识别。可以使用以下方法获取验证码图片:
- 利用requests库向12306发送“获取验证码”的请求,获取验证码图片的下载地址;
- 使用Pillow库下载验证码图片,并进行预处理操作;
- 展示预处理后的验证码图片,等待用户手动输入验证码内容。
当然,也可以通过第三方的验证码识别API来实现自动识别验证码,但需要额外的费用支持。
二、抢票流程
1. 登录
在抢票之前需要先登录12306账号。可以通过以下方法实现:
- 利用requests库向12306发送登录请求,获取登录页面的HTML代码;
- 解析登录页面的HTML代码,获取登录表单的一些关键信息(如lt、execution等);
- 向12306发送登录表单数据,获取登录状态(一般是重定向页面)。
2. 查询余票
查询余票可以通过调用12306的接口来实现,接口地址为:https://kyfw.12306.cn/otn/leftTicket/query。需要提供如下参数:
参数名 | 描述 |
---|---|
leftTicketDTO.train_date | 乘车日期,格式为YYYY-MM-DD |
leftTicketDTO.from_station | 出发站点的三字码 |
leftTicketDTO.to_station | 到达站点的三字码 |
purpose_codes | 出行人群类型,可以使用adult ,表示成人(学生票类型可以使用0X00 ) |
调用接口后,可以获取到该车次的所有余票信息。
3. 提交订单
提交订单需要向12306发送订单信息,包括出发站点、到达站点、日期、车次、座位等级、乘客信息等。如果订单信息填写无误,且指定座位有余票,则可以提交订单并获得订单号。
需要注意的是,提交订单之前需要提前锁定车票信息(即在12306系统中标记该车次、该座位已被预订),否则可能会出现提交订单失败的情况。
4. 支付
获取订单号后,需要进行支付操作才能完成购票流程。可以通过调用12306的支付接口来完成支付操作,接口地址为:https://kyfw.12306.cn/otn//pay/orderPay。需要提供的参数有:
参数名 | 描述 |
---|---|
bank_type | 银行类型(暂时不用填) |
defaultbank | 默认银行(暂时不用填) |
force | 强制刷新(暂时不用填) |
fromStationTeleCode | 出发站点的电话代码(例如010) |
leftTicket | 接口返回的余票信息,订单提交时需要提供该信息 |
orderSequence_no | 订单号 |
payFlag | 支付方式,可以使用onlineBank |
platform | 支付平台,可以使用ICICI_XIAN |
purpose_codes | 出行人群类型,可以使用1 (学生票类型可以使用2 ) |
seatDetailType | 座位类型,例如硬座可以使用1 |
seatType | 座位等级,例如软卧可以使用3 |
stationTrainCode | 车次号 |
toStationTeleCode | 到达站点的电话代码(例如Shanghai) |
token | 接口返回的token,用于支付时验证 |
totalFee | 订单总金额 |
train_location | 车次位置,需要在获取余票信息时先保存,用于订单提交时标记该车次正在抢票 |
示例一:获取验证码图片
import requests
from PIL import Image
from io import BytesIO
# 设置会话,保持会话状态
s = requests.Session()
# 发送获取验证码的请求
response = s.get('https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand')
# 将返回的bytes类型数据转成Image对象
image = Image.open(BytesIO(response.content))
# 预处理验证码图片
# ...
# 显示处理后的验证码图片
image.show()
# 提示用户输入验证码
captcha = input('输入验证码:')
示例二:查询余票
import requests
# 设置会话,保持会话状态
s = requests.Session()
# 定义url和查询参数
url = 'https://kyfw.12306.cn/otn/leftTicket/query'
params = {
'leftTicketDTO.train_date': '2022-01-01',
'leftTicketDTO.from_station': 'BJP',
'leftTicketDTO.to_station': 'SHH',
'purpose_codes': 'ADULT',
}
# 发送查询余票的请求,获取响应
response = s.get(url, params=params)
# 解析响应数据
data = response.json()
results = data['data']['result']
# 打印余票信息
for result in results:
# ...
以上就是Python实现12306自动抢火车票功能的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现12306自动抢火车票功能 - Python技术站