【PHP×Twitter API】タイムラインの取得と表示の基本

ツイッターのタイムラインの取得と表示の基本Tips

以前GASとTwitter APIを使ったフォロワー数の自動記録ツールを作成しました。現在も現役でせっせと記録を続けてくれています。

今回はGASではなく、PHPを使ったTwitter APIの使い方を記事にしたいと思います。PHPにした理由は、最終的にはワードプレスでごにょごにょするためです。

分量が多いのと色んな内容がごちゃごちゃしてしまうのを避けるために記事を何個かに分けて書きます。

今回の内容は、タイムラインを取得する!基本中の基本を押さえます。ユーザータイムラインを中心に取得方法が似ている2つのタイムラインを併せて紹介します。 いいね(お気に入り)のリストはタイムラインではないのですが、同じように取得できるのでまとめて紹介します。

この記事で分かること
  • PHPを利用したホームタイムライン/ユーザータイムライン/メンションタイムラインの取得方法
  • PHPを利用したいいねのリストの取得方法
  • TwitterOAuthの使用方法
  • var_dumpを利用したツイートのデータ構造の確認方法
  • 取得ツイート数の絞り方
  • 基本的な要素を表示するサンプルコード
  • 個別ツイートへのリンクの作成方法
  • ツイート埋め込みコードの取得方法
  • APIを利用したタイムラインの取得回数の制限

ちなみに

  • ホームタイムライン
    フォローしてるユーザーのツイートが流れるタイムライン
  • ユーザータイムライン
    特定のユーザーのツイートが流れるタイムライン
    プロフィールタイムラインとも呼ばれる?
  • メンションタイムライン
    特定ユーザーに向けた@付きのツイートが流れるタイムライン

です。(私も呼び名は知りませんでした)

必要なもの

  1. ツイッター開発者アカウント
    ツイッターアカウントとは別にAPIを利用するために必要になります。本記事ではアカウントの登録とAPPの作成は割愛しています。

タイムラインの取得方法

ステップ1. Twitter Developersにてアクセストークンを取得

今回はアクセストークンを使ってます。Keys and tokensタブに記載されているAPI key、API secret key、Access token、 Access token secretが必要です。

APIキーとアクセストークン
APIキーとアクセストークン(クリックで拡大)
  • アクセストークンを作成していない場合は、Createボタンを押して作成してください
  • 「January 20, 2020からはアクセストークンは生成時にしか表示しなくなるからメモしとけよ」というお知らせが出てます

ステップ2. TwitterOAuthを設置

OAuth(オー オース)は、権限の認可を行うためのオープンスタンダードです。今回、タイムラインの取得のためにOAuth認証用ライブラリの1つであるTwitterOAuthを使用しました。

公式サイトにはインストールはComposerとManualの2種類の方法があり、Composerが簡単と書いてます。Composerってナンジャラホイだったのでマニュアルでやりました。充分簡単でした。

  1. Githubに上がっているコードから最新版のソースコードをダウンロードします
    勇気を持って以下をクリック!(ここが一番の難関です)
abraham/twitteroauth
The most popular PHP library for use with the Twitter OAuth REST API. - abraham/twitteroauth
  1. ダウンロードしたファイルをサーバー上の適当な場所にアップロードします

私は本番用はcocoon-child-master配下のtmp-userフォルダに入れました(作成するPHPファイルを置くフォルダにアップロードすればOKです)

今回はPHPとTwitter APIとのやり取りだけだったので、動作確認はpublic_htmlの下に適当なフォルダを作って行いました。
以下の点でメリットがあります。

  • ブラウザで直接PHPファイルにアクセスすれば実行結果が得られる
  • PHPの構文でエラーが起きても本番サイトには影響しない

なお、ファイル保存時の文字コードに気を付けないと日本語が文字化けします (しました) 。

  1. 作成するPHPファイルでライブラリを読み込む

作成するPHPファイルで以下の2行を書けばあっけなく終わります。

require "twitteroauth/autoload.php"; //アップロードしたtwitteroauthフォルダへのパスを入れる

use Abraham\TwitterOAuth\TwitterOAuth;

ステップ3. PHPファイルを作成

ツイートデータ構成確認用と基本的な要素の表示用の2種類のコードを用意しています。ユーザータイムラインの取得を例にしています。

コード1. ツイートデータ構成確認用コード

まずはツイートデータ構成確認用コードです。このコードによりタイムラインで取得したすべての情報がどのように入っているのかを確認できます。

