Closed5

アニメ情報を取得するAPIを比較する

スイスイ

ShangriLa Anime API

クールごとのアニメ情報を返却してくれるAPI

https
[
    {
        "id": 1663,
        "title": "アグレッシブ烈子 シーズン5"
    },
    {
        "id": 1664,
        "title": "あやかしトライアングル"
    },
    {
        "id": 1665,
        "title": "アルスの巨獣"
    },
    {
        "id": 1725,
        "title": "もういっぽん!"
    },
    {
        "id": 1666,
        "title": "イジらないで、長瀞さん 2nd Attack"
    }
    ...省略
]

一番上にでてくるのはhttpだけど、制作者のがDenoに移行したと発信している。
https://note.com/akb428/n/n2362a0e1b6af

現在はこちらで稼働しているっぽい。
https://github.com/Project-ShangriLa/anime_api_deno

スイスイ

Annict API

Annictはアニメ視聴記録サービスで、開発者向けにGraphQL APIを提供しています。作品情報、エピソード情報、ユーザーの視聴状況などを取得できます。

  • GraphQLを採用し、柔軟なクエリが可能
  • 詳細なエピソード情報やスタッフ情報を取得可能
  • 個人用アクセストークンによる認証が必要

REST API

https://api.annict.com/v1/works

リクエストヘッダーに「Authorization: Bearer {token}」でアクセストークンを付与してAPIを実行します。

response
{
    "works": [
        {
            "id": 12302,
            "title": "乙女なでしこ恋手帖",
            "title_kana": "",
            "title_en": "",
            "media": "ova",
            "media_text": "OVA",
            "released_on": "",
            "released_on_about": "",
            "official_site_url": "",
            "wikipedia_url": "https://ja.wikipedia.org/wiki/%E4%B9%99%E5%A5%B3%E3%81%AA%E3%81%A7%E3%81%97%E3%81%93%E6%81%8B%E6%89%8B%E5%B8%96#%E3%82%A2%E3%83%8B%E3%83%A1",
            "twitter_username": "",
            "twitter_hashtag": "",
            "syobocal_tid": "",
            "mal_anime_id": "13673",
            "images": {
                "recommended_url": "",
                "facebook": {
                    "og_image_url": ""
                },
                "twitter": {
                    "mini_avatar_url": "",
                    "normal_avatar_url": "",
                    "bigger_avatar_url": "",
                    "original_avatar_url": "",
                    "image_url": ""
                }
            },
            "episodes_count": 0,
            "watchers_count": 2,
            "reviews_count": 0,
            "no_episodes": true,
            "season_name": "2012-winter",
            "season_name_text": "2012年冬"
        }
    ]
    ...省略
}

GraphQL

https://api.annict.com/graphql

リクエストヘッダーに「Authorization: Bearer {token}」でアクセストークンを付与してAPIを実行します。

2024年冬アニメのタイトルと各話リストを取得する例です(長いので一部省略しています)。

body
{
    searchWorks(seasons: ["2024-winter"]) {
        edges {
            node {
                title
                episodes {
                    nodes {
                        number
                        title
                    }
                }
            }
        }
    }
}
response
{
  "data": {
    "searchWorks": {
      "edges": [
        {
          "node": {
            "title": "イワジュ",
            "episodes": {
              "nodes": []
            }
          }
        },
        {
          "node": {
            "title": "いっしょにあそぼう!くまのプーさん",
            "episodes": {
              "nodes": []
            }
          }
        },
        {
          "node": {
            "title": "映画しまじろう ミラクルじまのなないろカーネーション",
            "episodes": {
              "nodes": []
            }
          }
        },
        {
          "node": {
            "title": "ザ・スパイダー・ウィズイン",
            "episodes": {
              "nodes": []
            }
          }
        },
        {
          "node": {
            "title": "ダンジョン飯",
            "episodes": {
              "nodes": [
                {
                  "number": 14,
                  "title": "シーサーペント"
                },
                {
                  "number": 19,
                  "title": "山姥/夢魔"
                },
                {
                  "number": 5,
                  "title": "おやつ/ソルベ"
                },
                {
                  "number": 13,
                  "title": "炎竜3/良薬"
                },
                {
                  "number": 6,
                  "title": "宮廷料理/塩茹で"
                },
                {
                  "number": 24,
                  "title": "ダンプリング2/ベーコンエッグ"
                },
                {
                  "number": 7,
                  "title": "水棲馬/雑炊/蒲焼き"
                },
                {
                  "number": 20,
                  "title": "アイスゴーレム/バロメッツ"
                },
                {
                  "number": 10,
                  "title": "大ガエル/地上にて"
                },
                {
                  "number": 3,
                  "title": "動く鎧"
                },
                {
                  "number": 8,
                  "title": "木苺/焼き肉"
                },
                {
                  "number": 9,
                  "title": "テンタクルス/シチュー"
                },
                {
                  "number": 12,
                  "title": "炎竜2"
                },
                {
                  "number": 15,
                  "title": "ドライアド/コカトリス"
                },
                {
                  "number": 11,
                  "title": "炎竜1"
                },
                {
                  "number": 22,
                  "title": "グリフィン/使い魔"
                },
                {
                  "number": 16,
                  "title": "掃除屋/みりん干し"
                },
                {
                  "number": 17,
                  "title": "ハーピー/キメラ"
                },
                {
                  "number": 23,
                  "title": "グリフィンのスープ/ダンプリング1"
                },
                {
                  "number": 18,
                  "title": "シェイプシフター"
                },
                {
                  "number": 4,
                  "title": "キャベツ煮/オーク"
                },
                {
                  "number": 1,
                  "title": "水炊き/タルト"
                },
                {
                  "number": 2,
                  "title": "ローストバジリスク/オムレツ/かき揚げ"
                },
                {
                  "number": 21,
                  "title": "卵/黄金郷"
                }
              ]
            }
          }
        }
      ]
    }
  }
}

