关于 oebb-scotty
oebb-scotty 介绍如何通过 ÖBB HAFAS mgate API 查询奥地利公共交通。它适用于行程规划和服务查询,涵盖地点搜索、路线、车站时刻表及服务提醒。
主要功能
- 01搜索车站、站点、地址和兴趣点
- 02规划地点间的行程
- 03查询车站出发和到达信息
- 04查看服务提醒和运行中断
- 05按交通类型筛选行程
适用场景
- 01规划行程前按名称查找站点
- 02比较两个地点间的路线
- 03查询车站出发信息
- 04查看当前运行中断
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mitsuhiko/ agent-stuff --skill oebb-scotty安装后在 Claude Code 中输入/oebb-scotty确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
arrivals.shdepartures.shdisruptions.shsearch-station.shtrip.sh详细介绍
ÖBB Scotty API
通过 HAFAS mgate API 查询奥地利公共交通的行程规划、车站出发信息和服务提醒。
快速参考
| 方法 | 用途 |
|---|---|
LocMatch | 按名称搜索车站/站点 |
TripSearch | 规划两个地点之间的行程 |
StationBoard | 获取车站的出发/到达信息 |
HimSearch | 获取服务提醒和中断信息 |
基础 URL: https://fahrplan.oebb.at/bin/mgate.exe
身份验证
所有请求都需要在 JSON 请求体中包含以下标头:
{
"id": "1",
"ver": "1.67",
"lang": "deu",
"auth": {"type": "AID", "aid": "OWDL4fE4ixNiPBBm"},
"client": {"id": "OEBB", "type": "WEB", "name": "webapp", "l": "vs_webapp"},
"formatted": false,
"svcReqL": [...]
}
1. 地点搜索(LocMatch)
按名称搜索车站、站点、地址或 POI。
请求
curl -s -X POST "https://fahrplan.oebb.at/bin/mgate.exe" \
-H "Content-Type: application/json" \
-d '{
"id":"1","ver":"1.67","lang":"deu",
"auth":{"type":"AID","aid":"OWDL4fE4ixNiPBBm"},
"client":{"id":"OEBB","type":"WEB","name":"webapp","l":"vs_webapp"},
"formatted":false,
"svcReqL":[{
"req":{"input":{"field":"S","loc":{"name":"Wien Hbf","type":"ALL"},"maxLoc":10}},
"meth":"LocMatch"
}]
}'
响应结构
{
"svcResL": [{
"res": {
"match": {
"locL": [{
"lid": "A=1@O=Wien Hbf (U)@X=16377950@Y=48184986@U=181@L=1290401@",
"type": "S",
"name": "Wien Hbf (U)",
"extId": "1290401",
"crd": { "x": 16377950, "y": 48184986 },
"pCls": 6015
}]
}
}
}]
}
地点类型
| 类型 | 描述 |
|---|---|
S | 车站/站点 |
A | 地址 |
P | POI(兴趣点) |
关键字段
| 字段 | 描述 |
|---|---|
lid | 地点 ID 字符串(在 TripSearch 中使用) |
extId | 外部车站 ID |
name | 车站名称 |
crd.x/y | 坐标(x=经度,y=纬度,乘以 10^6 缩放) |
pCls | 产品类别位掩码 |
2. 行程搜索(TripSearch)
规划两个地点之间的行程。
请求
curl -s -X POST "https://fahrplan.oebb.at/bin/mgate.exe" \
-H "Content-Type: application/json" \
-d '{
"id":"1","ver":"1.67","lang":"deu",
"auth":{"type":"AID","aid":"OWDL4fE4ixNiPBBm"},
"client":{"id":"OEBB","type":"WEB","name":"webapp","l":"vs_webapp"},
"formatted":false,
"svcReqL":[{
"req":{
"depLocL":[{"lid":"A=1@O=Wien Hbf@L=8103000@","type":"S"}],
"arrLocL":[{"lid":"A=1@O=Salzburg Hbf@L=8100002@","type":"S"}],
"jnyFltrL":[{"type":"PROD","mode":"INC","value":"1023"}],
"getPolyline":false,
"getPasslist":true,
"outDate":"20260109",
"outTime":"080000",
"outFrwd":true,
"numF":5
},
"meth":"TripSearch"
}]
}'
参数
| 参数 | 描述 |
|---|---|
depLocL | 出发地点(可多个)——使用 LocMatch 返回的 lid |
arrLocL | 到达地点(可多个) |
outDate | 出发日期(YYYYMMDD) |
outTime | 出发时间(HHMMSS) |
outFrwd | true = 向前搜索,false = 向后搜索 |
numF | 要返回的接续行程数量 |
jnyFltrL | 产品筛选条件(见下文) |
getPasslist | 包含中途停靠站 |
产品筛选值
| 位 | 值 | 产品 |
|---|---|---|
| 0 | 1 | ICE/RJX(高速列车) |
| 1 | 2 | IC/EC(城际列车) |
| 2 | 4 | NJ(夜间列车) |
| 3 | 8 | D/EN(特快列车) |
| 4 | 16 | REX/R(区域快车) |
| 5 | 32 | S-Bahn |
| 6 | 64 | 公交车 |
| 7 | 128 | 渡轮 |
| 8 | 256 | U-Bahn |
| 9 | 512 | 有轨电车 |
所有产品使用 1023,也可以将指定位的值相加。
响应结构
{
"svcResL": [{
"res": {
"outConL": [{
"date": "20260109",
"dur": "025200",
"chg": 0,
"dep": {
"dTimeS": "075700",
"dPltfS": {"txt": "8A-B"}
},
"arr": {
"aTimeS": "104900",
"aPltfS": {"txt": "7"}
},
"secL": [{
"type": "JNY",
"jny": {
"prodX": 0,
"dirTxt": "Salzburg Hbf",
"stopL": [...]
}
}]
}],
"common": {
"locL": [...],
"prodL": [...]
}
}
}]
}
关键行程字段
| 字段 | 描述 |
|---|---|
dur | 时长(HHMMSS) |
chg | 换乘次数 |
dTimeS | 计划出发时间 |
dTimeR | 实际出发时间(如有) |
aTimeS | 计划到达时间 |
aTimeR | 实际到达时间(如有) |
dPltfS.txt | 出发站台 |
aPltfS.txt | 到达站台 |
secL | 行程区段(各段) |
secL[].jny.prodX | common.prodL[] 中列车名称的索引 |
理解 prodX(产品索引)
重要: 行程区段中的 prodX 字段是 common.prodL[] 数组中的索引,而不是列车名称本身。要获取实际列车名称(例如“S7”“RJX 662”),必须查询 common.prodL[prodX].name。
使用 jq 提取行程摘要
原始 TripSearch 响应内容非常冗长。使用此 jq 筛选器,可提取包含解析后列车名称的简洁摘要:
curl -s -X POST "https://fahrplan.oebb.at/bin/mgate.exe" \
-H "Content-Type: application/json" \
-d '{ ... }' | jq '
.svcResL[0].res as $r |
$r.common.prodL as $prods |
[$r.outConL[] | {
dep: .dep.dTimeS,
arr: .arr.aTimeS,
depPlatform: .dep.dPltfS.txt,
arrPlatform: .arr.aPltfS.txt,
dur: .dur,
chg: .chg,
legs: [.secL[] | select(.type == "JNY") | {
train: $prods[.jny.prodX].name,
dir: .jny.dirTxt,
dep: .dep.dTimeS,
arr: .arr.aTimeS,
depPlatform: .dep.dPltfS.txt,
arrPlatform: .arr.aPltfS.txt
}]
}]'
输出示例:
[
{
"dep": "213900",
"arr": "221100",
"depPlatform": "1",
"arrPlatform": "3A-B",
"dur": "003200",
"chg": 0,
"legs": [{"train": "S 7", "dir": "Flughafen Wien Bahnhof", "dep": "213900", "arr": "221100", ...}]
}
]
3. 车站时刻表(StationBoard)
获取车站的出发或到达信息。
请求
curl -s -X POST "https://fahrplan.oebb.at/bin/mgate.exe" \
-H "Content-Type: application/json" \
-d '{
"id":"1","ver":"1.67","lang":"deu",
"auth":{"type":"AID","aid":"OWDL4fE4ixNiPBBm"},
"client":{"id":"OEBB","type":"WEB","name":"webapp","l":"vs_webapp"},
"formatted":false,
"svcReqL":[{
"req":{
"stbLoc":{"lid":"A=1@O=Wien Hbf@L=8103000@","type":"S"},
"date":"20260109",
"time":"080000",
"type":"DEP",
"maxJny":20
},
"meth":"StationBoard"
}]
}'
参数
| 参数 | 描述 |
|---|---|
stbLoc | 车站地点 |
date | 日期(YYYYMMDD) |
time | 时间(HHMMSS) |
type | DEP(出发)或 ARR(到达) |
maxJny | 最大行程数量 |
响应结构
{
"svcResL": [{
"res": {
"jnyL": [{
"prodX": 0,
"dirTxt": "Salzburg Hbf",
"stbStop": {
"dTimeS": "080000",
"dPltfS": {"txt": "8A-B"}
}
}],
"common": {
"prodL": [{
"name": "RJX 662",
"cls": 1,
"prodCtx": {"catOutL": "Railjet Xpress"}
}]
}
}
}]
}
4. 服务提醒(HimSearch)
获取当前的交通中断和服务信息。
请求
curl -s -X POST "https://fahrplan.oebb.at/bin/mgate.exe" \
-H "Content-Type: application/json" \
-d '{
"id":"1","ver":"1.67","lang":"deu",
"auth":{"type":"AID","aid":"OWDL4fE4ixNiPBBm"},
"client":{"id":"OEBB","type":"WEB","name":"webapp","l":"vs_webapp"},
"formatted":false,
"svcReqL":[{
"req":{
"himFltrL":[{"type":"PROD","mode":"INC","value":"255"}],
"maxNum":20
},
"meth":"HimSearch"
}]
}'
响应结构
{
"svcResL": [{
"res": {
"msgL": [{
"hid": "HIM_FREETEXT_843858",
"head": "Verringertes Sitzplatzangebot",
"text": "Wegen einer technischen Störung...",
"prio": 0,
"sDate": "20260108",
"eDate": "20260108"
}]
}
}]
}
常见车站 ID
| 车站 | extId |
|---|---|
| Wien Hbf | 8103000 |
| Wien Meidling | 8100514 |
| Wien Westbahnhof | 8101003 |
| Salzburg Hbf | 8100002 |
| Linz Hbf | 8100013 |
| Graz Hbf | 8100173 |
| Innsbruck Hbf | 8100108 |
| Klagenfurt Hbf | 8100085 |
| St. Pölten Hbf | 8100008 |
| Wr. Neustadt Hbf | 8100516 |
时间格式
- 日期:
YYYYMMDD(例如:20260109) - 时间:
HHMMSS(例如:080000= 08:00:00) - 时长:
HHMMSS(例如:025200= 2 小时 52 分钟)
错误处理
检查响应中的 err 字段:
{
"err": "OK", // Success
"err": "PARSE", // Invalid request format
"err": "NO_MATCH", // No results found
"errTxt": "..." // Error details
}
产品类别(cls 值)
| cls | 产品 |
|---|---|
| 1 | ICE/RJX |
| 2 | IC/EC |
| 4 | 夜间列车 |
| 8 | NJ/EN |
| 16 | REX/区域列车 |
| 32 | S-Bahn |
| 64 | 公交车 |
| 128 | 渡轮 |
| 256 | U-Bahn |
| 512 | 电车 |
| 1024 | 按需服务 |
| 2048 | 其他 |
评论
支持 Markdown