本文目录导读:

我来帮你梳理自动化抢票脚本的完整思路,但请先阅读重要提醒:
⚠️ 重要声明:本文仅用于技术学习与讨论,使用自动化工具抢票可能违反相关平台服务条款,存在账号封禁风险,请勿用于实际抢票行为,正规购票请通过官方渠道。
整体技术架构
┌─────────────────────────────────────┐
│ 抢票脚本核心流程 │
├─────────────────────────────────────┤
│ 1. 登录认证 → 获取会话凭证 │
│ 2. 车次查询 → 实时监控余票 │
│ 3. 智能抢票 → 高并发+高速提交 │
│ 4. 订单确认 → 自动填写乘客信息 │
│ 5. 支付跳转 → 通知用户完成支付 │
└─────────────────────────────────────┘
核心技术选型
语言与框架
# Python推荐 import requests # HTTP请求 from selenium import webdriver # 模拟浏览器(应对复杂反爬) import pandas as pd # 数据处理 import json, time, threading, random
API分析(关键)
# 12306核心API示例 QUERY_API = "https://kyfw.12306.cn/otn/leftTicket/queryG" SUBMIT_API = "https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest" # 需要抓包分析:headers、params、token、加密规则
分步实现思路
第一步:登录认证
class TicketLogin:
def __init__(self):
self.session = requests.Session()
def login_by_username(self, username, password):
# 1. 获取验证码
# 2. 计算加密参数(常需要逆向JS)
# 3. 模拟登录请求
# 4. 保存Cookie到本地复用
def login_by_qrcode(self):
# 使用selenium获取登录二维码
# 扫描后提取cookie
def load_cookie(self):
# 从本地文件加载,避免重复登录
第二步:车次监控(核心)
class TicketMonitor:
def __init__(self):
self.train_info = {} # 预存车次数据
def query_tickets(self, date, from_station, to_station):
# 1. 构造请求参数(城市代码转换)
# 2. 带上session和headers发起请求
# 3. 解析JSON余票数据
# 4. 匹配目标车次和席别
def check_ticket_available(self, train_code, seat_type):
# "有"、数字、"无"、"*"等状态判断
def real_time_monitor(self):
# 使用多线程/异步并发查询
# 降低间隔时间(0.1~0.5秒)
# 高峰期可分布式部署
关键参数:
# 车站三字码转换
station_dict = {
"北京": "BJP", "上海": "SHH",
"广州": "GZQ", "深圳": "SZQ"
}
# 席别代码
seat_types = {
"商务座": "9", "一等座": "M",
"二等座": "O", "硬卧": "3"
}
第三步:自动购票(提交订单)
class AutoBuy:
def submit_order(self, train_no, date, passenger):
# 1. 提交订单请求
# 2. 携带token参数(从查询接口获取)
# 3. 确认乘车人
# 4. 生成订单
def check_order_valid(self, order_id):
# 轮询订单状态
def handle_queue(self):
# 高峰期排队处理
# 持续轮询直到成功或超时
高级优化策略
并发加速
# 多线程抢票
from concurrent.futures import ThreadPoolExecutor
def batch_buy(users, train_info):
with ThreadPoolExecutor(max_workers=10) as executor:
futures = [executor.submit(single_buy, u, train_info)
for u in users]
# 异步协程方案
import aiohttp
async def async_buy(session):
async with session.get(url) as resp:
# 实时处理
智能调度
# 抢票时间策略
def smart_schedule():
# 放票时间:提前15天早上8点/10点
# 候补捡漏:每日15:00、20:00
# 退票高峰:开车前48小时、24小时
数据预处理
# 高速缓存常用参数
cache_station = {} # 车站码缓存
cache_train = {} # 车次信息缓存
# 避免重复计算,提升响应速度
反检测与风险控制
请求特征伪装
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)...",
"Referer": "https://kyfw.12306.cn/otn/leftTicket/init",
"Cookie": "你的cookie",
"X-Requested-With": "XMLHttpRequest"
}
访问频率控制
def rate_limiter():
# 每次请求间隔随机0.3~0.8秒
# 模拟人工操作
time.sleep(random.uniform(0.3, 0.8))
验证码处理
# 方案1:手动验证(推荐) # 弹出验证码,人工点击 # 方案2:OCR识别(复杂) from ddddocr import DdddOcr ocr = DdddOcr() result = ocr.classification(img_bytes)
完整流程示例
# 伪代码框架
def main():
# 1. 加载配置
config = load_config("config.yaml")
# 2. 登录
login = TicketLogin()
login.load_cookie() or login.login_by_username()
# 3. 创建监控器
monitor = TicketMonitor(login.session)
# 4. 监控循环
while True:
tickets = monitor.query_tickets(
date="2024-01-20",
from_station="BJP",
to_station="SHH"
)
if monitor.has_available(tickets, "G123", "二等座"):
# 5. 自动下单
result = auto_buy.submit_order(...)
if result.success:
notify_user() # 推送通知
break
time.sleep(0.5)
if __name__ == "__main__":
main()
关键提醒
- 稳定性优先:不要过度追求速度,保持请求稳定
- 日志记录:完整记录请求状态,便于排错
- 异常处理:网络错误、验证码、token失效等都要考虑
- 合规说明:仅用于学习测试,不要用于商业牟利
推荐学习路径
- 先用requests库模拟基础API请求
- 抓包分析平台加密参数
- 学习Selenium处理复杂验证码
- 掌握多线程/协程并发编程
- 逐步完善异常处理和调度策略
如果你需要具体的API参数分析,建议先从开发者工具(F12)网络面板开始,观察真实请求的报文结构,技术学习可以从简单模拟开始,逐步深入。