通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

如何用python抢12306票

如何用python抢12306票

使用Python抢12306票的核心步骤包括:获取并解析12306的接口、模拟登录、查找车票信息、提交订单、处理验证码。 其中,获取并解析12306的接口是最为关键的一步,因为12306网站的接口会定期进行更新和升级,确保接口的有效性和及时性是成功抢票的前提。

一、获取并解析12306的接口

1、了解12306的接口

要使用Python抢票,首先需要了解12306网站的接口。12306的接口包括查询车次信息、用户登录、订票、支付等多个方面。具体接口可以通过抓包工具如Fiddler或Charles来获取,抓包工具可以帮助我们捕获12306网站的HTTP请求和响应,从而分析出具体的接口地址和请求参数。

2、解析接口数据

获取到接口之后,需要解析12306返回的数据。12306的接口通常返回的是JSON格式的数据,需要使用Python的json库进行解析。解析之后的数据可以帮助我们获取车次、余票等信息,进而进行后续的抢票操作。

二、模拟登录

1、获取登录页面

在进行抢票操作之前,首先需要进行登录操作。12306的登录页面可以通过抓包工具获取其请求地址和请求参数。通常,登录页面会返回一个需要输入的验证码图片。

2、处理验证码

登录12306时,通常需要输入验证码。可以使用Python的图像处理库如PIL来处理验证码图片,然后通过一些机器学习算法如CNN来识别验证码内容,或者使用一些第三方的验证码识别服务来识别验证码。

3、发送登录请求

处理完验证码之后,需要将登录请求发送给12306的服务器。登录请求通常包括用户名、密码、验证码等信息,发送登录请求之后,服务器会返回登录结果。

三、查找车票信息

1、查询车次

登录成功之后,可以进行车次查询操作。车次查询接口可以通过抓包工具获取其请求地址和请求参数。请求参数通常包括出发地、目的地、出发日期等信息。

2、解析查询结果

查询车次接口返回的数据通常是JSON格式的数据,需要使用Python的json库进行解析。解析之后的数据可以帮助我们获取车次、余票等信息。

四、提交订单

1、选择车次

在获取到车次信息之后,需要选择一个合适的车次进行订票操作。选择车次的依据可以是车次的时间、余票数量等信息。

2、填写订单信息

选择车次之后,需要填写订单信息。订单信息通常包括乘车人信息、座位类型等。可以通过抓包工具获取填写订单的请求地址和请求参数。

3、提交订单请求

填写完订单信息之后,需要将订单请求发送给12306的服务器。提交订单请求之后,服务器会返回订单结果。

五、处理验证码

在提交订单之后,通常还需要进行验证码的处理。可以使用Python的图像处理库如PIL来处理验证码图片,然后通过一些机器学习算法如CNN来识别验证码内容,或者使用一些第三方的验证码识别服务来识别验证码。

六、具体代码实现

import requests

import json

from PIL import Image

import pytesseract

登录12306

def login(username, password):

login_url = 'https://kyfw.12306.cn/passport/web/login'

captcha_url = 'https://kyfw.12306.cn/passport/captcha/captcha-image'

captcha_check_url = 'https://kyfw.12306.cn/passport/captcha/captcha-check'

# 获取验证码

captcha_response = requests.get(captcha_url)

captcha_image = Image.open(BytesIO(captcha_response.content))

captcha_image.show()

captcha_code = input("请输入验证码:")

# 验证验证码

captcha_check_response = requests.post(captcha_check_url, data={'answer': captcha_code, 'rand': 'sjrand', 'login_site': 'E'})

if captcha_check_response.json()['result_code'] != '4':

print("验证码错误")

return False

# 登录

login_response = requests.post(login_url, data={'username': username, 'password': password, 'appid': 'otn', 'answer': captcha_code})

if login_response.json()['result_code'] != 0:

print("登录失败")

return False

print("登录成功")

return True

查询车次

def query_tickets(from_station, to_station, date):

query_url = f'https://kyfw.12306.cn/otn/leftTicket/queryA?leftTicketDTO.train_date={date}&leftTicketDTO.from_station={from_station}&leftTicketDTO.to_station={to_station}&purpose_codes=ADULT'

query_response = requests.get(query_url)

tickets = query_response.json()['data']['result']

for ticket in tickets:

print(ticket)

提交订单

def submit_order(train_no, from_station, to_station, date, passenger_name, passenger_id, seat_type):

submit_url = 'https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest'

passenger_url = 'https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs'

check_order_url = 'https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo'

queue_url = 'https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount'

confirm_url = 'https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue'

# 提交订单请求

submit_response = requests.post(submit_url, data={'secretStr': train_no, 'train_date': date, 'back_train_date': date, 'tour_flag': 'dc', 'purpose_codes': 'ADULT', 'query_from_station_name': from_station, 'query_to_station_name': to_station, 'undefined': ''})

