Twitter REST APIで、キーワードを含むツイートを検索するPHPサンプルを作ってみた

PHP

この記事は、Twitter REST APIを使って、特定のキーワードを含むツイートを検索して吐き出すPHPのサンプルを作ってみました。作ったといっても、主要部分は以下のサイトに掲載されていたものに出力部分を足させていただいた形です。

[blogcard url=”https://syncer.jp/Web/API/Twitter/REST_API/GET/search/tweets/”]

Twitter REST APIには、アクセストークン方式とべアラートークン方式があります。何が違うのかという詳細は同じサイトの以下のページに載っています。簡単に言うと、アクセストークン方式はツイッターの全ての操作が可能、べアラートークン方式は公開されたツイートを閲覧するのみというものです。今回は前者のアクセストークン方式で作りました。

[blogcard url=”https://syncer.jp/Web/API/Twitter/REST_API/”]

この手のAPIは、大きく二つの部分から構成されます。サーバーへのリクエストを作る部分と、返ってきたリクエストを整形したり出力したりする部分です。それぞれについて説明します。

Twitter REST APIのリクエスト部分

リクエスト部分は、こちらのサイトのサンプルをそのまま利用するのがよいと思います。

サンプルは二つあるのですが二つ目の「アクセストークン」のほうです。
冒頭の設定部分に4種のトークン類を書き入れてください。この4点は必須です。取得方法はこちらのページをご覧ください。

[code lang=”php” title=”PHP” toolbar=”true” highlight=”” htmlscript=”true” autolinks=”true”] // 設定
$api_key = ” ; // APIキー
$api_secret = ” ; // APIシークレット
$access_token = ” ; // アクセストークン
$access_token_secret = ” ; // アクセストークンシークレット
[/code]

このページのサンプルで、最終的に必要なのは、冒頭から次の行までです。

[code lang=”php” title=”PHP” toolbar=”true” highlight=”” htmlscript=”true” autolinks=”true”] // 取得したデータ
$json = substr( $res1, $res2[‘header_size’] ) ; // 取得したデータ(JSONなど)
[/code]

この行より下は、リクエストとは関係ないので、変更しても問題ないようです。
では、私がどのようなコードを付け足したのかを参考に書いておきます。

Twitter REST APIの整形/出力部分

ではここからは私がつぎ足した部分です。

受け取ったJSONデータをPHPの配列として扱えるようデコードし、その後foreach文を使ってループさせて欲しい情報を取り出します。
その際、必要に応じてHTMLで整形します。

今回、私が取得した情報は以下のとおりです。( )の中が正式なTwitterのシステム名称です。
[list class=”li-check li-mainbdr main-c-before”]

  • 送信日時(created_at)
  • ツイートの本文(text)
  • ユーザー名 @〜〜(screen_name)
  • 名前(name)
  • プロフィール画像のURL(profile_image_url_https)
  • 発信者のツイッターホームのURL(上記情報から自動生成)
[/list]

私が作成したコードは以下のとおりです。

[code lang=”php” title=”PHP” toolbar=”true” highlight=”” htmlscript=”true” autolinks=”true”] // ここから整形・出力のコードです!

// 受け取ったJSONデータをPHPの配列として扱えるようデコード
$json_decode_data = json_decode($json, true);

// 以降のWEBブラウザ出力にそなえて最低限のHTMLを記載しておく
echo ‘<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/></head><body>’;

//JSONデータの内容をループさせて取得する
foreach ( $json_decode_data[‘statuses’] as $val ) {

$timestamp = strtotime($val[‘created_at’]);//送信日時の生データをPHPの日付データに変える
$timestamp =date( ‘Y年m月d日 H時i分s秒’, $timestamp );//日時の表示書式を設定

$text=$val[‘text’];//ツイートの本文
$name=$val["user"][‘name’];//名前
$screen_name=$val["user"][‘screen_name’];//ユーザー名
$profile_image=$val["user"][‘profile_image_url_https’];//プロフィール画像のURL
$twitter_url = ‘https://twitter.com/’;//Twitterのドメイン
$link = twitter_url . $screen_name;//アカウントのホームページのURLを生成

//出力
echo <<<EOF

<hr>

<img src="{$profile_image}">

<b>{$name}</b>&nbsp;<a href="{$link}">@{$screen_name}</a>
{$timestamp}
{$text}

EOF;
}

echo "
<hr>

";//最後に付加するライン

//デコードしたJSONの検証
echo ‘

▼▼▼▼デコードしたJSON内容 ここから▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
<pre>’;
var_dump($json_decode_data);
echo ‘</pre>

▲▲▲▲デコードしたJSON内容 ここまで▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

‘;

//HTMLを閉じる
echo "
<hr>

</body></html>";

?>
[/code]

上記には、JSONデータのループでの取り出しと整形に加え、デコードしたJSON検証用のコードも入れてます。
またHTMLのスクリプトも入れておかないと、文字化けします。

foreach文のループについて解説します。
$json_decode_data の次に [‘statuses’] とあります。これはJSONデータの1番目の階層です。

目的の欲しいデータ(例:ツイート本文)が次の階層にあれば、

$text=$val[‘text’];

と書けば、取り出せます。

もしもさらに下の階層に目的のデータがあったなら、2個続けて書くだけです。

$screen_name=$val[“user”][‘screen_name’]

とにかく、目的のデータがある階層まで、階層名を指定してあげれば大丈夫です。
私はこの構造がわからなくて苦労しました。

サクッと階層がわかるツールがあればいいのにと思います。いずれ見つけるか作るかしたいです。

さて、このPHPファイルを実行すると以下のように出力されます。
ここではキーワードを「AKB48」として10個のツイートを取得しています。ツイートの次に、JSONを表示しています。

以上です。いかがだったでしょうか。
今後は、この手法を何かに応用してみたいと思ってます。
お読みいただきありがとうございました。

謝辞

この元となるリクエスト部分を開発された、SYNCER様に心から感謝を致します。ありがとうございました。