<?php
  require "twitteroauth/autoload.php";

  use Abraham\TwitterOAuth\TwitterOAuth;

  //ステップ1でTwitter developersから取得した値を代入
  $consumerKey = "xxxxxxxxxx";
  $consumerSecret = "xxxxxxxxxx";
  $accessToken = "xxxxxxxxxx";
  $accessTokenSecret = "xxxxxxxxxx";

  $connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
  //ホームタイムラインを10ツイート取得
  //$timeline = $connection->get("statuses/home_timeline", ["count" => 10, "tweet_mode" => "extended"]);
  //ユーザータイムラインを10ツイート取得
  $timeline = $connection->get("statuses/user_timeline", ["count" => 10, "tweet_mode" => "extended"]);
  //メンションタイムラインを10ツイート取得
  //$timeline = $connection->get("statuses/mentions_timeline", ["count" => 10, "tweet_mode" => "extended"]);
  //いいねのリストから10ツイート取得
  //$timeline = $connection->get("favorites/list", ["count" => 10, "tweet_mode" => "extended"]);
  if(isset($timeline->errors)) {
    //取得失敗
    echo "Error occurred. ";
    echo "Error message: " . $timeline->errors[0]->message;
  } else {
    //取得成功
    echo('<pre>');
    var_dump($timeline);
    echo('</pre>');
  }
?>

コード1では$timelineに入力したツイートのデータをvar_dumpを利用して出力しています。 var_dump単体で使用した場合は、非常に読みにくいものが吐き出されるので、上記にあるように<pre>を利用するのがオススメです。

ホームタイムラインを取得したい場合は、14行目のコメントアウトを取って16行目をコメントアウトにしてください(メンションタイムラインも同様)

実行結果です。

コード1実行結果
コード1実行結果(クリックで拡大)

画像はブラウザ画面のキャプションなので全部入ってませんが、私の最新のツイートの内容が表示されています。ツイートとして外に見えているもの以外にも多くの情報がここに詰まっています。

タイムラインの取得時に付与するパラメータについて

タイムライン取得時にパラメータを付与することにより、取得するデータを変更することができます。詳しい使い方の説明が必要なものは別記事としますので、ここでは3つのパラメータのみ紹介します。

  • count
    このパラメータをつけることで取得するツイート数を制限できます。何も指定しなければデフォルトの200件となります。
    データが多くなるので、本記事のコードでは10件のみ読み込むようにしています。
  • tweet_mode
    このパラメータにextendedを指定することでlong_text フィールドが取得できるようになります。
    以前は文字数制限が厳しく、画像(JPEG、GIF)やURLを貼った場合には書ける文字数が140文字より減っていました。現在の画像やURLを除いて140文字というルールに基づくツイート内容がlong_textに入ります。
    このパラメータを付与しない場合は、textフィールドにツイート内容が表示され、 画像やURLを含んだ文字数の多いツイートは最後の方が「…」と省略されます。必須のパラメータなので本記事のコードにも付与しています。
  • screen_name
    ユーザータイムライン/いいねのリストに付与するパラメータです。本記事のコードでは付与していないのでAPIキーの持ち主のツイート(私のツイート)やいいねリストが結果として得られています。パラメータを付与することで自分以外のユーザータイムラインやいいねのリストを取得できます。
    なお、screen_nameはユーザー名のことで「@xxxxx」の@以降の「xxxxx」の部分です。

コード2. 基本的な要素の表示用コード

色々な情報が詰まっている中から基本的な要素をいくつか抜き出して表示するコードを紹介します。

<?php
  require "twitteroauth/autoload.php";

  use Abraham\TwitterOAuth\TwitterOAuth;

  //ステップ1でTwitter developersから取得した値を代入
  $consumerKey = "xxxxxxxxxx";
  $consumerSecret = "xxxxxxxxxx";
  $accessToken = "xxxxxxxxxx";
  $accessTokenSecret = "xxxxxxxxxx";

  $connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
  //ホームタイムラインを10ツイート取得 
  //$timeline = $connection->get("statuses/home_timeline", ["count" => 10, "tweet_mode" => "extended"]);
  //ユーザータイムラインを10ツイート取得
  $timeline = $connection->get("statuses/user_timeline", ["count" => 10, "tweet_mode" => "extended"]);
  //メンションタイムラインを10ツイート取得
  //$timeline = $connection->get("statuses/mentions_timeline", ["count" => 10, "tweet_mode" => "extended"]);
  //いいねのリストから10ツイート取得
  //$timeline = $connection->get("favorites/list", ["count" => 10, "tweet_mode" => "extended"]);
  if(isset($timeline->errors)) {
    //取得失敗
    echo "Error occurred. ";
    echo "Error message: " . $timeline->errors[0]->message;
  } else {
    //取得成功
    for ($i=0; $i < count($timeline); $i++) {
      echo "<p>";
      echo "ステータスID: " . $timeline[$i]->id . "<br>";
      echo "名前: " . $timeline[$i]->user->name . "<br>";
      echo "ユーザー名(screen_name): " . $timeline[$i]->user->screen_name . "<br>";
      echo "ツイート本文: " . $timeline[$i]->full_text . "<br>";
      echo "作成日: " . date("Y-m-d H:i:s", strtotime($timeline[$i]->created_at)) . "<br>";
      echo "ツイート: " . $timeline[$i]->source . "<br>";
      echo "リツイート数: " . $timeline[$i]->retweet_count . "<br>";
      echo "いいね数: " . $timeline[$i]->favorite_count;
      echo "</p>";
    }
  }
