OA0 = Omni AI 0
OA0 是一个探索 AI 的论坛
现在注册
已注册用户请  登录
OA0  ›  技能包  ›  srt:韩国 SRT 高铁搜索、预订与行程管理工具

srt:韩国 SRT 高铁搜索、预订与行程管理工具

 
  code ·  2026-02-18 09:40:48 · 3 次点击  · 0 条评论  

名称: 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 韩国高铁服务技能

前置条件

  • 运行脚本前,必须设置环境变量 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 任务来读取日志并报告。

步骤 1:查询(填充缓存)

cd <项目目录> && uv run --with SRTrain python3 scripts/srt_cli.py train search \
  --departure "수서" --arrival "동대구" --date "20260227" --time "200000"

从结果中记下目标列车的 train_id

步骤 2:启动后台重试进程

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 — 超时未成功

步骤 3:创建定期报告 cron 任务

创建一个独立的 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,以便它能自行删除。

步骤 4:创建终止任务

创建一个独立的 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 频道


JSON 输出

查询结果项:

{
  "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 完成支付。

3 次点击  ∙  0 人收藏  
登录后收藏  
目前尚无回复
0 条回复
About   ·   Help   ·    
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
Developed with Cursor