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