?>
  • ステータスIDは世の中のツイートすべてに付けられる固有のIDです
  • リプライはリプライされたツイート側には情報がつきません。リプライしたツイート側に、リプライをしたツイートのステータスIDが入ってきます。
    あるツイートについたリプライの件数を数えるのはかなりやっかいです。

実行結果です。基本的な要素が抽出されてます。

コード2実行結果
コード2実行結果(クリックで拡大)

ひと手間かけて得られるもの

残念ながら個別ツイートへのリンク、ツイートの埋め込みコードは取得した要素に含まれていません。そこはひと手間かけて取得する必要があります。料理もひと手間かけるとおいしくなるでしょ?不味くなることもあるけどね。

個別ツイートのリンク

個別ツイートのリンクは「https://twitter.com/」+「ユーザー名」+「ステータスID」という造りになっています。以下のコードで生成できます。

$url = "https://twitter.com/" . $timeline[$i]->user->screen_name . "/status/" . $timeline[$i]->id;

ツイート埋め込みコード

ここまで各要素を1つずつ抜き出すのを見てきましたが、結構大変ですよね。手作業でちょっちょとやったら手に入るツイートの埋め込み用コードの取得ができれば、それを使うだけである程度のものができちゃいます。APIを利用してコードを取れます。

ツイート埋め込みコードは、埋め込みコード生成用にもう一度リクエストが必要になります。
以下のコードのように「リクエスト用URL生成→リクエスト」を行うとJSON形式で戻ってきます。「html」フィールドに埋め込みコードが入っています。

$url2 = "https://publish.twitter.com/oembed?url=https://twitter.com/" . $timeline[$i]->user->screen_name . "/status/" . $timeline[$i]->id;
$embed = file_get_contents($url2);

全部入り

個別ツイートのリンクとツイート埋め込みコード生成もすべて入れたコードはこのようになります。

<?php
  require "twitteroauth/autoload.php";

  use Abraham\TwitterOAuth\TwitterOAuth;

  //ステップ1でTwitter developersから取得した値を代入
  $consumerKey = "xxxxxxxxxx";
  $consumerSecret = "xxxxxxxxxx";
  $accessToken = "xxxxxxxxxx";
  $accessTokenSecret = "xxxxxxxxxx";

  $connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
  //ホームタイムラインを10ツイート取得
  //$timeline = $connection->get("statuses/home_timeline", ["count" => 10, "tweet_mode" => "extended"]);
  //ユーザータイムラインを10ツイート取得
  $timeline = $connection->get("statuses/user_timeline", ["count" => 10, "tweet_mode" => "extended"]);
  //メンションタイムラインを10ツイート取得
  //$timeline = $connection->get("statuses/mentions_timeline", ["count" => 10, "tweet_mode" => "extended"]);
  //いいねのリストから10ツイート取得
  //$timeline = $connection->get("favorites/list", ["count" => 10, "tweet_mode" => "extended"]);
  if(isset($timeline->errors)) {
    //取得失敗
    echo "Error occurred. ";
    echo "Error message: " . $timeline->errors[0]->message;
  } else {
    //取得成功
    for ($i=0; $i < count($timeline); $i++) {
      echo "<p>";
      echo "ツイートID: " . $timeline[$i]->id . "<br>";
      echo "名前: " . $timeline[$i]->user->name . "<br>";
      echo "ユーザー名(screen_name): " . $timeline[$i]->user->screen_name . "<br>";
      echo "ツイート本文: " . $timeline[$i]->full_text . "<br>";
      echo "作成日: " . date("Y-m-d H:i:s", strtotime($timeline[$i]->created_at)) . "<br>";
      echo "ツイート: " . $timeline[$i]->source . "<br>";
      echo "リツイート数: " . $timeline[$i]->retweet_count . "<br>";
      echo "いいね数: " . $timeline[$i]->favorite_count . "<br><br>";
      
      $url = "https://twitter.com/" . $timeline[$i]->user->screen_name . "/status/" . $timeline[$i]->id;
      echo 'ツイートURL: <a href="' . $url . '">' . $url . '</a><br><br>';

      $url2 = "https://publish.twitter.com/oembed?url=https://twitter.com/" . $timeline[$i]->user->screen_name . "/status/" . $timeline[$i]->id;
      $embed = file_get_contents($url2);
      echo json_decode($embed)->html;

      echo "</p>";
    }
  }
?>

実行結果です。

全部入り実行結果
全部入り実行結果(クリックで拡大)

埋め込みコード取得は時間がかかるので、その場で取得してその場で表示という利用方法は厳しいです。取得したコードを一旦データベースに入れて、表示にはデータベースから読み込みとするのが良いかと思います。

APIを利用したタイムライン取得回数の制限について

最後になりましたが、APIを利用したデータの取得には制限があります。15分の間に何回リクエストするかが制限対象となります。リンクは公式サイトです。

制限を超えると最長15分のおあずけモードとなります。

あとがき

基本に絞ったのにこの分量…。自分が作っているもの関連のみですが、Twitter API関連で書きたいところはまだまだあるのでまた書きます。(書ききるのはいつなるのだろうか…)

コメント

タイトルとURLをコピーしました