OAuthを通してPHPからタイムラインの情報を取得する | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

前回、「OAuthを使ってPHPからTwitterへ投稿する 」にて、PHPからOAuthを使うための環境準備とTwitterへつぶやきを投稿するプログラムを書いてみましたが、今回はタイムラインから様々な情報を取得するPHPプログラムを書いてみます。



共通系処理の準備


OAuth認証系の処理については、基本的に前回書いたプログラムと同様です。

ここはタイムラインの操作でも共通する処理になるため、切り出して別のプログラムファイルとして定義しておきます。


<?php

include 'HTTP/OAuth/Consumer.php';

$consumer_key    = 'アプリ登録した際のコンシューマーキー';
$consumer_secret = 'アプリ登録した際のコンシューマーシークレットキー';

$access_token        = 'アプリに対して発行したアクセストークン';
$access_token_secret = 'アプリに対して発行したアクセストークンシークレット';

$consumer = new HTTP_OAuth_Consumer($consumer_key, $consumer_secret);

$http_request = new HTTP_Request2();
$http_request->setConfig('ssl_verify_peer', false);
$consumer_request = new HTTP_OAuth_Consumer_Request;
$consumer_request->accept($http_request);
$consumer->accept($consumer_request);

// リクエストトークンの発行を依頼
$consumer->getRequestToken('https://twitter.com/oauth/request_token');

// リクエストトークンを取得
$request_token = $consumer->getToken();
$request_token_secret = $consumer->getTokenSecret();

// リクエストトークンをセット
$consumer->setToken($request_token);
$consumer->setTokenSecret($request_token_secret);

// 発行済みのアクセストークンをセット
$consumer->setToken($access_token);
$consumer->setTokenSecret($access_token_secret);


上記の処理でOAuthの認証がクリアされているので、後はTwitterのAPIを以降書いていくことで様々な操作をすることができます。



タイムラインからツイートを取得する


まずは、パブリックタイムラインからつぶやきの情報を取得してみます。


<?php

include 'oauth.php';

$api_url = "http://api.twitter.com/1/statuses/public_timeline.xml";
$result = $consumer->sendRequest($api_url, array(), "GET");

$xml = new SimpleXMLElement($result->getBody());

for ($i = 0; $i < count($xml->status); $i++) {
    echo $xml->status[$i]->user->screen_name . " : " . date('Y/m/d H:i:s', strtotime($xml->status[$i]->created_at)) . "\n";
    echo "\t" . $xml->status[$i]->text . " / " . $xml->status[$i]->id . "\n";
}


$api_urlで指定しているのが、パブリックタイムラインから情報を取得するためのAPI用URLです。

後半の処理は、XMLで情報を取得したため、それを解析して端末上に出力するようにしています。

出力の形式は


スクリーン名 : 投稿日時

          ツイート(つぶやき本文) / ツイートのID


としています。

お次は、ユーザータイムラインから自分のつぶやきだけを取得してみます。


<?php

include 'oauth.php';

$param["screen_name"] = "it_boy";
$api_url = "http://api.twitter.com/1/statuses/user_timeline.xml";
$result = $consumer->sendRequest($api_url, $param, "GET");

$xml = new SimpleXMLElement($result->getBody());

for ($i = 0; $i < count($xml->status); $i++) {
    echo $xml->status[$i]->user->screen_name . " : " . date('Y/m/d H:i:s', strtotime($xml->status[$i]->created_at)) . "\n";
    echo "\t" . $xml->status[$i]->text . " / " . $xml->status[$i]->id . "\n";
}


プログラムの内容自体はほとんど同一ですが、$paramでAPIに送信するパラメータを指定しています。

誰のユーザータイムラインを見るかってところで、screen_name(スクリーン名)を指定してタイムラインの情報を拾っています。

ユーザーIDを使って取得することも可能です。

また、その他のAPI操作でも色々なパラメータを指定して情報を操作することができますが、上記のようにパラメータを指定しておけばAPI側にその情報を送ることができます。


余談ですが、パブリックタイムラインとユーザータイムラインの情報はOAuth認証なしでも情報を取得することができます。

認証なしといっても、コンシューマーキーとリクエストトークンをセットした上でAPIにアクセスしなくてはなりませんが。

そうしたい場合は、下記のようにアクセストークンなしで認証を通過させ、APIへアクセスします。


<?php

include 'HTTP/OAuth/Consumer.php';

$consumer_key    = 'アプリ登録した際のコンシューマーキー';
$consumer_secret = 'アプリ登録した際のコンシューマーシークレットキー';

$consumer = new HTTP_OAuth_Consumer($consumer_key, $consumer_secret);

$http_request = new HTTP_Request2();
$http_request->setConfig('ssl_verify_peer', false);
$consumer_request = new HTTP_OAuth_Consumer_Request;
$consumer_request->accept($http_request);
$consumer->accept($consumer_request);

// リクエストトークンの発行を依頼
$consumer->getRequestToken('https://twitter.com/oauth/request_token');

// リクエストトークンを取得
$request_token = $consumer->getToken();
$request_token_secret = $consumer->getTokenSecret();

// リクエストトークンをセット
$consumer->setToken($request_token);
$consumer->setTokenSecret($request_token_secret);


もちろんアクセストークンつきでも問題なく情報は取得できますので、あえて分離するメリットはないかと思いますが・・・。


次は、ホームタイムラインからの情報取得です。

これは、自分がTwitterへログインしたときと同じ情報を取得することができます。

プログラムは、パブリックタイムラインを取得するプログラム(public_timeline.php)内の$api_urlを下記に書き換えるだけで取得できます。


$api_url = "http://api.twitter.com/1/statuses/home_timeline.xml";


似たような情報として、friends_timelineというAPIもあるのですが、こちらは公式リツイートの情報が取得できません。

また、古いAPIで将来廃止の予定らしいので、home_timelineのAPIを使ってた方がよいでしょう。


タイムライン系最後は、自分宛の返信の情報を取得してみます。

こちらも、先ほど同様に$api_urlを変更するだけで自分に返信したつぶやきの情報を取得することができます。


$api_url = "http://api.twitter.com/1/statuses/mentions.xml";

各APIの詳細は、公式のAPIドキュメント も参照してみてください。


リツイート系の情報を取得する


次は、リツイート系の情報を拾ってみます。


※ リツイートは全て公式のものです。単に発言にRTつけて返信したものは含まれません。


これには、3つのAPIが用意されています。

ただ、PHPのプログラム自体は先ほど同様に全て$api_urlの部分を書き換えるだけで動作します。


- 自分のタイムライン上でリツイートされたつぶやきを取得する


自分が閲覧可能なタイムラインの中で公式リツイートされた情報だけを取得します。


$api_url = "http://api.twitter.com/1/statuses/retweeted_to_me.xml";

- 自分がリツイートしたつぶやきを取得する


自分が公式リツイートしたつぶやきの一覧を取得します。


$api_url = "http://api.twitter.com/1/statuses/retweeted_by_me.xml";

- 自分の発言の中でリツイートされたものを取得する


最後は、自分の発言が公式リツイートされたものを取得します。


$api_url = "http://api.twitter.com/1/statuses/retweeted_of_me.xml";