只供学习参考,现在12306加了预填信息功能了,用官方的更靠谱!
一、使用tkinter编写可视化图形
- 编写可视化图形代码
import tkinter as tk
from tkinter import messagebox
from datetime import datetime
beg_time = None
train_num_1 = None
train_num_2 = None
train_num_3 = None
login_flag = False
global_ac = None
riders = [None, None, None, None]
def login():
global login_flag
login_flag = True
data = {}
global_ac.login(data)
def main(ac):
global global_ac
global_ac = ac
root = tk.Tk()
root.title("抢票小能手")
root.geometry("300x280")
label = tk.Label(root, text="仅供学习参考,拒绝商用", fg="red")
label.grid(row=0, column=0, columnspan=3)
label = tk.Label(root, text="输入3趟代抢的车次", fg="red")
label.grid(row=9, column=0, columnspan=3)
row = tk.Label(root)
row.grid(row=10, column=0, columnspan=3, pady=4)
label = tk.Label(row, text="车次号: ")
label.grid(row=10, column=0)
global train_num_1
train_num_1 = tk.Entry(row, width=10)
train_num_1.grid(row=10, column=1, pady=4)
global train_num_2
train_num_2 = tk.Entry(row, width=10)
train_num_2.grid(row=10, column=2, pady=4)
global train_num_3
train_num_3 = tk.Entry(row, width=10)
train_num_3.grid(row=10, column=3, pady=4)
label = tk.Label(root, text="请输入乘车人, 最多添加4个乘车人", fg="red")
label.grid(row=13, column=0, columnspan=3)
row = tk.Label(root)
row.grid(row=14, column=0, columnspan=3, pady=4)
label = tk.Label(row, text="乘车人: ")
label.grid(row=14, column=0, pady=4)
global riders
riders[0] = tk.Entry(row, width=7)
riders[0].grid(row=14, column=1, pady=4)
riders[1] = tk.Entry(row, width=7)
riders[1].grid(row=14, column=2, pady=4)
riders[2] = tk.Entry(row, width=7)
riders[2].grid(row=14, column=3, pady=4)
riders[3] = tk.Entry(row, width=7)
riders[3].grid(row=14, column=4, pady=4)
label = tk.Label(root, text="开抢时间(hh:mm): ")
label.grid(row=15, column=0)
global beg_time
beg_time = tk.Entry(root, width=14)
beg_time.grid(row=15, column=1, pady=4)
button = tk.Button(root, text="去吧,皮卡丘", command=begin)
button.grid(row=18, column=1, pady=8)
root.mainloop()
- 效果图
二、启动后开始自动抢票
- 自动抢票执行程序代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
driver = None
def login(data):
global driver
driver = webdriver.Chrome()
driver.get('https://kyfw.12306.cn/otn/resources/login.html')
def begin(data):
search()
WebDriverWait(driver, 10).until(ec.visibility_of_element_located((By.ID, 'queryLeftTable')))
trains = data["trains"]
get_flag = False
for train in trains:
reserve_btn_s = driver.find_elements(By.CSS_SELECTOR, f'[onclick*="{train.zfill(8)}"]')
for item in reserve_btn_s:
if item.get_attribute("class") == 'btn72' or item.text == '预订':
item.click()
get_flag = True
break
if get_flag:
break
if not get_flag:
return False
WebDriverWait(driver, 30).until(ec.visibility_of_element_located((By.ID, 'normal_passenger_id')))
rider_ele_s = driver.find_elements(By.CSS_SELECTOR, '[for*="normalPassenger_"]')
for item in rider_ele_s:
if item.text in data["riders"]:
item.click()
WebDriverWait(driver, 5).until(ec.visibility_of_element_located((By.ID, 'submitOrder_id')))
driver.find_element(By.ID, "submitOrder_id").click()
WebDriverWait(driver, 5).until(ec.visibility_of_element_located((By.ID, 'qr_submit_id')))
qr_submit = driver.find_element(By.ID, "qr_submit_id")
while qr_submit.get_attribute("class") != 'btn92s':
continue
qr_submit.click()
return get_flag
def search():
WebDriverWait(driver, 10).until(ec.visibility_of_element_located((By.ID, 'query_ticket')))
driver.find_element(By.ID, "query_ticket").click()
-
效果图,需自行登录并填写地址和时间
-
登录并填写地点和时间后,点击·去吧,皮卡丘
就会自动查询车票,并筛选指定的车次进行购票