【さっぽろえきバスナビ】バス接近情報（バスロケーション）APIをjsonで取得する

# さっぽろえきバスナビとは？
札幌市が運営している札幌市内の公共交通機関の経路案内や時刻表を載せているウェブサイトです。
AndroidやiPhoneアプリも公開されています。

https://ekibus.city.sapporo.jp/

## バスロケーションシステムとは？
バスの走行位置・遅れ時間が分かる機能で、２０２１年から導入されました。
札幌市内を走るほとんどのバス路線に対応しています。

# 路線ごとの接近情報を取得する

```Get_busstop_lastdata``` と ```Get_busstop_list``` のAPIを使って取得することができます。ただし、それぞれのバス停の発車時刻は取得できません。

※APIはいろいろありますが、バスロケーションシステムに関係するAPIのみ掲載しています。

:::note 
電車（JR北海道）とは違いAPIになっているため、取得したいデータを指定して ```POST``` で送ってあげる必要があります。
:::

```course_id``` と ```station_id``` が必要です。

```
course_id 路線番号
station_id 停留所番号
```

:::note info
```get_busstop_list_set``` API（検索API）を使って取得することができます。
:::

## バス停一覧（Get_busstop_lastdata）

POST先URL
```https://ekibus-api.city.sapporo.jp/Get_busstop_lastdata```

ペイロードに、```course_id``` と ```station_id``` を指定します。
```text:post_data
{
  'kind' : '0',
  'course_id' : course_id,
  'station_id' : station_id,
  'lang' : ''
}
```
以下のような形で返ってきます。
```json:Get_busstop_lastdata（抜粋）
{
    "result": "0",
    "course_id": "340113",
    "station_last_id": "340002",
    "station_data_list": [
        {
            "station_id": "340238",
            "name": "新札幌駅(新札幌ターミナル)"
        },
        {
            "station_id": "340237",
            "name": "東商業高校前"
        },
        {
            "station_id": "340236",
            "name": "厚別西通"
        },
```
```station_data_list``` の中身がバス停一覧になっています。

:::note info
```station_last_id``` はこの後の処理で使います。
:::

## バス現在位置（Get_busstop_list）

POST先URL
```https://ekibus-api.city.sapporo.jp/Get_busstop_list```

ペイロードに、```course_id_list``` と ```station_id_list``` を指定します。

```text:post_data
{
  'kind' : '0',
  'course_id_list' : course_id,
  'station_id_list' : station_id_list,
  'lang' : ''
}
```

:::note info
```course_id_list``` は ```course_id``` と同じ値です。
:::

:::note warn
 ```station_id_list``` は ```Get_busstop_lastdata``` APIで取得した値を使います。
:::

以下のような形で返ってきます。
```json:Get_busstop_list（抜粋）
{
    "result": "0",
    "data": [
        {
            "line_id": 340153,
            "line_name": "新札幌線[１]",
            "course_id": "340113",
            "course_id_name": "新札幌駅→ＪＲ札幌駅",
            "station_id": "340002",
            "station_id_name": "時計台前(市役所)",
            "pos": 25,
            "stop_no": "1",
            "terminal_flg": 0,
            "time_list": [
               {
                    "time": "10:40",
                    "start_time": "10:00",
                    "bus_status": 0,
                    "last_stop": 340237,
                    "last_stop_order": 1,
                    "delay_time": 1,
                    "course_id": "340113",
                    "note": "",
                    "barrier_free": 1
                },
```
<details><summary>time_listの見方</summary>

<table>
<caption>JSONの仕様</caption>
<thead><tr><th>名前</th><th>説明</th></tr>
</thead>
<tr><td>bus_status</td><td>運行状態（０：運行中）</td></tr>
<tr><td>last_stop_order</td><td>終着までのバス停数</td></tr>
<tr><td>start_time</td><td>始発の時間</td></tr>
<tr><td>time</td><td>終着の到着時間</td></tr>
<tr><td>delay_time</td><td>遅延時間（分単位）</td></tr>
<tr><td>note</td><td>備考</td></tr>
<tr><td>last_stop</td><td>現在位置</td></tr>
<tr><td>barrier_free</td><td>ノンステップバス</td></tr>
<tr><td>course_id</td><td>路線番号</td></tr>
</table>
</details>

つまり、```time_list``` の中で、```bus_status``` が ```1``` になっている ```last_stop``` を抽出すれば、バスの現在位置を知ることができます。
しかし、抽出できたバスの現在位置 ```lase_stop``` はバス停番号 ```station_id``` 
の状態のため、```バス停一覧（Get_busstop_lastdata）API``` で取得した、バス停リスト ```station_data_list``` を使って、バス停名にすると見やすくなります。

# 編集後記
さっぽろえきバスナビのAPIについてインターネット上を探しても、解説記事等全くヒットしなかったので、私用のメモとしてまとめました。地方だからでしょうか……