ワールドカップ、盛り上がってきましたね。サッカーというかスポーツ全般への関心は人並み以下な自分ですが、これだけ SMG (スーパー・ミラクル・ゲームw)を見せられると流石に気分が高揚してしまいます。さて、グループリーグも結果が出揃い、ふと「全試合結果ってネットから API で取れたりするのかな?」と思って調べたところ、こんなのが↓。
イランの基礎科学研究所という所が運営している API の叩き方が纏められています。簡単そうなので、早速手順に従ってやってみます(bash と curl, 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試合の結果データが取得できますた!