名称: srt
描述: 韩国SRT(超级高铁)列车查询、预订及订单管理
主页: https://github.com/khj809/openclaw-srt-skill
user-invocable: true
元数据:
{
"openclaw":
{
"emoji": "🚅",
"requires": { "bins": ["python3", "uv"], "env": ["SRT_PHONE", "SRT_PASSWORD"] },
"install": [
{"id": "uv", "kind": "uv", "package": "SRTrain", "label": "从 PyPI 安装 SRTrain (uv) — 来源: https://pypi.org/project/SRTrain / https://github.com/ryanking13/SRT"}
]
},
}
SRT_PHONE(格式:010-XXXX-XXXX)和 SRT_PASSWORD。环境变量:
| 变量 | 必填 | 描述 |
|------|------|------|
| SRT_PHONE | ✅ | SRT 账户手机号(需包含连字符:010-XXXX-XXXX) |
| SRT_PASSWORD | ✅ | SRT 账户密码 |
| SRT_DATA_DIR | 可选 | 日志、缓存和状态文件的存储目录。默认为系统临时目录(/tmp/srt)。 |
车站名称(仅限韩语):
수서, 부산, 동대구, 대전, 천안아산, 오송, 광주송정, 울산, 포항, 경주, 김천구미, 익산, 전주, 목포, 신경주
日期: YYYYMMDD · 时间: HHMMSS(例如 200000 表示 20:00)
cd <项目目录> && uv run --with SRTrain python3 scripts/srt_cli.py train search \
--departure "수서" --arrival "동대구" --date "20260227" --time "200000"
查询参数和结果会被缓存(在 SRT_DATA_DIR 中),供 reserve 命令使用。
cd <项目目录> && uv run --with SRTrain python3 scripts/srt_cli.py reserve one-shot --train-id "1"
--train-id 是查询结果中基于 1 的索引号。必须先运行 train search。
cd <项目目录> && uv run --with SRTrain python3 scripts/srt_cli.py reserve list --format json
cd <项目目录> && uv run --with SRTrain python3 scripts/srt_cli.py reserve cancel \
--reservation-id "RES123456" --confirm
对于“持续尝试直到有座位”的请求,请勿在 cron 任务内部循环。
正确的做法是:将 srt_cli.py reserve retry 作为持久后台进程运行,然后创建一个独立的 cron 任务来读取日志并报告。
cd <项目目录> && uv run --with SRTrain python3 scripts/srt_cli.py train search \
--departure "수서" --arrival "동대구" --date "20260227" --time "200000"
从结果中记下目标列车的 train_id。
LOG_FILE=<任意路径>.log
PID_FILE=<任意路径>.pid
cd <项目目录> && nohup uv run --with SRTrain python3 scripts/srt_cli.py reserve retry \
--train-id <id> --timeout-minutes 1440 --wait-seconds 10 \
--log-file "$LOG_FILE" > /dev/null 2>&1 &
echo $! > "$PID_FILE"
脚本启动时会打印 LOG_FILE: <路径> — 请捕获此信息以确知日志写入位置。
你也可以设置 SRT_DATA_DIR 来控制自动生成的日志和缓存文件的存放位置。
路径安全:
SRT_DATA_DIR和--log-file会在运行时验证,确保其路径仅解析到用户主目录或系统临时目录内。试图逃逸这些边界(例如通过../)的路径将被拒绝。
reserve retry 选项:
| 选项 | 默认值 | 描述 |
|------|--------|------|
| --train-id | (全部) | 基于查询结果的 1 起始索引;多个 ID 用逗号分隔 |
| --timeout-minutes | 60 | 总持续时间。使用 1440 表示 24 小时 |
| --wait-seconds | 10 | 尝试之间的延迟 |
| --log-file | 自动生成 | 显式指定日志文件路径(覆盖 SRT_DATA_DIR 的默认值) |
需要关注的日志标记:
- === 시도 #N — 尝试次数
- SUCCESS — 预订成功(包含 예약번호, 좌석)
- TIMEOUT — 超时未成功
创建一个独立的 agentTurn cron 任务(每 15 分钟),并设置 --no-deliver(交付模式:无)。
代理必须使用 message 工具直接向 Discord 频道发送消息 — 请不要使用 --announce(在独立会话中,公告队列可能因网关配对错误而失败)。
CLI 命令:
openclaw cron add \
--agent srt \
--name "SRT 모니터링 보고 (15분마다)" \
--every 15m \
--session isolated \
--no-deliver \
--message "..."
代理消息必须指示:
1. 检查进程状态:
bash
cd <项目目录> && uv run --with SRTrain python3 scripts/srt_cli.py reserve status --pid-file <pid_file>
2. 读取日志尾部:tail -50 <log_file>
3. 总结尝试次数、上次尝试时间、成功/失败情况
4. 通过 message 工具发送报告(channel=discord, target=<channel_id>)
5. 如果日志中出现 SUCCESS → 在消息中包含 예약번호/좌석,然后删除此 cron 任务和终止任务
6. 如果状态为 NOT_RUNNING 且日志中无 SUCCESS → 报告进程崩溃,删除此 cron 任务
消息负载必须包含此任务自身的 ID 和终止任务的 ID,以便它能自行删除。
创建一个独立的 agentTurn at 计划 cron 任务(--no-deliver, --delete-after-run),在截止时间执行。
CLI 命令:
openclaw cron add \
--agent srt \
--name "SRT 모니터링 종료" \
--at "<ISO UTC 时间>" \
--session isolated \
--no-deliver \
--delete-after-run \
--message "..."
代理消息必须指示:
1. 停止进程:
bash
cd <项目目录> && uv run --with SRTrain python3 scripts/srt_cli.py reserve stop --pid-file <pid_file>
2. 按 ID 删除报告 cron 任务
3. 读取最终日志,并通过 message 工具将结果发送到 Discord 频道
查询结果项:
{
"train_number": "369",
"departure_time": "200000",
"arrival_time": "213600",
"departure_station": "수서",
"arrival_station": "동대구",
"seat_available": false,
"general_seat": "매진",
"special_seat": "매진",
"train_id": "1"
}
预订结果:
{
"success": true,
"data": {
"reservation_id": "RES123456",
"train_number": "369",
"seat_number": "3A",
"payment_required": true
}
}
退出代码:0 = 成功 · 1 = 可重试(无座位) · 2 = 致命错误
| 错误 | 原因 | 解决方案 |
|---|---|---|
AuthenticationFailed |
凭据错误 | 检查 SRT_PHONE / SRT_PASSWORD |
NoSeatsAvailable |
已售罄 | 使用 --retry 或尝试其他列车 |
StationNotFound |
无效车站名 | 使用上方列出的韩语车站名称 |
NoTrainsFound |
未找到列车 | 尝试不同的日期/时间 |
RateLimitExceeded |
尝试次数过多 | 等待几分钟 |
从韩语输入中提取:
- 车站 → 韩语名称(수서, 동대구 等)
- 日期 → 相对日期("내일", "다음주 금요일")转换为 YYYYMMDD
- 时间 → ("20시 이후", "오후 2시")转换为 HHMMSS
- 乘客数量 → 如未指定,默认为 1
模式:
- "검색해줘" → train search
- "예약해줘"(一次性)→ train search 然后 reserve one-shot
- "취소표 나오면 잡아줘 / 될 때까지 돌려줘" → 执行上述持续监控流程
- "내 예약 확인해줘" → reserve list
- "취소해줘" → list 然后 cancel
预订成功后,必须在约 20 分钟内通过 SRT 应用或 https://etk.srail.kr 完成支付。