mcpField
O
oebb-scotty

oebb-scotty

github.com/mitsuhiko生产力3.2k105 次安装4 周前更新
代码仓库

关于 oebb-scotty

oebb-scotty 介绍如何通过 ÖBB HAFAS mgate API 查询奥地利公共交通。它适用于行程规划和服务查询,涵盖地点搜索、路线、车站时刻表及服务提醒。

主要功能

  1. 01搜索车站、站点、地址和兴趣点
  2. 02规划地点间的行程
  3. 03查询车站出发和到达信息
  4. 04查看服务提醒和运行中断
  5. 05按交通类型筛选行程

适用场景

  1. 01规划行程前按名称查找站点
  2. 02比较两个地点间的路线
  3. 03查询车站出发信息
  4. 04查看当前运行中断

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mitsuhiko/agent-stuff --skill oebb-scotty

安装后在 Claude Code 中输入/oebb-scotty确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

arrivals.sh
departures.sh
disruptions.sh
search-station.sh
trip.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地址
PPOI(兴趣点)
关键字段
字段描述
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)
outFrwdtrue = 向前搜索,false = 向后搜索
numF要返回的接续行程数量
jnyFltrL产品筛选条件(见下文)
getPasslist包含中途停靠站
产品筛选值
位值产品
01ICE/RJX(高速列车)
12IC/EC(城际列车)
24NJ(夜间列车)
38D/EN(特快列车)
416REX/R(区域快车)
532S-Bahn
664公交车
7128渡轮
8256U-Bahn
9512有轨电车

所有产品使用 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.prodXcommon.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)
typeDEP(出发)或 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 Hbf8103000
Wien Meidling8100514
Wien Westbahnhof8101003
Salzburg Hbf8100002
Linz Hbf8100013
Graz Hbf8100173
Innsbruck Hbf8100108
Klagenfurt Hbf8100085
St. Pölten Hbf8100008
Wr. Neustadt Hbf8100516

时间格式

  • 日期: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产品
1ICE/RJX
2IC/EC
4夜间列车
8NJ/EN
16REX/区域列车
32S-Bahn
64公交车
128渡轮
256U-Bahn
512电车
1024按需服务
2048其他

评论

支持 Markdown