Python实现12306自动抢火车票功能

下面是Python实现12306自动抢火车票功能的完整攻略。

一、前期准备

1. 确定目标站点和车次

首先需要确认需要抢票的站点和车次,可以通过12306官网查询。在代码中需要提前设置好这些信息。

2. 安装必要的库

需要安装的库有:

  • requests:用于发送HTTP请求,获取页面内容;
  • Pillow:用于处理图片。

可以通过以下命令安装:

pip install requests Pillow

3. 获取验证码图片

在抢票过程中,需要先验证身份信息,其中涉及到验证码的识别。可以使用以下方法获取验证码图片:

  1. 利用requests库向12306发送“获取验证码”的请求,获取验证码图片的下载地址;
  2. 使用Pillow库下载验证码图片,并进行预处理操作;
  3. 展示预处理后的验证码图片,等待用户手动输入验证码内容。

当然,也可以通过第三方的验证码识别API来实现自动识别验证码,但需要额外的费用支持。

二、抢票流程

1. 登录

在抢票之前需要先登录12306账号。可以通过以下方法实现:

  1. 利用requests库向12306发送登录请求,获取登录页面的HTML代码;
  2. 解析登录页面的HTML代码,获取登录表单的一些关键信息(如lt、execution等);
  3. 向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技术站

(1)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • python计算数字或者数组的阶乘的实现

    要计算数字或数组的阶乘,可以使用Python的标准库math中的函数来实现。另外,Python中也有其他的实现方式。 使用math库中的函数 使用math库提供的阶乘函数,允许计算大数字的阶乘。 import math # 计算5的阶乘 factorial = math.factorial(5) print(factorial) # 输出120 使用循环 另…

    python 2023年6月5日
    00
  • Python通用函数实现数组计算的方法

    下面我会为您详细讲解“Python通用函数实现数组计算的方法”的完整攻略。 什么是Python通用函数 Python通用函数是一组用于对数组进行逐元素操作的函数,可以实现多种数组计算功能。通用函数可以接受一个或多个标量值,并对数组的每个元素进行相应的操作,并将结果返回为一个新的数组。通用函数可以对数组进行基本运算(如加法、减法、乘法、除法等)、三角函数、指数…

    python 2023年6月5日
    00
  • Python 并发的意义

    Python 并发是指一次执行多个任务,这在处理大规模数据、网络爬虫等场景下非常有用。在 Python 中,有三种主要的并发处理方式:多线程、多进程和协程。下面将对它们一个个进行详细讲解,以及演示它们的使用方法。 多线程并发 多线程并发在 Python 中使用非常广泛,通过在同一进程内使用多个线程,可以同时完成多个任务。下面是使用多线程并发的示例代码: im…

    python-answer 2023年3月25日
    00
  • Python动态生成多维数组的方法示例

    Python是一种高级编程语言,支持动态生成多维数组。本文将详细讲解Python动态生成多维数组的方法,并且给出两个示例说明。 1. Python动态生成多维数组的方法 Python中动态生成多维数组主要有以下两种方法: 1.1 使用列表生成式 通过使用列表生成式,可以简单地生成多维数组,比如: arr = [[0] * 5 for i in range(3…

    python 2023年5月14日
    00
  • Python入门教程(四十三)Python的NumPy数据类型

    Python入门教程(四十三)Python的NumPy数据类型 简介 NumPy是Python科学计算的基础库之一,实现了N维数组对象和一系列的数组操作函数。使用NumPy可以进行向量化计算,从而更加高效地处理大规模数据。本篇教程将介绍NumPy的数据类型。 数据类型 NumPy与Python内置的数据类型不同,它提供了更多支持科学计算的数据类型。常用的数据…

    python 2023年6月5日
    00
  • 四种Python机器学习超参数搜索方法总结

    关于“四种Python机器学习超参数搜索方法总结”的完整攻略,我将从以下几个方面进行讲解: 超参数的概念与搜索方法 网格搜索(Grid Search)的原理和Python代码示例 随机搜索(Random Search)的原理和Python代码示例 贝叶斯优化(Bayesian Optimization)的原理和Python代码示例 遗传算法(Genetic …

    python 2023年6月3日
    00
  • flask中主动抛出异常及统一异常处理代码示例

    针对”flask中主动抛出异常及统一异常处理”,下面是完整的攻略: 异常处理的原理 在Flask程序中,异常处理是围绕着 Flask 的 Exception 类型展开的。我们可以通过创建自己的异常类,以及编写对应的异常处理装饰器来实现自己的异常捕捉和处理。 Flask提供了两个主要的装饰器,用于异常处理: @app.errorhandler() – 用于全局…

    python 2023年5月13日
    00
  • python utc datetime转换为时间戳的方法

    下面是详细讲解 “Python UTC datetime转换为时间戳的方法” 的完整攻略: 什么是时间戳 时间戳是指某个时间点与某个固定的日期时间点(称为“基准时间”)之间的间隔,一般是指从 1970 年 1 月 1 日 0 时 0 分 0 秒(UTC 时间,称为“基准时间”)起至现在的总秒数。 Python 中的时间戳 在 Python 中,可以使用 ti…

    python 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部