スイスイ

MyAnimeList

トークン取得が複雑
公式サイトからはblondeで検索が可能なことからAPIもいけるかもしれない。

認証方法はこのあと書く

スイスイ

ユーザー登録する

登録後、Client IDClient IDを確認します。

認証情報を取得する

MyAnimeList API の認証ドキュメントを確認して、手順に沿ってアクセストークンを発行します。
https://myanimelist.net/apiconfig/references/authorization

手こずったので1個ずつ記載。。
Step 2: Client requests OAuth 2.0 authenticationでクライアントがOAuth 2.0認証を要求します。
ドキュメントを見るとこのように記載があり、実際にPostmanでパラメータを設定したあと、
URLをベタ打ちします。

Parameter Description
response_type REQUIRED. Value MUST be set to “code”.
client_id REQUIRED.
state RECOMMENDED. OAuth 2.0 state
redirect_uri OPTIONAL. If you registered only one redirection URI in advance, you can omit this parameter. If you set this, the value must exactly match one of your pre-registered URIs.
code_challenge REQUIRED. A minimum length of 43 characters and a maximum length of 128 characters. See the details for the PKCE code_challenge.
code_challenge_method OPTIONAL. Defaults to plain if not present in the request. Currently, only the plain method is supported.

URLを組み立てたあとのイメージはこんな感じ
https://myanimelist.net/v1/oauth2/authorize?response_type=code&client_id={client_id}&code_challenge={code_challenge}&code_challenge_method=plain&redirect_uri={redirect_uri}&state={state}

認証後はStep 5: MyAnimeList redirects back to the clientで記載のある通り、ユーザー登録後に設定したリダイレクトURLにcodeとstateを付与してリダイレクトされます。

MyAnimeList authorization server redirects back to YOUR_REDIRECT_URI.

HTTP/1.1 302 Found
Location: YOUR_REDIRECT_URI?code=AUTHORIZATION_CODE
&state=YOUR_STATE
Parameter Description
code The authorization code returned from the initial request. Normally, this value is nearly 1,000 bytes long.
state The state value you send the request with.

リダイレクトに成功したらアクセストークンを発行します。
PostmanからPOSTリクエストを送信するので、Scheme 2: including the client credentials in the request-bodyに従いリクエストボディを作成します。
2個やり方があるので好きな方でやる(1個目だとやり方がよくなくてうまくいかなかった)

POST https://myanimelist.net/v1/oauth2/token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded

client_id=YOUR_CLIENT_ID
&client_secret=YOUR_CLIENT_SECRET
&grant_type=authorization_code
&code=AUTHORIZATION_CODE
&redirect_uri=YOUR_REDIRECT_URI
&code_verifier=YOUR_PKCE_CODE_VERIFIER

実際にリクエストボディはこんな感じになると思います。
codeStep 5: MyAnimeList redirects back to the clientでリダイレクトされたcodeの値を使用し、code_verifierStep 2: Client requests OAuth 2.0 authenticationで設定したcode_challengeの値を設定します。

うまくいけばアクセストークンを取得できます。

{
  "token_type": "Bearer",
  "expires_in": 2415600,
  "access_token": "ACCESS_TOKEN",
  "refresh_token": "REFRESH_TOKEN"
}
このスクラップは7日前にクローズされました