Logo ひまぶろぐ

AnnictAPIを使ってアニメ情報を取得してみた

2025/1/23
2分で読めます
Table of Contents

Annict

アニメ情報を検索とか、アニメの記録をつけることができるサイト。
AnnictはAPIを提供しているので、それを使って情報を取得したいだけ。そんな記事です。

アクセストークンの取得

まずアクセストークンを取得しましょう。
これにはアカウントが必要なので、アカウントを持っていない方はアカウントを取ってください。

https://annict.com/settings/apps にアクセスします。

個人用アクセストークンの「新規作成」をクリックします。

ここは説明を適切に入れて、「登録」をクリック。
スコープは今回は取得だけなので読み込み専用でいいです。

アクセストークンが表示されるのでこれを適当なところにコピーしててくださいね。再表示できないので。

情報取得

今回はpythonを使いました。コレしか書けないので。

まず.envファイルを作っておきましょう。
ベタ書きは悪しきってじっちゃんも言っていたので()

ANNICT_TOKEN = アクセストークン

これでOK!!安全()

私は以下のようなコードを書きました。

import os
import requests
from dotenv import load_dotenv
 
# .envファイルから環境変数を読み込む
load_dotenv()
 
# Annict APIのアクセストークンを環境変数から取得
ACCESS_TOKEN = os.getenv("ANNICT_TOKEN")
 
def search_anime(title):
    """
    Annict APIを使用してアニメを検索し、結果を表示します。
    """
    if not ACCESS_TOKEN:
        raise Exception("アクセストークンが設定されていません。.envファイルを確認してください。")
 
    # アニメを検索
    search_url = "https://api.annict.com/v1/works"
    params = {
        "access_token": ACCESS_TOKEN,
        "filter_title": title,
        "sort_season": "asc",  # シーズンでソート
        "per_page": 10  # 最大10件の結果を取得
    }
    try:
        search_response = requests.get(search_url, params=params)
        search_response.raise_for_status()  # HTTPエラーをチェック
        search_data = search_response.json()
    except requests.exceptions.RequestException as e:
        raise Exception(f"Annict APIへのリクエストに失敗しました: {e}")
    except ValueError as e:
        raise Exception(f"Annict APIからのレスポンスが無効です: {e}")
 
    if not search_data.get("works"):
        raise Exception(f"Annictに「{title}」の情報が見つかりませんでした。")
 
    # 検索結果を表示
    print("検索結果:")
    for i, work in enumerate(search_data["works"], start=1):
        print(f"{i}. {work['title']} (ID: {work['id']})")
 
    # ユーザーに選択させる
    selected_index = int(input("表示したいアニメの番号を入力してください: ")) - 1
    if selected_index < 0 or selected_index >= len(search_data["works"]):
        raise Exception("無効な番号が入力されました。")
 
    return search_data["works"][selected_index]
 
def get_anime_episodes(anime_id):
    """
    Annict APIを使用してアニメのエピソード情報を取得し、整形して表示します。
    """
    # エピソード情報を取得
    episodes_url = f"https://api.annict.com/v1/episodes"
    params = {
        "access_token": ACCESS_TOKEN,
        "filter_work_id": anime_id,
        "sort_sort_number": "asc",  # エピソード番号順に並べ替え
        "per_page": 50  # 最大50エピソードまで取得
    }
    try:
        episodes_response = requests.get(episodes_url, params=params)
        episodes_response.raise_for_status()  # HTTPエラーをチェック
        episodes_data = episodes_response.json()
    except requests.exceptions.RequestException as e:
        raise Exception(f"Annict APIへのリクエストに失敗しました: {e}")
    except ValueError as e:
        raise Exception(f"Annict APIからのレスポンスが無効です: {e}")
 
    if not episodes_data.get("episodes"):
        print("エピソード情報はありません。このアニメはまだ放送が始まっていない可能性があります。")
        return
 
    # エピソード情報を整形して表示
    for episode in episodes_data["episodes"]:
        episode_number = int(episode["number"])  # エピソード番号を整数に変換
        episode_title = episode["title"] or "タイトルなし"
        print(f"エピソード {episode_number}: {episode_title}")
 
# メイン処理
try:
    # ユーザーにアニメタイトルを入力させる
    title = input("アニメタイトルを入力してください: ")
 
    # アニメを検索して選択させる
    selected_anime = search_anime(title)
    print(f"\n選択されたアニメ: {selected_anime['title']}\n")
 
    # エピソード情報を取得して表示
    get_anime_episodes(selected_anime["id"])
except Exception as e:
    print(e)

解説?

最初はper_pageを1にしていたんですけど、続編発表だけのアニメがあった場合、そっちが優先されていたので、10にして、ユーザーが選択できるようにしました。

エピソード一覧を取得するときのper_pageの最大が50っぽいので、ダイの大冒険とかプリキュアは全部取得できないんじゃない…??

だめだったw

使ってみると

はい、できてますね!!

ディレクトリ名がauto-aniなのは動画ファイルのリネームソフトを作ろうとしてるからですね。

おわり

AnnictAPIを使ってアニメ情報を取得できましたね。
最初はAniListを使おうとしていましたが、エピソード一覧がなかったので、Annictにしました。

義妹生活を見よう見ようで見れてないのでいい加減見たいです。でもきんモザ見始めてるのであと2年はかかるかな…w