PHPで放映中のアニメ一覧を表示

(1/1)
今回は、PHPで「ShangriLa Anime API」を利用し、指定した西暦年、クールで放映されているアニメ一覧を表示するプログラムをつくる。また、「PHPでTwitterに投稿(ツイート)する」で作った Twitter APIをクラウド連携し、そのアニメのTwitterバナー画像を表示できるようにする。

(2024年6月21日)TwitterOAuth 7.0.0 対応

目次

サンプル・プログラム:実行例(バナー画像あり)

PHPで放映中のアニメ一覧を表示

サンプル・プログラム

圧縮ファイルの内容
onairAnime.phpサンプル・プログラム本体。
pahooTwitterAPI.phpTwitter APIを利用するクラス pahooTwitterAPI。
使い方は「PHPでTwitterに投稿(ツイート)する」などを参照。include_path が通ったディレクトリに配置すること。
onairAnime.php 更新履歴
バージョン 更新日 内容
1.0 2021/06/06
pahooTwitterAPI.php 更新履歴
バージョン 更新日 内容
5.5.0 2024/06/21 TwitterOAuth 7.0.0 対応
5.4.0 2024/05/18 twitter.com → x.com 変更対応
5.3.0 2023/08/15 tweet3() -- メディアのシャフル機能
5.2.1 2023/07/22 bug-fix
5.2.0 2023/07/17 oembed() v2対応
OAuth認証 および Twitter API へのアクセスには、TwitterOAuth を利用する。導入方法は公式サイトにあるように composer を使うことを推奨している。

