読者です 読者をやめる 読者になる 読者になる

女子WEBエンジニアのTechメモ

都内の某企業でマーケッターやってます。営業→WEBエンジニア・オフショア開発チーム駐在→マーケッター(SEO)ちょっと便利だなと思ったことをメモしています。

TwitterAPIでツイートを検索して表示する

API

今作っているPHPのアプリケーションで、

「Twitterのツイートをキーワード検索して、その結果をずらっと表示したいなー」

というところがあったので、TwitterのAPIをさわってみました٩( ‘ω’ )و

はじめてTwitterのAPIを見てみたのですが、表示だけじゃなくて投稿・投稿の編集などのAPIもあるので、かなり色々遊べそうな雰囲気・・・!

詳しくは、公式ドキュメントを見てみてくださいね★
APIあんまり使ったことないな〜というよちよちエンジニアでも安心です。

大まかに書くと3ステップ!

Twitterのユーザー登録をする。

Twitterの新規登録ページから登録します。
*Developer用などではなく、ツイートとかをする一般のアカウントの登録です。

電話番号はアプリケーションの登録に必要なので、必ず登録してください!

既存のアカウントを使う方は、設定 > Twitterデータ のページで
電話番号が登録してあるか確認してくださいね★

Twitterにアプリケーションを登録する。

Twitterのdeveloperページに行きます。

さっき作成したTwitterのアカウントにログインした状態で、Manage your app を選択。

f:id:ajarakko:20160712002938p:plain

アプリケーションの情報を入力して、新規登録をします!

f:id:ajarakko:20160712003010p:plain

Submitしたら登録完了!

登録したアプリケーションの情報は、Application Management から確認できます。

ツイート取得のコードを書く。

APIを使って、ツイートを検索して取得するコードを書きます。

Javascriptを使っても良いですが、外部からAccess Tokenとかが見えてしまうのは嫌なので、PHPで取得するようにしました。

Twitter Rest APIを使ってツイートを取得するまでの流れ

ざっくり書くと、下記のような流れです。

  • アプリケーション登録時に発行された、api_keyとapi_secretを使ってベアラートークンを取得する
  • ベアラートークンを使って、search/tweets でツイートを取得する

【脱線】・・・ベアラートークンとは?٩( ‘ω’ )و

Twitter Rest APIを利用してデータを取得したり、更新したりするためには、トークンが必要です。

Twitter Rest APIに関係するトークンは下記の2種類があります。

アクセストークン(access_token)
ベアラートークン(bearer_token)

これらのトークンは、取得したいデータの種類によって使い分けます。

アクセストークンはユーザー認証であり、ユーザーのプロフィールなどの個人的な情報を取得したり、ツイート投稿などそのユーザーのみができる行為をするときに必要なものです。
Twitter「XXさんにしか公開できない情報だけど、本当にXXさんですか?」というものの証明になるものです!

ベアラートークンとはアプリケーション認証であり、公開されているツイートなどログインしていない状態で誰もが閲覧できる情報を取得するときに必要なものです。
Twitter「登録済のアプリからの通信じゃないと教えてあげられないんだけど、ちゃんとアプリ登録済んでる?」というものの証明になります★

実際のコード

というわけで、実際にコードを書くと下記のようになりました!

get_bearer_tokenで取得したベアラートークンをget_by_hashtag内にセットして、データを取得しています。