if submit_response.json()['status'] != True:

print("提交订单失败")

return False

# 获取乘车人信息

passenger_response = requests.post(passenger_url)

passengers = passenger_response.json()['data']['normal_passengers']

for passenger in passengers:

if passenger['passenger_name'] == passenger_name and passenger['passenger_id_no'] == passenger_id:

passenger_ticket_str = f"{seat_type},0,1,{passenger_name},1,{passenger_id},{passenger_id[:6]}"

# 检查订单信息

check_order_response = requests.post(check_order_url, data={'cancel_flag': 2, 'bed_level_order_num': '000000000000000000000000000000', 'passengerTicketStr': passenger_ticket_str, 'oldPassengerStr': f"{passenger_name},1,{passenger_id},1_", 'tour_flag': 'dc', 'randCode': ''})

if check_order_response.json()['data']['submitStatus'] != True:

print("检查订单信息失败")

return False

# 获取排队信息

queue_response = requests.post(queue_url, data={'train_date': date, 'train_no': train_no, 'stationTrainCode': train_no, 'seatType': seat_type, 'fromStationTelecode': from_station, 'toStationTelecode': to_station, 'leftTicket': '', 'purpose_codes': '00', 'train_location': ''})

if queue_response.json()['status'] != True:

print("获取排队信息失败")

return False

# 确认订单

confirm_response = requests.post(confirm_url, data={'passengerTicketStr': passenger_ticket_str, 'oldPassengerStr': f"{passenger_name},1,{passenger_id},1_", 'randCode': '', 'purpose_codes': '00', 'key_check_isChange': '', 'leftTicketStr': '', 'train_location': '', 'choose_seats': '', 'seatDetailType': '000', 'whatsSelect': '1', 'roomType': '00', 'dwAll': 'N', '_json_att': '', 'REPEAT_SUBMIT_TOKEN': ''})

if confirm_response.json()['data']['submitStatus'] != True:

print("确认订单失败")

return False

print("订单提交成功")

return True

主函数

if __name__ == '__main__':

username = input("请输入用户名:")

password = input("请输入密码:")

if login(username, password):

from_station = input("请输入出发地:")

to_station = input("请输入目的地:")

date = input("请输入出发日期:")

query_tickets(from_station, to_station, date)

train_no = input("请输入车次号:")

passenger_name = input("请输入乘车人姓名:")

passenger_id = input("请输入乘车人身份证号:")

seat_type = input("请输入座位类型:")

submit_order(train_no, from_station, to_station, date, passenger_name, passenger_id, seat_type)

七、注意事项

1、接口的更新

12306网站的接口会定期进行更新和升级,确保接口的有效性和及时性是成功抢票的前提。可以通过抓包工具定期获取最新的接口地址和请求参数。

2、验证码的处理

登录和提交订单时通常需要输入验证码,可以使用一些机器学习算法如CNN来识别验证码内容,或者使用一些第三方的验证码识别服务来识别验证码。

3、网络延迟

抢票过程中网络延迟是一个不可忽视的问题,可以通过使用多线程或异步请求来提高抢票的成功率。

4、法律风险

使用Python脚本进行抢票存在一定的法律风险,请确保在合法合规的前提下进行操作。

总结:使用Python抢12306票需要获取并解析12306的接口、模拟登录、查找车票信息、提交订单、处理验证码等多个步骤。每个步骤都需要仔细分析12306的接口和数据格式,确保操作的成功率。同时,需要注意接口的更新、验证码的处理、网络延迟等问题,确保抢票操作的合法合规。

相关问答FAQs:

如何使用Python进行12306车票抢购?
使用Python抢购12306车票通常涉及到网络请求和数据解析。您需要使用Python库如requests和BeautifulSoup来模拟用户行为,发送请求并解析返回的数据。确保您熟悉HTTP请求的基本概念,以及如何处理会话和Cookies,以便能够有效地模拟登录和购票流程。

抢购12306车票时需要注意哪些事项?
在使用Python抢购12306车票时,务必注意网站的反爬虫机制。频繁的请求可能会导致IP被封禁或限制,建议设置合理的请求间隔,并使用代理IP来分散请求。此外,了解购票时间节点、热门车次的动态信息,以及如何在抢票高峰期快速获取票源也是成功的关键。

有哪些Python库可以帮助我实现12306抢票功能?
有几个流行的Python库可以帮助您实现12306抢票功能,包括requests(用于发送HTTP请求)、BeautifulSoup(用于解析HTML页面)、selenium(用于模拟浏览器操作)等。通过这些工具的结合使用,您可以实现自动登录、查询余票、提交订单等一系列功能,从而提高抢票的成功率。