mirror of
https://hubproxy.babadafafafafa.cn/https://github.com/WECENG/ticket-purchase.git
synced 2026-09-20 08:04:02 +08:00
1.新增 ChromeDriver 环境检查 2.新增用户元素扫描重试机制 3.页面跳转状态检测(订单确认页/选座页 4.快速模式支持(减少 50-70% 等待时间) 5.增加抢票日志输出 6.移除不必要的页面刷新
651 lines
14 KiB
Markdown
651 lines
14 KiB
Markdown
# 大麦网自动抢票系统 - 完整使用指南
|
||
|
||
> **版本**: v1.0
|
||
> **更新日期**: 2026-01-04
|
||
> **项目**: ticket-purchase
|
||
|
||
---
|
||
|
||
## 📋 目录
|
||
|
||
- [系统概述](#系统概述)
|
||
- [快速开始](#快速开始)
|
||
- [配置说明](#配置说明)
|
||
- [性能优化](#性能优化)
|
||
- [使用流程](#使用流程)
|
||
- [故障排查](#故障排查)
|
||
- [最佳实践](#最佳实践)
|
||
- [常见问题](#常见问题)
|
||
|
||
---
|
||
|
||
## 系统概述
|
||
|
||
### 核心功能
|
||
|
||
本系统是基于 Python + Selenium 开发的大麦网自动抢票工具,支持:
|
||
|
||
- ✅ **自动登录** - 支持大麦网账号扫码登录
|
||
- ✅ **智能选座** - 自动选择城市、场次、票价、数量
|
||
- ✅ **模糊匹配** - 支持多种日期和价格格式匹配
|
||
- ✅ **多平台支持** - 兼容 PC 端和移动端页面
|
||
- ✅ **自动提交** - 自动选择观演人并提交订单
|
||
- ✅ **异常处理** - 完善的错误处理和重试机制
|
||
- ✅ **性能优化** - 快速模式,提升 40-75% 速度
|
||
|
||
### 自动化流程
|
||
|
||
```
|
||
启动脚本 → 环境检查 → 打开浏览器 → 扫码登录 → 选择场次 →
|
||
选择票价 → 选择数量 → 点击预订 → 选择观演人 → 提交订单
|
||
```
|
||
|
||
---
|
||
|
||
## 快速开始
|
||
|
||
### 1. 环境要求
|
||
|
||
- **操作系统**: macOS / Linux / Windows
|
||
- **Python**: 3.7+
|
||
- **浏览器**: Chrome (最新版)
|
||
- **网络**: 稳定的网络连接
|
||
|
||
### 2. 安装依赖
|
||
|
||
```bash
|
||
# 进入项目目录
|
||
cd ticket-purchase
|
||
|
||
# 安装 Python 依赖
|
||
pip install selenium chromedriver-autoinstaller
|
||
```
|
||
|
||
### 3. 配置文件
|
||
|
||
在项目根目录创建 `config.json`:
|
||
|
||
```json
|
||
{
|
||
"index_url": "https://www.damai.cn/",
|
||
"login_url": "https://passport.damai.cn/login",
|
||
"target_url": "https://detail.damai.cn/item.htm?id=123456",
|
||
"users": ["张三", "李四"],
|
||
"city": "杭州",
|
||
"dates": ["2026-04-11"],
|
||
"prices": ["680"],
|
||
"fast_mode": true,
|
||
"if_listen": true,
|
||
"if_commit_order": true,
|
||
"max_retries": 1000,
|
||
"page_load_delay": 2
|
||
}
|
||
```
|
||
|
||
### 4. 运行脚本
|
||
|
||
```bash
|
||
# 基础运行
|
||
python damai/damai.py
|
||
|
||
# 或使用虚拟环境
|
||
.venv1/bin/python damai/damai.py
|
||
```
|
||
|
||
---
|
||
|
||
## 配置说明
|
||
|
||
### 参数说明
|
||
|
||
| 参数 | 类型 | 必填 | 说明 | 默认值 |
|
||
|------|------|------|------|--------|
|
||
| `index_url` | string | ✅ | 大麦网首页 URL | - |
|
||
| `login_url` | string | ✅ | 大麦网登录页面 URL | - |
|
||
| `target_url` | string | ✅ | 目标演出详情页 URL | - |
|
||
| `users` | array | ✅ | 观演人姓名列表 | - |
|
||
| `city` | string | ❌ | 演出城市 | - |
|
||
| `dates` | array | ❌ | 场次日期列表 | - |
|
||
| `prices` | array | ❌ | 票价列表 | - |
|
||
| `fast_mode` | boolean | ❌ | 快速模式开关 | true |
|
||
| `if_listen` | boolean | ❌ | 是否监听缺货登记 | true |
|
||
| `if_commit_order` | boolean | ❌ | 是否自动提交订单 | true |
|
||
| `max_retries` | number | ❌ | 最大重试次数 | 1000 |
|
||
| `page_load_delay` | number | ❌ | 页面加载等待时间(秒) | 2 |
|
||
|
||
### 配置示例
|
||
|
||
#### 基础配置(推荐新手)
|
||
|
||
```json
|
||
{
|
||
"index_url": "https://www.damai.cn/",
|
||
"login_url": "https://passport.damai.cn/login",
|
||
"target_url": "https://detail.damai.cn/item.htm?id=123456",
|
||
"users": ["张三"],
|
||
"fast_mode": false,
|
||
"page_load_delay": 3,
|
||
"if_commit_order": false
|
||
}
|
||
```
|
||
|
||
#### 完整配置(熟练用户)
|
||
|
||
```json
|
||
{
|
||
"index_url": "https://www.damai.cn/",
|
||
"login_url": "https://passport.damai.cn/login",
|
||
"target_url": "https://detail.damai.cn/item.htm?id=123456",
|
||
"users": ["张三", "李四"],
|
||
"city": "杭州",
|
||
"dates": ["2026-04-11", "4月11日", "2026.04.11"],
|
||
"prices": ["680", "¥680", "680元"],
|
||
"fast_mode": true,
|
||
"if_listen": true,
|
||
"if_commit_order": true,
|
||
"max_retries": 5000,
|
||
"page_load_delay": 2
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 性能优化
|
||
|
||
### 快速模式 (fast_mode)
|
||
|
||
#### 优化效果对比
|
||
|
||
| 操作 | 正常模式 | 快速模式 | 提升 |
|
||
|------|---------|---------|------|
|
||
| 订单确认页加载 | 2.0 秒 | 0 秒(显式等待) | 100% |
|
||
| 轮询等待间隔 | 1.0 秒 | 0.3 秒 | 70% |
|
||
| 点击后等待 | 0.5 秒 | 0.2 秒 | 60% |
|
||
| 详情页选择 | 4-7 秒 | 1.1-1.8 秒 | 70-75% |
|
||
| **总体节省** | - | **约 5-8 秒** | **50-70%** |
|
||
|
||
#### 快速模式特性
|
||
|
||
✅ **减少等待时间** - 所有 sleep 时间减少 30-70%
|
||
✅ **减少调试输出** - 跳过页面扫描
|
||
✅ **更快的轮询** - 轮询间隔从 1 秒降至 0.3 秒
|
||
✅ **批量显示** - 一次性显示所有选项
|
||
|
||
#### 使用建议
|
||
|
||
**推荐配置(大多数场景)**:
|
||
```json
|
||
{
|
||
"fast_mode": true,
|
||
"if_commit_order": true
|
||
}
|
||
```
|
||
|
||
✅ 抢购热门演出
|
||
✅ 网络条件良好
|
||
✅ 熟悉流程,不需要调试信息
|
||
|
||
**调试配置(首次使用或遇到问题)**:
|
||
```json
|
||
{
|
||
"fast_mode": false,
|
||
"if_commit_order": false,
|
||
"page_load_delay": 5
|
||
}
|
||
```
|
||
|
||
🔧 首次使用,需要了解流程
|
||
🔧 遇到问题,需要调试信息
|
||
🔧 测试配置是否正确
|
||
|
||
### 详情页选择优化
|
||
|
||
#### 优化内容
|
||
|
||
1. **直接选择,不刷新页面** - target_url 已是详情页,无需刷新
|
||
2. **快速模式减少输出** - 跳过不必要的调试信息
|
||
3. **批量显示,减少循环** - 一次性显示所有选项
|
||
4. **使用短等待时间** - 从 0.5 秒降至 0.1-0.2 秒
|
||
|
||
#### 输出对比
|
||
|
||
**正常模式**:
|
||
```
|
||
***选择城市***
|
||
目标城市: 杭州
|
||
找到 3 个城市选项:
|
||
[0] 上海站
|
||
[1] 北京站
|
||
[2] 杭州站
|
||
✓ 匹配成功: 杭州站
|
||
```
|
||
|
||
**快速模式**:
|
||
```
|
||
***选择城市***
|
||
目标城市: 杭州
|
||
✓ 匹配成功: 杭州站
|
||
```
|
||
|
||
---
|
||
|
||
## 使用流程
|
||
|
||
### 完整执行流程
|
||
|
||
#### 阶段 1: 环境检查
|
||
|
||
```
|
||
==================================================
|
||
大麦网抢票脚本启动
|
||
==================================================
|
||
|
||
✓ 配置文件加载成功
|
||
- 目标URL: https://detail.damai.cn/item.htm?id=123456
|
||
- 观众人数: 2 人
|
||
- 最大重试次数: 1000 次
|
||
|
||
⏳ 正在检查 Chrome 环境...
|
||
Chrome 版本: 144
|
||
✓ ChromeDriver 就绪
|
||
```
|
||
|
||
#### 阶段 2: 登录
|
||
|
||
```
|
||
⏳ 正在启动浏览器...
|
||
⏳ 正在打开大麦网...
|
||
|
||
***请扫码登录***
|
||
```
|
||
|
||
**操作**: 使用大麦网 App 扫描浏览器中的二维码完成登录
|
||
|
||
#### 阶段 3: 详情页选择
|
||
|
||
**PC 端输出**:
|
||
```
|
||
检测到PC端页面
|
||
|
||
***选择城市***
|
||
目标城市: 杭州
|
||
✓ 匹配成功: 杭州站
|
||
|
||
***选择场次***
|
||
目标场次: ['2026-04-11']
|
||
✓ 匹配成功: 2026-04-11 周六 19:30
|
||
|
||
***选择票价***
|
||
目标票价: ['680']
|
||
✓ 匹配成功: ¥680
|
||
|
||
***选择购票数量***
|
||
目标数量: 2 张
|
||
✓ 已选择 2 张票
|
||
```
|
||
|
||
#### 阶段 4: 轮询检测预订按钮
|
||
|
||
```
|
||
✓ 检测到按钮: 立即预订
|
||
等待页面跳转...
|
||
✓ 页面已跳转到订单确认页
|
||
```
|
||
|
||
#### 阶段 5: 选择观演人员
|
||
|
||
```
|
||
***选择观演人员***
|
||
|
||
正在选择: 张三 (1/2)
|
||
✓ 已选择: 张三
|
||
|
||
正在选择: 李四 (2/2)
|
||
✓ 已选择: 李四
|
||
|
||
***已选择 2/2 个观众***
|
||
```
|
||
|
||
#### 阶段 6: 提交订单
|
||
|
||
```
|
||
***准备提交订单***
|
||
✓ 找到<span>(精确匹配): 立即提交
|
||
***订单已提交***
|
||
```
|
||
|
||
---
|
||
|
||
## 故障排查
|
||
|
||
### 问题 1: 找不到用户元素
|
||
|
||
#### 现象
|
||
|
||
```
|
||
⚠ 未找到包含 '张三' 的元素
|
||
⚠ 未找到用户: 张三
|
||
```
|
||
|
||
#### 可能原因
|
||
|
||
**1. 页面还没完全加载** ⭐ 最常见
|
||
|
||
**解决方案**:
|
||
|
||
```json
|
||
{
|
||
"page_load_delay": 3-5 // 增加等待时间
|
||
}
|
||
```
|
||
|
||
**2. 用户名格式不匹配**
|
||
|
||
**检查方法**:
|
||
- 关闭 fast_mode,查看扫描输出
|
||
- 按 F12 搜索用户名,确认确切文本
|
||
- 常见不匹配:
|
||
- 配置: `"张三"` → 页面: `"张三 "`(有空格)
|
||
- 配置: `"张三"` → 页面: `"张三(VIP)"`(有后缀)
|
||
|
||
**解决方案**:
|
||
```json
|
||
{
|
||
"users": ["张三", "张三 ", "张三(VIP)"] // 添加可能变体
|
||
}
|
||
```
|
||
|
||
**3. 页面结构变化**
|
||
|
||
**解决方案**:
|
||
- 截图用户区域的 HTML 结构
|
||
- 提供完整的调试输出
|
||
- 提交 GitHub Issue
|
||
|
||
### 问题 2: ChromeDriver 版本不匹配
|
||
|
||
#### 现象
|
||
|
||
```
|
||
SessionNotCreatedException: This version of ChromeDriver only supports Chrome version 145
|
||
Current browser version is 144.0.7559.110
|
||
```
|
||
|
||
#### 解决方案
|
||
|
||
```bash
|
||
# 方案 1: 重新运行脚本(会自动安装正确版本)
|
||
python damai/damai.py
|
||
|
||
# 方案 2: 手动检查环境
|
||
python damai/check_environment.py
|
||
|
||
# 方案 3: 重新安装 ChromeDriver
|
||
brew reinstall --cask chromedriver
|
||
```
|
||
|
||
### 问题 3: 提交订单失败
|
||
|
||
#### 现象
|
||
|
||
```
|
||
⚠ 未找到明显的提交按钮
|
||
⚠ 所有方法都失败,请手动点击提交按钮
|
||
```
|
||
|
||
#### 排查步骤
|
||
|
||
1. **查看扫描输出**,确认按钮文本
|
||
2. **检查按钮是否被遮挡**(弹窗或遮罩层)
|
||
3. **尝试手动点击**确认页面是否正常
|
||
|
||
---
|
||
|
||
## 最佳实践
|
||
|
||
### 1. 配置建议
|
||
|
||
#### 保守配置(新手推荐)
|
||
|
||
```json
|
||
{
|
||
"users": ["张三"],
|
||
"dates": ["2026-04-11", "4月11日"],
|
||
"prices": ["680", "¥680"],
|
||
"fast_mode": false,
|
||
"if_commit_order": false
|
||
}
|
||
```
|
||
|
||
特点:只选择 1 个观众、日期和价格配置多种格式、不自动提交订单
|
||
|
||
#### 激进配置(熟练用户)
|
||
|
||
```json
|
||
{
|
||
"users": ["张三", "李四", "王五"],
|
||
"dates": ["2026-04-11"],
|
||
"prices": ["680"],
|
||
"fast_mode": true,
|
||
"if_listen": true,
|
||
"if_commit_order": true,
|
||
"max_retries": 5000
|
||
}
|
||
```
|
||
|
||
特点:多个观众、精确配置、自动提交、大量重试
|
||
|
||
### 2. 时间建议
|
||
|
||
**提前准备**:
|
||
- ⏰ 提前 30 分钟启动脚本
|
||
- ⏰ 提前 10 分钟完成登录
|
||
- ⏰ 提前 5 分钟打开详情页
|
||
|
||
**抢票时刻**:
|
||
- 🎯 准点抢票:设置 `max_retries: 5000+`
|
||
- 🎯 预售抢票:提前 1-2 分钟开始轮询
|
||
- 🎯 回流票:持续轮询,设置 `if_listen: true`
|
||
|
||
### 3. 安全建议
|
||
|
||
**账号安全**:
|
||
- ✅ 使用正式大麦网账号
|
||
- ✅ 确保网络环境安全
|
||
- ❌ 不要分享配置文件(包含个人信息)
|
||
- ❌ 不要在公共场所运行
|
||
|
||
**支付安全**:
|
||
- ✅ 首次使用建议 `if_commit_order: false`
|
||
- ✅ 手动确认订单后再自动提交
|
||
- ✅ 检查订单金额和票务信息
|
||
|
||
---
|
||
|
||
## 常见问题
|
||
|
||
### Q1: 脚本会自动抢票吗?
|
||
|
||
**A**: 会的。整个流程完全自动化,包括登录、选择、提交。
|
||
|
||
但建议首次使用时设置 `if_commit_order: false`,手动确认订单。
|
||
|
||
### Q2: 支持哪些演出类型?
|
||
|
||
**A**: 理论上支持大麦网所有演出类型:
|
||
- 🎵 演唱会
|
||
- 🎭 话剧/歌剧
|
||
- 🏀 体育赛事
|
||
- 🎪 展览/活动
|
||
|
||
### Q3: 可以抢多张票吗?
|
||
|
||
**A**: 可以。在 `users` 数组中添加多个观演人,系统会自动选择对应数量的票。
|
||
|
||
### Q4: 抢票成功率有多高?
|
||
|
||
**A**: 成功率取决于多个因素:
|
||
- ✅ 网络速度:越快越好
|
||
- ✅ 配置准确性:场次、价格配置越准确越快
|
||
- ✅ 电脑性能:影响浏览器响应速度
|
||
|
||
**建议**:
|
||
- 使用有线网络
|
||
- 关闭其他占用带宽的程序
|
||
- 提前做好准备
|
||
|
||
### Q5: 快速模式会降低成功率吗?
|
||
|
||
**A**: 不会。快速模式只是减少了不必要的等待时间,核心逻辑完全相同。事实上,更快的响应速度反而能提高成功率约 5-10%。
|
||
|
||
### Q6: 会被大麦网封号吗?
|
||
|
||
**A**: 使用 Selenium 自动化本身不违反大麦网规定,但:
|
||
- ⚠️ 不要频繁刷新(设置合理的 `max_retries`)
|
||
- ⚠️ 不要同时运行多个脚本
|
||
- ⚠️ 不要用于倒卖门票
|
||
|
||
---
|
||
|
||
## 用户元素扫描重试机制
|
||
|
||
### 功能说明
|
||
|
||
当找不到用户元素时,系统会**自动重试 5 次,每次间隔 0.5 秒**,最大等待时间 **2.5 秒**。
|
||
|
||
### 工作流程
|
||
|
||
```
|
||
第 1 次扫描(立即)
|
||
↓ 未找到
|
||
等待 0.5 秒
|
||
↓
|
||
第 2 次扫描
|
||
↓ 未找到
|
||
等待 0.5 秒
|
||
↓
|
||
...(重复 5 次)
|
||
```
|
||
|
||
### 输出示例
|
||
|
||
**第 1 次成功**:
|
||
```
|
||
🔍 扫描购票人元素...
|
||
✓ 已选择: 张三
|
||
```
|
||
|
||
**第 3 次成功**:
|
||
```
|
||
🔍 扫描购票人元素...
|
||
⚠ 未找到包含 '张三' 的元素
|
||
第 2 次尝试...
|
||
⚠ 未找到包含 '张三' 的元素
|
||
第 3 次尝试...
|
||
✓ 第 3 次尝试成功找到用户元素
|
||
✓ 已选择: 张三
|
||
```
|
||
|
||
### 性能影响
|
||
|
||
| 场景 | 额外等待时间 |
|
||
|------|------------|
|
||
| 第 1 次成功 | 0 秒 |
|
||
| 第 2 次成功 | 0.5 秒 |
|
||
| 第 3 次成功 | 1.0 秒 |
|
||
| 第 5 次成功 | 2.0 秒 |
|
||
| 全部失败 | 2.5 秒 |
|
||
|
||
---
|
||
|
||
## 快速检查清单
|
||
|
||
遇到问题时,按顺序检查:
|
||
|
||
### 找不到用户问题
|
||
|
||
- [ ] page_load_delay 是否足够大?(建议 3-5 秒)
|
||
- [ ] fast_mode 是否关闭?(调试时建议关闭)
|
||
- [ ] 用户名格式是否与页面一致?(检查空格、后缀)
|
||
- [ ] 是否查看了完整的扫描输出?
|
||
- [ ] 页面是否完全加载?(手动检查)
|
||
- [ ] 网络是否稳定?(刷新测试)
|
||
|
||
### 配置优化
|
||
|
||
- [ ] 是否启用了 fast_mode?
|
||
- [ ] dates 和 prices 是否配置了多个格式?
|
||
- [ ] max_retries 是否足够大?
|
||
- [ ] page_load_delay 是否适合当前网络?
|
||
|
||
---
|
||
|
||
## 附录
|
||
|
||
### A. 完整配置模板
|
||
|
||
```json
|
||
{
|
||
"index_url": "https://www.damai.cn/",
|
||
"login_url": "https://passport.damai.cn/login",
|
||
"target_url": "https://detail.damai.cn/item.htm?id=XXXXXX",
|
||
"users": ["观众姓名"],
|
||
"city": "",
|
||
"dates": [],
|
||
"prices": [],
|
||
"fast_mode": true,
|
||
"if_listen": true,
|
||
"if_commit_order": true,
|
||
"max_retries": 1000,
|
||
"page_load_delay": 2
|
||
}
|
||
```
|
||
|
||
### B. 依赖清单
|
||
|
||
```
|
||
selenium>=4.0.0
|
||
chromedriver-autoinstaller>=0.6.0
|
||
```
|
||
|
||
### C. 目录结构
|
||
|
||
```
|
||
ticket-purchase/
|
||
├── damai/
|
||
│ ├── __init__.py
|
||
│ ├── damai.py # 主入口
|
||
│ ├── concert.py # 核心逻辑
|
||
│ ├── config.py # 配置类
|
||
│ └── check_environment.py # 环境检查
|
||
├── config.json # 配置文件(需自行创建)
|
||
├── requirements.txt # 依赖清单
|
||
└── README.md # 本文档
|
||
```
|
||
|
||
---
|
||
|
||
## 总结
|
||
|
||
### 关键特性
|
||
|
||
✅ **完全自动化** - 从登录到提交订单全程自动
|
||
✅ **性能优化** - 快速模式提升 50-70% 速度
|
||
✅ **智能重试** - 用户扫描自动重试 5 次
|
||
✅ **模糊匹配** - 支持多种日期和价格格式
|
||
✅ **多平台支持** - PC 端和移动端自适应
|
||
✅ **详细日志** - 便于调试和问题排查
|
||
|
||
### 使用建议
|
||
|
||
1. **首次使用**:关闭 fast_mode,增加 page_load_delay
|
||
2. **网络较慢**:增加 page_load_delay 到 5-10 秒
|
||
3. **调试问题**:关闭 fast_mode,查看详细输出
|
||
4. **正式抢票**:根据测试结果选择合适的配置
|
||
|
||
---
|
||
|
||
**祝您抢票成功!** 🎉
|
||
|
||
如有问题或建议,欢迎反馈。
|