はじめに
こんにちは、エンジニアの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を叩く時は気をつけました。
この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。
最後まで読んでいただきありがとうございました!