アニメ情報を取得するAPIを比較する
ShangriLa Anime API
クールごとのアニメ情報を返却してくれるAPI
[
{
"id": 1663,
"title": "アグレッシブ烈子 シーズン5"
},
{
"id": 1664,
"title": "あやかしトライアングル"
},
{
"id": 1665,
"title": "アルスの巨獣"
},
{
"id": 1725,
"title": "もういっぽん!"
},
{
"id": 1666,
"title": "イジらないで、長瀞さん 2nd Attack"
}
...省略
]
一番上にでてくるのはhttp
だけど、制作者のがDenoに移行したと発信している。
現在はこちらで稼働しているっぽい。
メディア芸術データベース API
ぱっとみた感じAPIは廃止されて、SPARQLクエリサービスに代替えになっている?
要調査必要
Annict API
Annictはアニメ視聴記録サービスで、開発者向けにGraphQL APIを提供しています。作品情報、エピソード情報、ユーザーの視聴状況などを取得できます。
- GraphQLを採用し、柔軟なクエリが可能
- 詳細なエピソード情報やスタッフ情報を取得可能
- 個人用アクセストークンによる認証が必要
REST API
リクエストヘッダーに「Authorization: Bearer {token}」でアクセストークンを付与してAPIを実行します。
{
"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
リクエストヘッダーに「Authorization: Bearer {token}」でアクセストークンを付与してAPIを実行します。
2024年冬アニメのタイトルと各話リストを取得する例です(長いので一部省略しています)。
{
searchWorks(seasons: ["2024-winter"]) {
edges {
node {
title
episodes {
nodes {
number
title
}
}
}
}
}
}
{
"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": "卵/黄金郷"
}
]
}
}
}
]
}
}
}
ユーザー登録する
登録後、Client ID
とClient ID
を確認します。
認証情報を取得する
MyAnimeList API の認証ドキュメントを確認して、手順に沿ってアクセストークンを発行します。
手こずったので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
実際にリクエストボディはこんな感じになると思います。
code
はStep 5: MyAnimeList redirects back to the client
でリダイレクトされたcode
の値を使用し、code_verifier
はStep 2: Client requests OAuth 2.0 authentication
で設定したcode_challenge
の値を設定します。
うまくいけばアクセストークンを取得できます。
{
"token_type": "Bearer",
"expires_in": 2415600,
"access_token": "ACCESS_TOKEN",
"refresh_token": "REFRESH_TOKEN"
}