>||
protected function get_bearer_token(){
// 設定項目
$api_key = ''; // ApplicationManagementから確認したAPIキーをセットしてください
$api_secret = ''; //ApplicationManagementから確認したAPIシークレットをセットしてください


// クレデンシャルを作成
$credential = base64_encode( $api_key . ':' . $api_secret );

// リクエストURL
$request_url = 'https://api.twitter.com/oauth2/token';

// リクエスト用のコンテキストを作成する
$context = array(
'http' => array(
'method' => 'POST', // リクエストメソッド
'header' => array( // ヘッダー
'Authorization: Basic ' . $credential,
'Content-Type: application/x-www-form-urlencoded;charset=UTF-8',
) ,
'content' => http_build_query( // ボディ
array(
'grant_type' => 'client_credentials',
)
),
),
);

// cURLを使ってリクエスト
$curl = curl_init() ;
curl_setopt( $curl , CURLOPT_URL , $request_url );
curl_setopt( $curl , CURLOPT_HEADER, 1 );
curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $context['http']['method'] ); // メソッド
curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ); // 証明書の検証を行わない
curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ); // curl_execの結果を文字列で返す
curl_setopt( $curl , CURLOPT_HTTPHEADER , $context['http']['header'] ); // ヘッダー
curl_setopt( $curl , CURLOPT_POSTFIELDS , $context['http']['content'] ); // リクエストボディ
curl_setopt( $curl , CURLOPT_TIMEOUT , 10 ); // タイムアウトの秒数
$res1 = curl_exec( $curl );
$res2 = curl_getinfo( $curl );
curl_close( $curl );

// 取得したデータ
$json = substr( $res1, $res2['header_size'] ); // 取得したデータ(JSONなど)
$header = substr( $res1, 0, $res2['header_size'] ); // レスポンスヘッダー (検証に利用したい場合にどうぞ)

// JSONをオブジェクトに変換
$obj = json_decode( $json );

// エラー判定
if( !$obj || !isset( $obj->access_token ) )
{
return FALSE;
}
else
{
$bearer_token = $obj->access_token;
return $bearer_token;
}
}

public function get_by_hashtag(){

// ベアラートークンを取得
$bearer_token = $this->get_bearer_token();

if(empty($bearer_token)){
echo "ERROR: ベアラートークンが取得できませんでした";
exit;
}

$request_url = 'https://api.twitter.com/1.1/search/tweets.json'; // エンドポイント

// パラメータ
$params = array(
'q' => 'エンジニア女子 filter:images', // 検索キーワード (必須)
// 'count' => '20', // 取得件数
// 'until' => '2016-03-21', // 最新日時
// 'since_id' => '11111', // 最古のツイートID
// 'max_id' => '99999', // 最新のツイートID
// 'include_entities' => 'true', // ツイートオブジェクトのエンティティを含める
) ;

// パラメータがある場合
if( $params )
{
$request_url .= '?' . http_build_query( $params );
}

// リクエスト用のコンテキスト
$context = array(
'http' => array(
'method' => 'GET' , // リクエストメソッド
'header' => array( // ヘッダー
'Authorization: Bearer ' . $bearer_token ,
) ,
) ,
) ;

// cURLを使ってリクエスト
$curl = curl_init();
curl_setopt( $curl , CURLOPT_URL , $request_url );
curl_setopt( $curl , CURLOPT_HEADER, 1 );
curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $context['http']['method'] ); // メソッド
curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ); // 証明書の検証を行わない
curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ); // curl_execの結果を文字列で返す
curl_setopt( $curl , CURLOPT_HTTPHEADER , $context['http']['header'] ); // ヘッダー
curl_setopt( $curl , CURLOPT_TIMEOUT , 10 ); // タイムアウトの秒数
$res1 = curl_exec( $curl );
$res2 = curl_getinfo( $curl );
curl_close( $curl );

// 取得したデータ
$json = substr( $res1, $res2['header_size'] ) ; // 取得したデータ(JSONなど)
$header = substr( $res1, 0, $res2['header_size'] ) ; // レスポンスヘッダー (検証に利用したい場合にどうぞ)

// JSONをオブジェクトに変換
$obj = json_decode( $json ) ;

// エラー判定
if( !$json || !$obj )
{
echo "ERROR: データが取得できませんでした";
exit;
}
echo $json;
exit;
}
|

ほかにも色々なパラメーターが設定できます。
(設定可能なパラメーターについては、公式ドキュメントをお読みください!)

参考にさせていただいたサイト:
https://syncer.jp/twitter-api-matome/get/search/tweets