python 做一个使用的12306抢票软件
抢票软件涉及到爬取12306网站的数据,自动填写订单信息等操作,以下是一个简单的示例代码:
import requests
import time
def login():
login_url = "https://kyfw.12306.cn/otn/login/init"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
}
data = {
"username": "your_username",
"password": "your_password"
}
session = requests.Session()
session.post(login_url, headers=headers, data=data)
return session
def query_tickets(session, from_station, to_station, date):
query_url = f"https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={date}&leftTicketDTO.from_station={from_station}&leftTicketDTO.to_station={to_station}&purpose_codes=ADULT"
response = session.get(query_url)
tickets = response.json()["data"]["result"]
return tickets
def book_ticket(session, from_station, to_station, date, train_no, seat_type):
book_url = "https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest"
data = {
"secretStr": "",
"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": ""
}
response = session.post(book_url, data=data)
if response.json()["status"]:
print("提交订单成功")
time.sleep(1)
confirm_url = "https://kyfw.12306.cn/otn/confirmPassenger/initDc"
response = session.get(confirm_url)
if response.status_code == 200:
print("确认乘客信息成功")
time.sleep(1)
passenger_url = "https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs"
response = session.post(passenger_url)
if response.status_code == 200:
print("获取乘客信息成功")
time.sleep(1)
passenger = response.json()["data"]["normal_passengers"][0]
passenger_name = passenger["passenger_name"]
passenger_id = passenger["passenger_id_no"]
passenger_phone = passenger["mobile_no"]
passenger_type = passenger["passenger_type"]
check_url = "https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo"
data = {
"cancel_flag": 2,
"bed_level_order_num": "000000000000000000000000000000",
"passengerTicketStr": f"{seat_type},0,1,{passenger_name},{passenger_type},{passenger_id},{passenger_phone},N",
"oldPassengerStr": f"{passenger_name},{passenger_type},{passenger_id},1_",
"tour_flag": "dc",
"randCode": "",
"whatsSelect": 1,
"_json_at": ""
}
response = session.post(check_url, data=data)
if response.status_code == 200:
print("校验订单信息成功")
time.sleep(1)
confirm_submit_url = "https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue"
data = {
"passengerTicketStr": f"{seat_type},0,1,{passenger_name},{passenger_type},{passenger_id},{passenger_phone},N",
"oldPassengerStr": f"{passenger_name},{passenger_type},{passenger_id},1_",
"randCode": "",
"purpose_codes": "00",
"key_check_isChange": "",
"leftTicketStr": "",
"train_location": "",
"whatsSelect": 1,
"_json_at": "",
"choose_seats": "",
"seatDetailType": "000",
"roomType": "00",
"dwAll": "N",
"REPEAT_SUBMIT_TOKEN": ""
}
response = session.post(confirm_submit_url, data=data)
if response.status_code == 200:
print("提交订单成功")
time.sleep(1)
queue_url = "https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime"
data = {
"random": str(int(time.time() * 1000)),
"tourFlag": "dc",
"_json_at": ""
}
response = session.get(queue_url, params=data)
if response.status_code == 200:
print("正在排队中,请等待...")
else:
print("查询排队信息失败")
else:
print("提交订单失败")
else:
print("校验订单信息失败")
else:
print("获取乘客信息失败")
else:
print("确认乘客信息失败")
else:
print("提交订单失败")
if __name__ == "__main__":
session = login()
from_station = "北京"
to_station = "上海"
date = "2022-01-01"
tickets = query_tickets(session, from_station, to_station, date)
if tickets:
print("查询到以下车次:")
for ticket in tickets:
print(ticket)
train_no = input("请输入要抢票的车次:")
seat_type = input("请输入要抢票的席别:")
book_ticket(session, from_station, to_station, date, train_no, seat_type)
else:
print("未查询到可用车次")
请注意,12306网站对爬取数据有一定的限制,频繁的请求可能会导致IP被封禁,请谨慎使用抢票软件。此示例代码仅供参考,具体实现可能需要根据12306网站的变化进行调整。另外,使用抢票软件需要提供正确的用户名和密码,建议谨慎保管个人信息
原文地址: https://www.cveoy.top/t/topic/hLPd 著作权归作者所有。请勿转载和采集!