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

yizhihongxing

下面是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日

相关文章

  • Python2与Python3关于字符串编码处理的差别总结

    Python2与Python3关于字符串编码处理的差别总结 Python2与Python3在字符串编码处理方面有很多的差别,本文将从以下几个方面进行介绍: 编码方式变化 字符串类型变化 字符串格式化变化 IOError处理变化 编码方式变化 Python2默认使用ASCII编码,这会导致在处理非ASCII字符时会出现问题,如中文、日文等。而Python3默认…

    python 2023年5月20日
    00
  • Python利用Beautiful Soup模块搜索内容详解

    BeautifulSoup是一个Python库,用于从HTML和XML文件中提取数据。它提供了一种简单的方式来遍历文档树,并提供了一些有用的方法来搜索和操作文档树。以下是Python利用BeautifulSoup模块搜索内容的详细攻略: 安装BeautifulSoup 在使用BeautifulSoup之前,需要先安装BeautifulSoup。可以使用pip…

    python 2023年5月14日
    00
  • Python执行时间的几种计算方法

    当我们在编写Python程序时,我们经常会需要计算代码的执行时间。在Python中,我们可以使用多种方式来计算程序的执行时间,下面详细介绍一些常用的方法。 方法一:使用time模块计算程序的执行时间 Python的time模块提供了一些函数来获取当前的时间和日期,我们可以利用它来计算Python程序的执行时间。下面是一个例子: import time sta…

    python 2023年5月30日
    00
  • python的多元数据类型(下)

    当谈到Python的数据类型时,通常会谈到其五种基本类型。但实际上Python还支持不止这几种类型。在本文中,我们将介绍Python中的多元数据类型,包括元组(Tuple)、集合(Set)和字典(Dictionary)。 元组(Tuple) 元组是一个有序且不可变的数据类型,表示为一组用逗号隔开的值,可以通过索引访问每个元素。元组和列表的唯一不同是:元组不能…

    python 2023年5月14日
    00
  • Python常用编码的区别介绍

    当我们写Python代码时,有多种编码方式可供选择,而不同的编码方式之间也存在一些区别。下面我会逐一讲解常用的三种编码方式,它们分别是ASCII、UTF-8和ISO-8859-1。 ASCII编码 ASCII编码是最早的一种字符编码方式,它使用7个比特位来表示一个字符,总共可以表示128种不同的字符,包括26个英文字母、数字、符号等。 ASCII编码逐渐被淘…

    python 2023年5月20日
    00
  • python / cython编译pyx:致命错误:capsule.h:没有这样的文件或目录

    【问题标题】:python/cython compiling pyx: fatal error: capsule.h: No such file or directorypython / cython编译pyx:致命错误:capsule.h:没有这样的文件或目录 【发布时间】:2023-04-06 16:43:01 【问题描述】: 我最近在一个 python…

    Python开发 2023年4月7日
    00
  • python中带有直方图的高级掷骰子模拟器

    【问题标题】:advanced dice roll simulator w/ histogram in pythonpython中带有直方图的高级掷骰子模拟器 【发布时间】:2023-04-01 02:19:02 【问题描述】: 我正在编写一个程序,询问用户骰子的数量和骰子的边数。它计算每个值滚动了多少次,然后将它们放在一个列表中。然后我必须打印列表以及百分…

    Python开发 2023年4月8日
    00
  • Python中使用platform模块获取系统信息的用法教程

    获取系统信息是编写Python程序时经常需要的功能之一。Python标准库中提供了许多获取系统信息的模块,其中就包括platform模块。使用platform模块可以获取有关操作系统的各种信息。下面,我们将详细讲解Python中使用platform模块获取系统信息的用法教程。 1. 安装platform模块 在使用platform模块之前,需要先安装该模块。…

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