4. Twitter API 〜APIを触ってみる〜
① 作業環境の確認
これからPHPファイルを編集しながら、TwitterAPIの検索画面を作成していきます。 ターミナルでの作業が慣れている人は、こちらを参考にしてSSHで接続をして下さい。
それ以外の方はXREAのコントロールパネル内にあるファイルマネージャーを使用していきます。
ファイルマネージャーを使用する場合
- XREAのコントロールパネルから「サイト設定 > FTP設定 > net2ftp ファイルマネージャー」をクリックする
- public_htmlディレクトリに移動しから、「ファイル作成」をクリックします。
- こちらの画面でファイルを追加・編集を行っていきます。
新規ファイル名; twitter.php
文字コード: UTF-8
② HTML入力フォームを作成する
HTMLタグの入力
- twitter.phpに以下のHTMLタグを記載します。 (コードを全体コピーして、そのまま貼り付けてもいい)
<html>
<head>
<title>Tweets Search</title>
</head>
<body>
<h1>Tweets Search</h1>
<form action="./twitter.php" method="GET">
keyword : <input type="text" name="q" value=""/><br/>
<input type="submit" value="submit"/>
</form>
</body>
</html>
公開用URLで確認
- HTMLのタグがどのように表示されるかをブラウザで確認してみます。
http://www.アカウント名.shop/twitter.php
解説
・FormタグのmethodがGETとなっていますので、キーワードはGETパラメータとしてサーバーに送られます。
・submitボタン を押した後に /twitter.php?q=[キーワード]
とURLの後にパラメータが付いています。
問題
・キーワードの内容が submitボタン をクリックすると消えてしまいます。
③ 入力した内容をPHPで取得する
キーワードの内容が消えないように、PHP側でパラメータの値を取得してキーワードの項目にセットするようにします。
青色でハイライト になっているところが、今回の変更箇所です。先程のPHPファイルに変更を加えて下さい。
<?php
// GET Request Paramater
$q = $_GET['q']?$_GET['q']:"GMO";
?>
<html>
<head>
<title>Tweets Search</title>
</head>
<body>
<h1>Tweets Search</h1>
<?php
echo <<<EOF
<form action="./twitter.php" method="GET">
keyword : <input type="text" name="q" value="{$q}"/><br/>
<input type="submit" value="submit"/>
</form>
EOF;
?>
</body>
</html>
解説
・キーワードの内容が submitボタン をクリックをしても消えない。
・ $_GET でGETパラメータの値を取得して、キーワードの項目にセットしている。
④ TwitterAPIを叩いてみる
- Twitter APIの検索を実行してみる
<?php
// Twitter Library
require 'TwistOAuth.phar';
// API Key
$consumer_key = 'APIキー';
$consumer_secret = 'APIシークレット';
$access_token = 'アクセストークン';
$access_token_secret = 'アクセストークンシークレット';
// Twitter Library
$connection = new TwistOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret);
// GET Request Paramater
$q = $_GET['q']?$_GET['q']:"GMO";
// Search Tweets
$tweets_params = ['q' => $q ,'count' => '10'];
$tweets = $connection->get('search/tweets', $tweets_params)->statuses;
var_dump($tweets);
?>
<html>
<head>
<title>Tweets Search</title>
</head>
<body>
<h1>Tweets Search</h1>
<?php
echo <<<EOF
<form action="./twitter.php" method="GET">
keyword : <input type="text" name="q" value="{$q}"/><br/>
<input type="submit" value="submit"/>
</form>
EOF;
?>
</body>
</html>
APIキーについて
- 事前に取得してAPIキーの情報を使用します。
http://www.アカウント名.shop/TwitterAPI.txt
- API情報を書き換えて下さい
// API Key
$consumer_key = 'APIキー';
$consumer_secret = 'APIシークレット';
$access_token = 'アクセストークン';
$access_token_secret = 'アクセストークンシークレット';
解説
・ access_token と access_token_secrete を取得するために OAuth認証という仕組みを利用する必要がありますが、今回は事前にこちらで用意しています。
注意
API Keyの情報は以降も利用するのでメモ帳などにコピーしておいて下さい。
OAuth認証について
- TwitterAPIを使用しているアプリケーションで、認証画面が表示されることがあります。
- ユーザーとアプリとTwitterの認証フローは以下の図のようになっています。
- ユーザーがWebアプリにアクセス
- アプリがTwitterから、Request Tokenを取得
- Twitterのユーザー認証ページにリダクレト
- ユーザーがTwitterにログインし、Webアプリを許可
- TwitterがAccess Tokenを発行し、Webアプリのページにリダクレト
TwistOAuthライブラリ
- 今回はTwitterのAPIを実行するために一から作るのではなく、既に用意されている「TwistOAuthライブラリ」を使用します。 (現在は「TwistOAuth」後継として「Cowitter」がありますのでそちらを使用するようにして下さい)
// Twitter Library
require 'TwistOAuth.phar';
// API Key
...
// Twitter Library
$connection = new TwistOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret);
解説
・require でTwistOAuthのライブラリを使用できるように読み込んでいます。
・APIキーの情報をセットしてインスタンスを生成しています。
Tweets検索API
今回はTwitterのキーワード検索を行うには GET: Search Tweets を使用します。 使い方はこちらのドキュメントに載っています。
リクエストURL:
https://api.twitter.com/1.1/search/tweets.json
リクエストパラメータ:
名前 | 必須 | 説明 | デフォルト値 | 例 |
---|---|---|---|---|
q | 必須 | 検索する文字列です | @noradio | |
geocode | 任意 | 指定された緯度/経度の半径内にあるユーザによるつぶやきを返します。 | 37.781157 -122.398720 1mi | |
lang | 任意 | 指定した言語のツイートに限定されます。 | eu | |
locale | 任意 | 送信する言語を指定します。 | ja | |
result_type | 任意 | popular: 人気のある結果、reent:最新の結果のみ、mixed:両方を含める | mixed recent popular | |
count | 任意 | 取得する件数 | 100 | |
until | 任意 | 指定した日付以前の結果を返す。(ⅰ週間以上経過したツイートは検索できない制限がある) | 2015-07-19 | |
since_id | 任意 | 指定したIDより新しい結果を返す | 12345 | |
max_id | 任意 | 指定したIDより古い結果を返す | 54321 | |
include_entities | 任意 | falseに設定している場合、Tweet Entitiesは含まれません | false |
- 実際に使用する場合はパラメータを作成して、getで呼び出すだけです。
// GET Request Paramater
$q = $_GET['q']?$_GET['q']:"GMO";
// Search Tweets
$tweets_params = ['q' => $q ,'count' => '10'];
$tweets = $connection->get('search/tweets', $tweets_params)->statuses;
var_dump($tweets);
解説
・パラメータには検索す文字列と取得する件数を設定しています。
・取得した結果の中身を確認するために var_dump() を使用しています。
問題
・天気APIでもありましたが、取得した内容が分かりづらいので必要な情報だけ表示するようしたい。
⑤ 取得したツイートの内容を一覧で表示してみる
・今のままではツイートの内容が見づらいので、一覧で表示する処理を追加してみます。
<?php
// Twitter Library
require 'TwistOAuth.phar';
// API Key
$consumer_key = 'APIキー';
$consumer_secret = 'APIシークレット';
$access_token = 'アクセストークン';
$access_token_secret = 'アクセストークンシークレット';
// Twitter Library
$connection = new TwistOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret);
// GET Request Paramater
$q = $_GET['q']?$_GET['q']:"GMO";
// Search Tweets
$tweets_params = ['q' => $q ,'count' => '10'];
$tweets = $connection->get('search/tweets', $tweets_params)->statuses;
// var_dump($tweets);
?>
<html>
<head>
<title>Tweets Search</title>
</head>
<body>
<h1>Tweets Search</h1>
<?php
echo <<<EOF
<form action="./twitter.php" method="GET">
keyword : <input type="text" name="q" value="{$q}"/><br/>
<input type="submit" value="submit"/>
</form>
EOF;
// Show List
foreach ($tweets as $value) {
$text = htmlspecialchars($value->text, ENT_QUOTES, 'UTF-8', false);
echo $text;
echo "<br/>";
}
?>
</body>
</html>
検索した結果の中身を確認
APIのドキュメントを確認すると戻り値の内容も調べることができます。
こちらの中身の text の内容を一行ずつ表示して行きたいと思います。
{
"statuses": [
{
"created_at": "Sun Feb 25 18:11:01 +0000 2018",
"id": 967824267948773377,
"id_str": "967824267948773377",
"text": "From pilot to astronaut, Robert H. Lawrence was the first African-American to be selected as an astronaut by any na… https://t.co/FjPEWnh804",
"truncated": true,
"entities": {
"hashtags": [],
...
},
"metadata": {
"result_type": "popular",
"iso_language_code": "en"
},
"source": "<a href="https://www.sprinklr.com" rel="nofollow">Sprinklr</a>",
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 11348282,
...
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"is_quote_status": false,
"retweet_count": 988,
"favorite_count": 3875,
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"lang": "en"
},
{
"created_at": "Sun Feb 25 19:31:07 +0000 2018",
"id": 967844427480911872,
"id_str": "967844427480911872",
"text": "A magnetic power struggle of galactic proportions - new research highlights the role of the Sun's magnetic landscap… https://t.co/29dZgga54m",
...
- foreach で繰り返しながら text の内容を表示する
foreach ($tweets as $value) {
$text = htmlspecialchars($value->text, ENT_QUOTES, 'UTF-8', false);
echo $text;
echo "<br/>";
}
解説
・ $tweets
の中に配列でツイートの内容が含まれているので、foreach
を使用して、1行ずつ取得するループ処理を行っています。
・ htmlspecialchars
は、特殊文字をエスケープしてくれます。これは悪意なタグの埋め込みを防ぐ目的で使用します。
例)
「<」が「<
」
⑥ 整形
・他にもユーザ情報とかも取得できるので表示するようにしてみます。
<?php
// Twitter Library
require 'TwistOAuth.phar';
// API Key
$consumer_key = 'APIキー';
$consumer_secret = 'APIシークレット';
$access_token = 'アクセストークン';
$access_token_secret = 'アクセストークンシークレット';
// Twitter Library
$connection = new TwistOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret);
// GET Request Paramater
$q = $_GET['q']?$_GET['q']:"GMO";
// Search Tweets
$tweets_params = ['q' => $q ,'count' => '10'];
$tweets = $connection->get('search/tweets', $tweets_params)->statuses;
// var_dump($tweets);
?>
<html>
<head>
<title>Tweets Search</title>
</head>
<body>
<h1>Tweets Search</h1>
<?php
echo <<<EOF
<form action="./twitter.php" method="GET">
keyword : <input type="text" name="q" value="{$q}"/><br/>
<input type="submit" value="submit"/>
</form>
EOF;
// Show List
foreach ($tweets as $value) {
$text = htmlspecialchars($value->text, ENT_QUOTES, 'UTF-8', false);
// mathing keyword
$keywords = preg_split('/,|\sOR\s/', $tweets_params['q']);
foreach ($keywords as $key) {
$text = str_ireplace($key, '<b>'.$key.'</b>', $text);
}
disp_tweet($value, $text);
}
// Show Tweets
function disp_tweet($value, $text){
$icon_url = $value->user->profile_image_url;
$screen_name = $value->user->screen_name;
$updated = date('Y/m/d H:i', strtotime($value->created_at));
$tweet_id = $value->id_str;
$url = 'https://twitter.com/' . $screen_name . '/status/' . $tweet_id;
echo <<<TWEET
<div class="thumb"><img alt="" src="{$icon_url}"><a target="_blank" href="{$url}">@{$screen_name}</a></div>
<div class="tweet">{$text}</div>
<div class="meta">({$updated})</div>
<br/>
TWEET;
}
?>
</body>
</html>
⑦ cowitterライブラリ
今回使用したTwistOAuthライブラリの後継として、cowitterというライブラリがあります。 現在はこちらを使用するのがメジャーとなっていますので、実際に使用する場合はこちらを使用して下さい。
使用するにはPHPのライブラリを管理するcomposerを利用します。
XREAサーバーでcomposerを使用する方法
- composerをダウンロードして、phpcliで実行します。
$ cd ~
$ wget https://getcomposer.org/composer.phar --no-check-certificate
$ phpcli ~/composer.phar show -V
cowitterをインストールする
- ドキュメントルートに移動して、以下のコマンドでcowitterを使用できるようになります
$ cd public_html
$ phpcli ~/composer.phar require mpyw/cowitter:^1.0
cowitterを利用する
・ライブラリの読み込みのところと、インスタンスの生成部分を変えるだけで後は同じように使用できます。
<?php
require __DIR__ . '/vendor/autoload.php';
use mpyw\Co\Co;
use mpyw\Co\CURLException;
use mpyw\Cowitter\Client;
use mpyw\Cowitter\HttpException;
// API Key
$consumer_key = 'APIキー';
$consumer_secret = 'APIシークレット';
$access_token = 'アクセストークン';
$access_token_secret = 'アクセストークンシークレット';
// Twitter Library
$connection = new Client([$consumer_key, $consumer_secret, $access_token, $access_token_secret]);
// GET Request Paramater
$q = $_GET['q']?$_GET['q']:"GMO";
// Search Tweets
$tweets_params = ['q' => $q ,'count' => '10'];
$tweets = $connection->get('search/tweets', $tweets_params)->statuses;
// var_dump($tweets);
?>
<html>
<head>
<title>Tweets Search</title>
</head>
<body>
<h1>Tweets Search</h1>
<?php
echo <<<EOF
<form action="./twitter.php" method="GET">
keyword : <input type="text" name="q" value="{$q}"/><br/>
<input type="submit" value="submit"/>
</form>
EOF;
// Show List
foreach ($tweets as $value) {
$text = htmlspecialchars($value->text, ENT_QUOTES, 'UTF-8', false);
// mathing keyword
$keywords = preg_split('/,|\sOR\s/', $tweets_params['q']);
foreach ($keywords as $key) {
$text = str_ireplace($key, '<b>'.$key.'</b>', $text);
}
disp_tweet($value, $text);
}
// Show Tweets
function disp_tweet($value, $text){
$icon_url = $value->user->profile_image_url;
$screen_name = $value->user->screen_name;
$updated = date('Y/m/d H:i', strtotime($value->created_at));
$tweet_id = $value->id_str;
$url = 'https://twitter.com/' . $screen_name . '/status/' . $tweet_id;
echo <<<TWEET
<div class="thumb"><img alt="" src="{$icon_url}"><a target="_blank" href="{$url}">@{$screen_name}</a></div>
<div class="tweet">{$text}</div>
<div class="meta">({$updated})</div>
<br/>
TWEET;
}
?>
</body>
</html>
⑧ 最後に
今回使用したTwiterAPIキーの情報についてはハンズオン終了後に使用できなくなります。 3. Twitter API 〜準備編〜を見て各自でAPIキーを取得してみて下さい。