わたねこコーリング

野良プログラマ発、日々のアウトプット

【ワールドカップ】グループリーグの全試合結果を API で取得する

ワールドカップ、盛り上がってきましたね。サッカーというかスポーツ全般への関心は人並み以下な自分ですが、これだけ SMG (スーパー・ミラクル・ゲームw)を見せられると流石に気分が高揚してしまいます。さて、グループリーグも結果が出揃い、ふと「全試合結果ってネットから API で取れたりするのかな?」と思って調べたところ、こんなのが↓。

github.com

イランの基礎科学研究所という所が運営している API の叩き方が纏められています。簡単そうなので、早速手順に従ってやってみます(bashcurl, jq が必要となります)。

この API を利用するにはユーザ登録が必要とのことなので、ログイン名とメールアドレス・パスワードを指定して POST でリクエストします。

$ curl --location --request POST 'http://api.cup2022.ir/api/v1/user' \
    --header 'Content-Type: application/json' \
    --data-raw '{
    "name" : "<ログイン名>",
    "email": "<メールアドレス>",
    "password": "<パスワード>",
    "passwordConfirm" : "<パスワード>"
    }' | jq .
{
  "status": "success",
  "message": "User created",
  "data": {
    "token": "<アクセストークン>"
  }
}

レスポンスされた JSON にアクセストークンが払い出されているので、以後の API 利用ではこれを使って Bearer 認証します。最初に全試合一覧を取得・保存してみます。

$ curl --location --request GET 'http://api.cup2022.ir/api/v1/match' \
    --header 'Authorization: Bearer <アクセストークン>' \
    --header 'Content-Type: application/json' | jq . > matches.json

取得したデータを覗いてみます。

$ cat matches.json
{
  "status": "success",
  "data": [
    {
      "_id": "629c9c8a5749c4077500ead4",
      "away_score": 2,
      "away_scorers": [
        "Cody Gakpo,Davy Klaassen\n"
      ],
      "away_team_id": "4",
      "finished": "TRUE",
      "group": "A",
      "home_score": 0,
      "home_scorers": [
        "null"
      ],
      "home_team_id": "3",
      "id": "1",
      "local_date": "11/21/2022 19:00",
      "matchday": "2",
      "persian_date": "1400-08-30 19:30",
      "stadium_id": "1",
      "time_elapsed": "finished",
      "type": "group",
      "home_team_fa": "سنگال",
      "away_team_fa": "هلند",
      "home_team_en": "Senegal",
      "away_team_en": "Netherlands",
      "home_flag": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fd/Flag_of_Senegal.svg/125px-Flag_of_Senegal.svg.png",
      "away_flag": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/20/Flag_of_the_Netherlands.svg/125px-Flag_of_the_Netherlands.svg.png"
    },
    (中略)
  ]
}

ふむふむ、このデータ中の .data[].type が "group" のレコードがグループリーグの試合のよう。グループ名・試合日時(現地)・ホームチーム・アウェイチーム・ホーム得点・アウェイ得点はそれぞれ、.data[].group .local_date .home_team_en .away_team_en .home_score .away_score から取れば良さげ。では、jq にこれらの抽出スクリプトを指定して、タブ区切りデータに加工します。

$ jq -r '.data[] | select(.type == "group") | [.group, .local_date, .home_team_en, .away_team_en, .home_score, .away_score] | @tsv' matches.json | sort
A	11/20/2022 19:00	Qatar	Ecuador	0	2
A	11/21/2022 19:00	Senegal	Netherlands	0	2
A	11/25/2022 16:00	Qatar	Senegal	1	3
A	11/25/2022 19:00	Netherlands	Ecuador	1	1
A	11/29/2022 18:00	Ecuador	Senegal	1	2
(後略)

これで全48試合の結果データが取得できますた!

タブ区切りデータを Excel で読み出すとこんな感じ