使用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(用于模拟浏览器操作)等。通过这些工具的结合使用,您可以实现自动登录、查询余票、提交订单等一系列功能,从而提高抢票的成功率。