[PHP]TwitterのトレンドをAPIから取得する＆HTML出力

PHPからツイッターのトレンドを取得してみましたのでご紹介します
何番煎じだよ…って思うかもしれませんが、「PHP Twitter トレンド取得」で調べると古い記事しか出てこなかったのでメモがてら書きます。

##Twitteroauthを導入
今回はド定番のabraham/twitteroauthを利用します。TwistOauthは随分前に非推奨になったので使うな…
あらかじめComposerを導入しておいて、

```terminal
composer require abraham/twitteroauth
```

でインストールしてください。vendorディレクトリが作成されています。

##実際にコードを書く
それでは順にコードの紹介をしていきます。
###Composer読み込み～認証情報定義。

```php
// Composerのautoload.phpを読み込み
require __DIR__ . '/vendor/autoload.php';
// TwitterOAuthクラスをインポート
use Abraham\TwitterOAuth\TwitterOAuth;

// Twitter APIの認証情報
$CK = '***********************'; // APIキーをセット
$CS = '**********************************************'; // APIシークレットをセット
$AT = '**********************************************'; // Access Tokenをセット
$AS = '*****************************'; // Access Token Secretをセット
```
だだComposerから呼び出すだけなので特に説明はないです。
今、TwitterってConsumerKey,ConsumerSecretって言い方してないでしょ！って思った方もいると思いますが、私はAPIの認証情報を格納する変数をやたら長くしたくないけどAPISecretの略称系だとAccessTokenSecretと被るから…ただそれだけです。

###API接続&トレンド取得

```php
$connection = new TwitterOAuth( $CK, $CS, $AT, $AS );
$data = $connection->get('trends/place', ['id' => '2345896']);
```

トレンド取得に際して取得したい地域を設定する必要があります。
日本の場合は**2345896**ですが他の地域を指定する場合、別のidが必要ですのでその際は各自調べてください。

**【注意】よく記事でjsonを直接リクエストして取得しているのが見受けられますが処理エラーの際の分岐が増えるだけなのでやめたほうがいいと思います。**
--ちゃんとエラー処理したい場合は上位互換版のTwistOauthを使ってもいいかもしれません。私は使いませんが。--

###HTMLに出力
接続状況により処理を分岐することができます。
今回は接続に成功した場合foreachで受け取った連想配列を処理し、失敗した場合お詫びの文を出力しました。（API呼び出し制限といった事象で失敗する可能性があるため。）

また、HTML出力部分は関数として定義したほうがスッキリしていいと思います。


```php
if( $connection->getLastHttpCode() == 200 ){

        foreach ($data[0]->trends as $key => $trend) {
        // 接続に成功した場合に行う処理
              echo '<' . ++$key . '>' . PHP_EOL;
               echo '<h3 style="color:#1d2088"><a href="' . $trend->url . '"target="_blank" rel="noopener noreferrer">' . $trend->name . '</a></h3>' . PHP_EOL;
               echo $trend->tweet_volume . '件のツイート' . PHP_EOL;
               echo '<hr noshade>' . PHP_EOL;

}else{
        // 接続に失敗したときに行う処理
        echo "トレンドデータの取得に失敗しました。時間を開けて再度お試しください。";
}
```

注1)トレンドの「順位」表示するため、キーの値を利用しました。
（キーの名前が0からスタートだったので算術演算子の略称型の++を使うと1から始められるよ）

注2)ツイート数を表示されていない場合がありますがツイッターの仕様なので仕方がありません。そのときはNULLが格納されているので分岐処理でもしておいたがいいかもしれません。

注3)今回のコードではXSS対策を行っておりません。本番環境で運用するならエスケープ処理をすることをおすすめします。
--まあトレンドにJS文が挙がることはないと思いますが年のためですよ、、、--

注4)トレンドのURLを開くに際し、rel="noopener noreferrer"を指定していますがこれに関しては以下の記事をご覧ください。
[実はヤバい？危険な「別タブで開く（target=”_blank”）」](https://wwg.co.jp/blog/3807)


※因みに取得した配列の中身です（var_dumpで見られます）

```terminal
array(1) {
  [0]=>
  object(stdClass)#57 (4) {
    ["trends"]=>
    array(50) {
      [0]=>
      object(stdClass)#2 (5) {
        ["name"]=>
        string(22) "#M1グランプリ2020"
        ["url"]=>
        string(82) "http://twitter.com/search?q=%23M1%E3%82%B0%E3%83%A9%E3%83%B3%E3%83%97%E3%83%AA2020"
        ["promoted_content"]=>
        NULL
        ["query"]=>
        string(54) "%23M1%E3%82%B0%E3%83%A9%E3%83%B3%E3%83%97%E3%83%AA2020"
        ["tweet_volume"]=>
        int(143761)
      }
      [1]=>
          〜〜以降50件の連想配列を取得できます。
```


具体的なHTMLの処理は一番下にあるサンプルコードを参照してください。

###取得結果
![20201221_194203.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/aff05cec-0968-bd11-ef68-8abf06da014e.jpeg)

![20201221_194146.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513165/d21821f3-51d4-9a28-b61f-b892c8280e86.jpeg)


以下サンプルコード。Githubにもあるので見てってください。
[Github](https://github.com/tomomi0115)

```php:trend.php
<?php
// Composerのautoload.phpを読み込み
require __DIR__ . '/vendor/autoload.php';
// TwitterOAuthクラスをインポート
use Abraham\TwitterOAuth\TwitterOAuth;

// Twitter APIの認証情報
$CK = '***********************'; // APIキーをセット
$CS = '**********************************************'; // APIシークレットをセット
$AT = '**********************************************'; // Access Tokenをセット
$AS = '*****************************'; // Access Token Secretをセット

// TwitterOAuthクラスのインスタンスを作成
$connection = new TwitterOAuth( $CK, $CS, $AT, $AS );
$data = $connection->get('trends/place', ['id' => '2345896']);

if( $connection->getLastHttpCode() == 200 ){

        foreach ($data[0]->trends as $key => $trend) {
               echo '<' . ++$key . '>' . PHP_EOL;
               echo '<h3 style="color:#1d2088"><a href="' . $trend->url . '"target="_blank" rel="noopener noreferrer">' . $trend->name . '</a></h3>' . PHP_EOL;
               echo $trend->tweet_volume . '件のツイート' . PHP_EOL;
               echo '<hr noshade>' . PHP_EOL;
        };
}else{

        echo "トレンドデータの取得に失敗しました。時間を開けて再度お試しください。";

};
?>
<html>
<head>
<meta charset="utf8">
// 文字化け防止のため、UTF-8に設定しておきます。