準備:pahooTwitterAPI クラス

  11: //TwitterOAuth クラスをロードする.
  12: $version = explode('.', phpversion());
  13: if ($version[0>8) {
  14:     require __DIR__ . '/vendor/autoload.php';
  15: }
  16: use Abraham\TwitterOAuth\TwitterOAuth;
  17: 

前述の TwitterOAuth クラスをロードする。composer でインストールされたフォルダ "\vendor" を "pahooTwitterAPI.php" と同じフォルダへコピーすること。

  34: /**
  35:  * コンストラクタ
  36:  * @param   なし
  37:  * @return  なし
  38: */
  39: function __construct() {
  40:     $this->responses = array();
  41:     $this->webapi    = '';
  42:     $this->error     = FALSE;
  43:     $this->errmsg    = '';
  44:     $this->errcode   = 0;
  45: 
  46:     $this->connection = new TwitterOAuth($this->TWTR_CONSUMER_KEY, $this->TWTR_CONSUMER_SECRET, $this->TWTR_ACCESS_KEY, $this->TWTR_ACCESS_SECRET);
  47:     //v2使用を宣言
  48:     $this->connection->setApiVersion('2');
  49: }

TwitterOAuth クラスは pahooTwitterAPI のコンストラクタでインスタンス化しておく。

  27:     //OAuth用パラメータ
  28:     // https://apps.twitter.com/
  29:     var $TWTR_CONSUMER_KEY    = '***************';  //Cunsumer key
  30:     var $TWTR_CONSUMER_SECRET = '***************';  //Consumer secret
  31:     var $TWTR_ACCESS_KEY      = '***************';  //Access Token (oauth_token)
  32:     var $TWTR_ACCESS_SECRET   = '***************';  //Access Token Secret (oauth_token_secret)
  33: 

TwitterAPI を利用するために、クラスファイル "pahooTwitterAPI.php" を使用する。組み込み関数  require_once  を使って読めるディレクトリに配置する。ディレクトリは、設定ファイル php.ini に記述されているオプション設定 include_path に設定しておく。

事前にプログラムを登録しておく必要があり、その方法は「Twitter API - WebAPIの登録方法」を参照されたい。入手したパラメータを、上述の変数に代入しておくこと。

PHP の https対応

Twitter APIの呼び出しはhttps通信で行うため、PHPにOpenSSLモジュールが組み込まれている必要がある。
関数  phpinfo  を使って、下図のように表示されればOK。
OpenSSL - PHP
そうでない場合は、次の手順に従ってOpenSSLを有効化し、PHPを再起動させる必要がある。

Windowsでは、phop.iniの下記の行を有効化する。
extension=php_openssl.dll


Linuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順

これで準備は完了だ。

解説:初期値

  21: //プログラム・タイトル
  22: define('TITLE', '放映中のアニメ一覧');
  23: 
  24: //表示幅(ピクセル)
  25: define('WIDTH', 600);
  26: 
  27: //バナー画像を表示するかどうか(TRUE:表示する)
  28: define('BANNER', FALSE);
  29: 
  30: //Spinner - jQuery UI を使用するかどうか(TRUE:使用する)
  31: define('USESPINNER', TRUE);
  32: 
  33: //Twitter API クラス:include_pathが通ったディレクトリに配置
  34: if (BANNER) {
  35:     require_once('pahooTwitterAPI.php');
  36: }

変更不可の記載がない定数については自由に変更できる。

定数 BANNERTRUE にすることで、そのアニメのTwitterバナー画像を表示できるようにする。TRUE にすることで、Twitter APIを利用するクラス pahooTwitterAPI を利用するようになるので、後述する Twitter API クラス を参照のこと。
定数 USESPINNERTRUE にすることで、数値選択のための Spinner - jQuery UI が利用できるようになる。

ShangriLa Anime API

ShangriLa Anime API は、Apache 2.0 Licenseのもとアニメ作品の基本情報をREST API形式で返すAPIサーバーである。APIパスに、検索対象となる西暦年、クールを指定する。
ShangriLa Anime API
URL
https://api.moemoe.tokyo/anime/v1/master/:year/:cours

入力パラメータ
フィールド名 要否 内  容
year 必須 西暦年
cours 必須 クール(1~4)
応答データ(json) id ユニークID title 作品名 title_short1 略称1 title_short2 略称2 title_short3 略称3 public_url 公式URL twitter_account Twitterアカウント twitter_hash_tag Twitterハッシュタグ cours_id coursマスターID sex 男性向け=0, 女性向け=1 sequel 続編カウンタ created_at データ作成日時 updated_at データ更新日時

PHPプログラムでは、APIを呼び出す手続きをクラス pahooShangriLaAnimeAPI のメソッド searchAnime として実装した。

Twitter API:GET users/profile_banner

対象ユーザーのバナー画像のURLを取得するためのTwitter APIである。
15分間に180回という呼び出し制限があるが、今回のプログラムでは、この制約の影響を受けることはないだろう。
Twitter API (GET)
URL
https://api.twitter.com/1.1/users/profile_banner.json

入力パラメータ
フィールド名 要否 内  容
user_id user_id または screen_name のどちらか必須 ユーザーID
screen_name スクリーンネーム
応答データ(json) sizes ipad h 高さ(ピクセル):313 w 幅(ピクセル):626 url 画像URL ipad_retina h 高さ(ピクセル):626 w 幅(ピクセル):1252 url 画像URL web h 高さ(ピクセル):260 w 幅(ピクセル):520 url 画像URL web_retina h 高さ(ピクセル):520 w 幅(ピクセル):1040 url 画像URL mobile h 高さ(ピクセル):160 w 幅(ピクセル):320 url 画像URL mobile_retina h 高さ(ピクセル):320 w 幅(ピクセル):640 url 画像URL 300x100 h 高さ(ピクセル):100 w 幅(ピクセル):300 url 画像URL 600x200 h 高さ(ピクセル):200 w 幅(ピクセル):600 url 画像URL 1500x500 h 高さ(ピクセル):500 w 幅(ピクセル):1500 url 画像URL

PHPプログラムでは、pahooTwitterAPI クラスのメソッド profile_banner として実装し、1500×500ドットの画像URLを取得できるようにした。

放映中のアニメ一覧

 265: /**
 266:  * HTML BODYを作成する
 267:  * @param   int    $year   西暦年
 268:  * @param   int    $cours  クール(1~4)
 269:  * @param   array  $items  応答情報
 270:  * @param   string $webapi WebAPIのURL
 271:  * @param   string $errmsg エラーメッセージ
 272:  * @return  string HTML
 273: */
 274: function makeCommonBody($year, $cours, $items, $webapi, $errmsg) {
 275:     if (BANNER) {
 276:         //オブジェクト生成
 277:         $ptw = new pahooTwitterAPI();
 278:     }
 279: 
 280:     $myself = MYSELF;
 281:     $refere = REFERENCE;
 282:     $width  = WIDTH;
 283:     $title  = TITLE;
 284:     $version = '<span style="font-size:small;">' . date('Y/m/d版', filemtime(__FILE__)) . '</span>';
 285:     $width_image = (int)WIDTH / 3;
 286:     $debug = $table = '';
 287: 
 288:     //デバッグ情報
 289:     if (! FLAG_RELEASE) {
 290:         $phpver = phpversion();
 291:         $debug =<<< EOT
 292: <p>
 293: <span style="font-weight:bold;">★デバックモードで動作中...</span><br />
 294: PHPver : {$phpver}<br />
 295: WebAPI : <a href="{$webapi}">{$webapi}</a>
 296: 
 297: EOT;
 298:     }
 299: 
 300:     //エラーメッセージ
 301:     if ($errmsg !'') {
 302:         $errmsg =<<< EOT
 303: <p style="color:red">
 304: エラー:{$errmsg}.
 305: </p>
 306: 
 307: EOT;
 308:     } else if (count($items> 0){
 309:         if (BANNER) {
 310:             $label = "<th>バナー画像</th>\n";
 311:         } else {
 312:             $label = '';
 313:         }
 314:         $table =<<< EOT
 315: <table class="plists">
 316: <tr>
 317: <th>作品名</th>
 318: <th>Twitterアカウント<br />ハッシュタグ</th>
 319: {$label}
 320: </tr>
 321: 
 322: EOT;
 323:         $cnt = -1;
 324:         foreach ($items as $key=>$val) {
 325:             //タイトル+公式サイト
 326:             if (isset($val->public_url&& ($val->public_url !'')) {
 327:                 $anime = "<a href=\"{$val->public_url}\">{$val->title}</a>";
 328:             } else {
 329:                 $anime = $val->title;
 330:             }
 331:             //Twitterアカウント+バナー画像
 332:             if (isset($val->twitter_account&& ($val->twitter_account !'')) {
 333:                 $twitter = "<a href=\"https://www.twitter.com/{$val->twitter_account}/\">@{$val->twitter_account}</a>";
 334:                 if (BANNER) {
 335:                     $image = $ptw->profile_banner($val->twitter_account);
 336:                     if ($image !FALSE) {
 337:                         $image = "<td><img style=\"width:{$width_image}px;\" src=\"{$image}\" /></td>";
 338:                     } else {
 339:                         $image  = '<td>&nbsp;</td>';
 340:                         //エラー・リセット
 341:                         $ptw->error = FALSE;
 342:                         $ptw->errmsg = '';
 343:                         $ptw->errcode = 0;
 344:                     }
 345:                 } else {
 346:                     $image  = '';
 347:                 }
 348:             } else {
 349:                 $twitter = '';
 350:                 if (BANNER) {
 351:                     $image  = '<td>&nbsp;</td>';
 352:                 } else {
 353:                     $image  = '';
 354:                 }
 355:             }
 356:             //Twitterハッシュタグ
 357:             if (isset($val->twitter_hash_tag&& ($val->twitter_hash_tag !'')) {
 358:                 $hashtag = "<br /><a href=\"https://twitter.com/search?q=%23{$val->twitter_hash_tag}\">#{$val->twitter_hash_tag}</a>";
 359:             } else {
 360:                 $hashtag = '';
 361:             }
 362: 
 363:             $table .=<<< EOT
 364: <tr>
 365: <td>{$anime}</td>
 366: <td>{$twitter}{$hashtag}</td>
 367: {$image}
 368: </tr>
 369: 
 370: EOT;
 371:         }
 372:         $table ."</table>\n";
 373:     } else {
 374:         $table = '';
 375:     }
 376: 
 377:     $html =<<< EOT
 378: <body>
 379: <h2>{$title} {$version}</h2>
 380: <form name="myform" method="get" action="{$myself}">
 381: 西暦年 <input name="year" id="year" type="text" size="3" value="{$year}" /> 
 382: クール <input name="cours" id="cours" type="text" size="2" value="{$cours}" /> 
 383: <input name="exec" id="exec" type="submit" value="検索" />
 384: <input name="reset" id="reset" type="submit" value="リセット" />
 385: </form>
 386: {$errmsg}
 387: {$table}
 388: 
 389: <div style="border-style:solid; border-width:1px; margin:20px 0px 0px 0px; padding:5px; width:{$width}px; font-size:small; overflow-wrap:break-word; word-break:break-all;">
 390: <h3>使い方</h3>
 391: <ol>
 392: <li>[<span style="font-weight:bold;">西暦年</span>]を選択してください.</li>
 393: <li>[<span style="font-weight:bold;">クール</span>](1~4)を選択してください.</li>
 394: <li>[<span style="font-weight:bold;">検索</span>]ボタンを押してください.</li>
 395: <li>[<span style="font-weight:bold;">リセット</span>]ボタンを押すと,初期化します.</li>
 396: </ol>
 397: ※参考サイト:<a href="{$refere}">{$refere}</a>
 398: {$debug}
 399: </div>
 400: </body>
 401: 
 402: EOT;
 403:     if (BANNER) {
 404:         //オブジェクト解放
 405:         $ptw = NULL;
 406:     }
 407: 
 408:     return $html;
 409: }

ShangriLa Anime API の応答結果を一覧表示するユーザー関数が makeCommonBody である。

応答結果をHTMLのTABLEタグに変換する。
応答結果のTwitterアカウントが消滅している場合もあるので、このときはエラー・リセットのために pahooTwitterAPI クラスを再オブジェクト化している。

参考サイト

(この項おわり)
header