文件内容
README.md
# 12306 Android ADB 火车票自动化
## 工作原理
12306 App 是混合架构:
- **首页**:原生 Android 控件 → ADB tap 有效
- **车次列表**:UC WebView → ADB tap 被过滤,需 uiautomator2
- **购票/支付**:WebView
### 核心发现
12306 App 使用的 UC WebView 会过滤 ADB 注入的触摸事件(`input tap`、`motionevent`、`monkey`、`sendevent` 全部失败)。只有通过 **AccessibilityService** 发起的点击(uiautomator2)才能在 WebView 上生效。
## 安装
```bash
cd ~/.openclaw/workspace/skills/12306-android-adb
pip3 install uiautomator2
python3 -m uiautomator2 init # 手机上安装 ATX Agent (需要解锁屏幕)
```
## 使用
### 1. 查询车次
```bash
# 查询明天早上 6-10 点的车次(无需 uiautomator2 agent)
python3 book_12306.py --date 2026-05-19 --time-min 06:00 --time-max 10:00 --list-only
```
### 2. 预订车票(需要 uiautomator2)
```bash
python3 book_12306.py --train G7004 --passenger 熊天放 --date 2026-05-19
```
### 3. 试运行(在指纹验证前停止)
```bash
python3 book_12306.py --train G7004 --dry-run
```
## 流程
| 步骤 | 操作 | 方式 | 自动化 |
|------|------|------|--------|
| 1 | 打开 App 首页 | ADB native | ✅ |
| 2 | 设置日期/站点 | ADB native | ✅ |
| 3 | 查询车票 | ADB native | ✅ |
| 4 | 滚动到目标车次 | ADB swipe | ✅ |
| 5 | 点击车次 | **uiautomator2** | ✅ |
| 6 | **指纹验证** | 物理指纹 | ❌ |
| 7 | 选择座位/乘客 | uiautomator2 | ✅ |
| 8 | 提交订单 | uiautomator2 | ✅ |
## 技术调查总结
本次调查确认了 OpenClaw 失败的原因:
1. **UC WebView 拒绝 ADB 触摸事件** — 这是根本原因。所有 `input tap`、`motionevent`、`sendevent`、`monkey` 方法都尝试过,全部无法在车次列表 WebView 中触发点击。
2. **uiautomator2 使用 AccessibilityService 点击** — 这是解决方案。通过 `d(textContains="G7004").click()` 成功导航到购票页。
3. **成功订到 G7004** — 2026-05-19 08:00 上海→苏州,二等座有票,一等座余票 2 张。
4. **指纹验证无法绕过的安全边界** — 12306 要求物理指纹验证,这是自动化必须停止的点。