跳到主要内容

大麦抢票自动化脚本技术文档

文档版本: 1.1
最后更新: 2025年9月24日
项目来源: GitHub 开源项目 WECENG/ticket-purchase
项目官网: https://github.com/WECENG/ticket-purchase
适用对象: 自动化测试工程师、Python 开发者、票务系统研究者、逆向工程学习者、移动端自动化开发者


一、项目概述

本项目是一个基于 Selenium(Web 端)与 Appium(App 端)实现的大麦网(damai.cn)自动化抢票工具,支持用户在开票瞬间自动完成登录、选场次、选价格、选观演人、提交订单等全流程操作,显著提升抢票成功率。

项目包含两个核心模块:

  • Web 抢票脚本(damai.py:通过浏览器自动化操作大麦官网
  • App 抢票脚本(damai_appium.py:通过 Appium 控制 Android 设备上的大麦 App

⚠️ 法律与合规提示
本项目仅用于技术学习与研究目的。大麦网《用户协议》明确禁止使用自动化脚本抢票。实际使用可能触发风控、账号封禁或法律风险,请谨慎评估。


二、技术架构

2.1 整体架构图

2.2 技术栈对比

维度Web 模式(Selenium)App 模式(Appium)
自动化框架SeleniumAppium + UiAutomator2
控制对象Chrome 浏览器Android 设备上的大麦 App
依赖环境Python, Chrome, ChromeDriverPython, Node.js, Android SDK, Appium
稳定性中(易受网页结构变动影响)高(更贴近真实用户行为)
反爬风险较高(易被识别为机器人)相对较低(模拟真实设备操作)
配置复杂度高(需配置移动端环境)

三、环境配置指南

3.1 公共依赖(Web & App)

Python 环境

  • 版本要求:Python ≥ 3.9
  • 安装方式:
    # Windows
    # 从 https://www.python.org/downloads/ 下载并勾选 "Add to PATH"

    # macOS
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    brew install python@3

3.2 Web 模式依赖

组件安装命令说明
Seleniumpip3 install selenium浏览器自动化库
Google Chrome官网下载必须安装最新版
ChromeDriver自动匹配或手动下载与 Chrome 版本严格对应

💡 提示:建议使用 webdriver-manager 自动管理驱动:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())

3.3 App 模式依赖

Node.js 与 Appium

# 安装 Node.js (v18+)
# macOS
brew install node@18

# 安装 Appium Server
npm install -g appium

# 安装 UiAutomator2 驱动(需跳过 Chromedriver 安装)
export APPIUM_SKIP_CHROMEDRIVER_INSTALL=true
npm install -g appium-uiautomator2-driver

Android 环境

  • 安装 Android SDK(推荐通过 Android Studio)
  • 配置 ANDROID_HOME 环境变量
  • 开启手机“开发者选项”与“USB 调试”

Python 客户端

pip3 install appium-python-client

四、配置文件详解

4.1 config.json 结构

{
"index_url": "https://www.damai.cn/",
"login_url": "https://passport.damai.cn/login?ru=https%3A%2F%2Fwww.damai.cn%2F",
"target_url": "https://detail.damai.cn/item.htm?id=740680932762",
"users": ["张三", "李四"],
"city": "广州",
"date": "2023-10-28",
"price": "1039",
"if_listen": true,
"if_commit_order": true
}

4.2 字段说明表

字段名类型是否必填说明
index_urlstring大麦首页,固定值,无需修改
login_urlstring登录页 URL,固定值
target_urlstring目标演出详情页 URL(含 id= 参数)
usersstring[]观演人姓名列表,需提前在大麦 App 中添加
citystring若演出需选城市(如多城巡演),填城市名;否则留空或删除
datestring场次日期,格式 YYYY-MM-DD
pricestring票档价格(字符串),如 "1039"
if_listenboolean是否启用“回流票监听”(持续轮询库存)
if_commit_orderboolean是否自动提交订单(设为 false 可用于调试)

五、核心代码分析

5.1 Web 模式关键流程(damai.py

登录与跳转

# 伪代码示意
driver.get(config['login_url'])
# 等待用户手动扫码登录(安全考虑,未自动填账号密码)
WebDriverWait(driver, 300).until(
EC.url_contains("www.damai.cn")
)
driver.get(config['target_url'])

🔍 设计分析
项目采用“半自动登录”策略,避免账号密码硬编码,提升安全性,但牺牲了完全无人值守能力。

选票逻辑

# 选择日期
date_btn = driver.find_element(By.XPATH, f"//div[text()='{config['date']}']")
date_btn.click()

# 选择价格
price_btn = driver.find_element(By.XPATH, f"//span[contains(text(), '{config['price']}')]/..")
price_btn.click()

⚠️ 脆弱点
XPath 依赖页面文本内容,若大麦改版(如价格显示为“¥1039”而非“1039”),脚本将失效。

5.2 App 模式关键代码(damai_appium.py

Appium 驱动初始化

from appium import webdriver
from appium.options.common.base import AppiumOptions

options = AppiumOptions()
options.set_capability('platformName', 'Android')
options.set_capability('deviceName', 'YourDevice') # adb devices 获取
options.set_capability('appPackage', 'cn.damai')
options.set_capability('appActivity', '.launcher.splash.SplashMainActivity')
options.set_capability('automationName', 'UiAutomator2')

driver = webdriver.Remote('http://127.0.0.1:4723', options=options)

元素定位策略

# 通过 resourceId 定位(更稳定)
confirm_btn = driver.find_element(
AppiumBy.ID, "cn.damai:id/buy_button"
)
confirm_btn.click()

优势
使用 Android resource-id 定位比 Web 的 XPath 更稳定,不易受 UI 文案变动影响。


六、运行与调试

6.1 Web 模式运行

cd damai
python3 damai.py

6.2 App 模式运行

  1. 启动 Appium Server:
    appium --use-plugins uiautomator2
  2. 运行脚本:
    cd damai_appium
    python3 damai_appium.py

6.3 调试建议

问题现象解决方案
页面元素找不到使用浏览器开发者工具检查 XPath 是否变化
App 启动失败检查 appActivity 是否正确(可用 adb logcat
抢票速度慢关闭浏览器图片/JS 加载,或使用无头模式
被识别为机器人添加随机等待、模拟鼠标轨迹、使用代理 IP

七、风险与局限性

7.1 技术局限

  • 无验证码自动处理:登录或下单时若出现滑块/图形验证码,需人工介入
  • 依赖页面结构稳定:大麦前端改版将导致脚本失效
  • 无并发支持:单实例运行,无法多账号同时抢票

7.2 安全与法律风险

风险类型说明
账号封禁大麦风控系统可识别自动化行为,导致账号永久冻结
法律责任违反《网络安全法》及平台协议,可能面临民事或刑事责任
数据泄露若配置文件包含敏感信息(如账号),存在泄露风险

八、总结与建议

本项目展示了 Selenium 与 Appium 在复杂业务场景下的实战应用,具备较高的技术参考价值。建议开发者:

  • 仅用于学习:理解自动化测试、元素定位、流程控制等核心概念
  • 增强健壮性:加入异常重试、日志记录、邮件通知等机制
  • 探索替代方案:研究官方 API(如有)、WebSocket 监听库存变化等更高效方式

📌 重要提醒:切勿用于商业抢票或大规模部署,尊重平台规则与市场公平。


附录 A:项目目录结构

ticket-purchase/
├── damai/
│ ├── damai.py # Web 抢票主程序
│ └── config.json # 配置文件
├── damai_appium/
│ ├── damai_appium.py # App 抢票主程序
│ └── README.md
└── GitHubMD.txt # 原始说明文档

附录 B:参考链接

Loading comments...