0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

keitamaxAdvent Calendar 2024

Day 13

アニメ一覧APIでアニメ情報を取得をする②

Last updated at Posted at 2024-12-12

はじめに

こんにちは、エンジニアのkeitaMaxです。

前回APIを叩いて1シーズンのアニメ一覧を取得しました。

今回は2000年から2024年までのアニメ一覧を取得してみます。

やりたいこと

前回作成したコマンドを1シーズンごとのアニメを取得するようなものにします。

そして、もう一つコマンドを作成し、そこで全シーズンでループして前回作成したコマンドを叩くようにしようとおもいます。

コマンド作成

もう一つのコマンドを作成します。

php artisan make:command GetAnimations  

内容は以下のようにしました。

<?php

namespace App\Console\Commands;

use App\Models\Term;
use Exception;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Artisan;

class GetAnimations extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'app:get-animations';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        $years = range(2000, 2025);
        $seasons = ["spring", "summer", "autumn", "winter"];
        foreach ($years as $year) {
            foreach ($seasons as $season) {
                $termText = "$year-$season";
                echo "Executing Artisan command for term: $termText\n";
                try {
                    Artisan::call("app:get-this-term-animations", ["term" => $termText]);
                    echo "Command executed successfully for $termText\n";
                } catch (Exception $e) {
                    echo "Error executing command for $termText: " . $e->getMessage() . "\n";
                }
            }
        }
    }
}

$years = range(2000, 2024);
$seasons = ["spring", "summer", "autumn", "winter"];

これで2000年から2024年までのシーズンを組み合わせて作成しています。

Artisan::call("app:get-this-term-animations", ["term" => $termText]);

これで前回作成したコマンドに、シーズン情報を渡して叩いています。

前回作成したコマンドの修正

前回作成したコマンドを、シーズンを受け取るように修正しました。

<?php

namespace App\Console\Commands;

use App\Models\Animation;
use Illuminate\Console\Command;

class GetThisTermAnimations extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'app:get-this-term-animations { term }'; // 追加

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Execute the console command.
     */
    public function handle($page = 1)
    {
        $terms = $this->argument('term');
        $termId = $this->argument('termId');
        $url = "https://api.annict.com/v1/works?filter_season=$terms&page=$page"; // 修正
        $ch = curl_init();
        $apiKey = config('app.annict_api_key');
        $headers = [
            'Authorization: Bearer ' . $apiKey,
            'Accept: application/json',
        ];
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FAILONERROR, true);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        $response = curl_exec($ch);
        $error = curl_error($ch);
        if ($error) {
            $this->info("error $error");
            return;
        }
        curl_close($ch);

        $responseArray = json_decode($response);
        foreach ($responseArray->works as $animation) {
            Animation::firstOrCreate([
                "title" => $animation->title,
                "title_kana" => $animation->title_kana,
                "title_en" => $animation->title_en,
                "media" => $animation->media,
                "official_site_url" => $animation->official_site_url,
                "wikipedia_url" => $animation->wikipedia_url,
                "facebook_image_url" => $animation->images->facebook->og_image_url,
                "episodes_count" => $animation->episodes_count,
                "season_name" => $animation->season_name,
            ]);
        }

        $this->info(Animation::get()->count());

        if ($responseArray->next_page) {
            sleep(1);
            $this->handle($responseArray->next_page);
        }
    }
}

実行

以下コマンドで実行します。

php artisan make:command GetAnimations

結構時間がかかると思います。気長に待ちましょう。

全て完了すると、DBに2000年から2024年までのアニメ全てが登録されているはずです。

おわりに

今回は量が多いので、迷惑にならないようにAPIを叩く時は気をつけました。

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?