TwitterAPIでホームタイムラインのツイートを取得して表示する

業務でTwitterAPIを使う機会があったのでメモ程度に記載

twitter API ver1.1を使用

apiで取得したデータをjsonファイルでサーバ内に格納し、その内容を表示するようにしてます。
そんなに頻繁に見られるものでもなかったのでapi制限とか無いと思うんですけど、用心に越した事はないと思ってそうしてますw
取得するタイミングはアクセス毎に現在時間とファイルの更新時間を比べて、1時間以上経過していたらapiで取得するようにしてます。
取得タイミングは任意で変更できるようにしました。

# 下準備
## アプリケーションの登録
詳しくは以下のサイトを参考に
https://syncer.jp/Web/API/Twitter/REST_API/#application

## アクセストークンの取得
詳しくは以下のサイトを参考に
https://syncer.jp/Web/API/Twitter/REST_API/#access_token

## TwitterOAuth認証
これをダウンロードする
https://github.com/abraham/twitteroauth
それをダウンロード!!
一部、上手く動かないような情報もありましたが僕の環境では問題ありませんでした。
そんな時はこちらをご参考に
https://qiita.com/yokoh9/items/760e432ebd39040d5a0f#twitteroauth

# 取得するスクリプト

```get.php
<?php
    // jsonのパス
    define( "FILE_NAME", "XXXXXXXXXXXXX.json" );
    $filename = 'XXXXXXXXXXXXX.json';
    // jsonを生成するタイミング（1時間）
    $check_minute = 60 * 60;

    // ファイルの存在を確認
    if (file_exists(FILE_NAME)) {
      $file_time = filemtime(FILE_NAME);
      $cur_time = time();
      $dif_time = $cur_time - $file_time;

      if ($check_minute < $dif_time) {
        get_tweet();
      }
    } else {
      get_tweet();
    }

    function get_tweet() {
      //twitter認証
      $consumerKey = "XXXXXXXXXXXXX";
      $consumerSecret = "XXXXXXXXXXXXX";
      $accessToken = "XXXXXXXXXXXXX";
      $accessTokenSecret = "XXXXXXXXXXXXX";

      //TwitterOAuth認証
      require_once('twitteroauth/twitterOAuth.php');
      $twObj = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);

      //取得するときのオプションを設定
      $options = array(
        "count" => 100, //取得するツイート数
      );

      $tlRequest=$twObj->OAuthRequest(
        "https://api.twitter.com/1.1/statuses/home_timeline.json",
        "GET",
        $options
      );
      //オープン
      $fp = fopen(FILE_NAME,'w+');
      //jsonファイルを上書き
      fwrite($fp, $tlRequest);
      //クローズ
      fclose($fp);
    }
?>
```
取得する時は特に整形とかせずにそのまま保存しています。
本当は必要な情報だけパースするのが良いんだろうけど、パフォーマンスにそこまで影響なかったのでそのままです。

上記ではエンドポイントを```home_timeline```にしています。
他にもいろいろあるみたいです。
https://syncer.jp/Web/API/Twitter/REST_API/GET/statuses/home_timeline/

```
$tlRequest=$twObj->OAuthRequest(
　　　　"https://api.twitter.com/1.1/statuses/home_timeline.json",
  "GET",
  $options
);
```

# 表示するスクリプト

```view.php
<?php
      // ファイルからjsonを読み込み
      $json = file_get_contents("XXXXXXXXXXXXX.json");
      // 文字化けするかもしれないのでUTF-8に変換
      $json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
      // オブジェクト毎にパース
      // trueを付けると連想配列として分解して格納してくれます。
      $oObj = json_decode($json, true);
      // パースに失敗した時は処理終了
      if ($oObj === NULL) {
        echo 'エラー';
        return;
      }
      // 表示
      if (!empty($oObj)) {
        foreach($oObj as $key => $val){
          $name = $oObj[$key]['user']['name'];
          $screen_name = $oObj[$key]['user']['screen_name'];
          $text = $oObj[$key]['text'];
          // パターン
          $pattern = '/((?:https?|ftp):\/\/[-_.!~*\'()a-zA-Z0-9;\/?:@&=+$,%#]+)/u';
          // 置換後の文字列
          $replacement = '<a href="\1"  target="_blank">\1</a>';
          // 置換
          $text = preg_replace($pattern,$replacement,$text);
          echo'<div class="twitter_box">';
            if (empty($oObj[$key]['extended_entities']['media'][0]['media_url'])) { // Twitterでアップした画像がなければ
            } else { // Twitterでアップした画像があれば
              echo '<div style="width:100%; height:100%; margin:0 auto; background:url('.$oObj[$key]['extended_entities']['media'][0]['media_url'].') no-repeat center top; background-size: cover;"></div>';
              echo '<img src="'.$oObj[$key]['extended_entities']['media'][0]['media_url'].'" alt="'.$oObj[$key]['extended_entities']['media'][0]['media_url'].'" width="100%">';
            }
            echo'<dl>';
              echo'<dt><a href="https://twitter.com/'.$screen_name.'" target="_blank">'.$name.'</a></dt>';
              echo'<dd>'.$text.'</dd>';
            echo'</dl>';
          echo'</div>';
        }
      }
?>
```

サンプルとしてgithubにソースを公開しましたのでご自由にお使いください。
https://github.com/t-niiru/get-tweet