タグ「oauth」が付けられているエントリー

PHPでTwitterのプロフィール検索してリストを作る方法(OAuth対応版)

| PHPでTwitterのプロフィール検索してリストを作る方法(OAuth対応版)

Twitterのリスト機能って便利ですよね.例えば,イベントなどでその関係者のつぶやきを一覧したい,でもフォローするのはアレだしって時に使えます.同様に,ある共通の趣味を持っている人を集めるとか,ある特定の病気と闘っている人を集めるとか,色々と応用ができます.そんなこんなで,最近はリストを作って喜んでます.

そんなこんなで,今日はTwitter標準のAPIではできないことをサードパーティ製APIで実現しまくる方法を紹介します!具体的には,プロフィールに特定のキーワードが含まれているユーザを抽出して,リストを作る方法です.実装はいつも通りにPHPでOAuth対応です.書き忘れていますが,ソースは当然の如くUTF-8で保存してくださいね.

tps.lefthandle.netのAPIを用いる場合
Twitterのプロフィール検索を提供しているサードパーティは,ざっくり調べた感じでは2カ所あります.そのうちの1カ所がtps.lefthandle.netです.主な仕様としては,GETリクエストに対してJSONで返事します.結果は最大100件で,ユーザー登録順,follower数順,最近のつぶやき順が選べます.というかドキュメント読んで下さい

このAPIを使ってプロフィール検索をして,引っかかった人をリストに追加するコードはこんな感じです.

<?php
$ids = 'yourscreenname';
$listname = 'listname';
$url = "http://api.twitter.com/1/$ids/$listname/members.json";
$q = urlencode('キーワード');
$sortmode = 'recent';//
register, follower
//search APIのURL
$c = curl_init("http://tps.lefthandle.net/rest/?s=$q&sort=$sortmode");
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($c);
curl_close($c);
$json = json_decode($response);
//リストに追加する
foreach ($json as $u) {
$param = array('id' => $u->screen_name);
$res = twitter_api($url, OAUTH_HTTP_METHOD_POST, $param);
}

//twitter api
function twitter_api($url, $method=OAUTH_HTTP_METHOD_GET, $param=null) {
$consumerKey = '
consumerKey';
$consumerSecret = '
consumerSecret';
$oauthToken = '
oauthToken';
$oauthTokenSecret = '
oauthTokenSecret';

try {
$oauth = new OAuth($consumerKey, $consumerSecret,
OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);
$oauth->setToken($oauthToken, $oauthTokenSecret);
$oauth->fetch($url, $param, $method);
$response = $oauth->getLastResponse();
return $response;
} catch (OAuthException $e) {
return $e;
}
}
?>

ベリーイージーね.前提として,リストは作っておいて下さい.空でも空じゃなくても構いません.もちろん,エラー処理がいい加減なんで,適当に修正して下さい.OAuthのトークンは適当な方法で取得して下さい.この方法だと,検索に引っかかった人を無差別に登録するので,既登録の人を再度登録しようとしたりして無駄が多いので,既登録者リストとの差分を取るとかの工夫をしたら良いんじゃないかと思います.

twpro.jpのAPIを用いる場合
もいっこの方がtwpro.jpです.主な仕様としては,GETリクエストにJSONで返事します.IPアドレス毎に1000回/時のAPIコールが可能です.また,検索結果が最大300件となっています.また,JSONPのコールバックが使えます.使わないけど.まぁ,ドキュメント読んでね.

このAPIを使ってプロフィール検索をして,引っかかった人をリストに追加するコードはこんな感じです.

<?php
$ids = 'yourscreenname';
$listname = 'listname';
$url = "http://api.twitter.com/1/$ids/$listname/members.xml";
$q = urlencode('キーワード');

//search APIのURL
$c = curl_init("http://api.twpro.jp/1/search?q=$q&num=300");
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($c);
curl_close($c);
$json = json_decode($response);
//リストに追加する
foreach ($json->users as $u) {
$param = array('id' => $u->screen_name);
$res = twitter_api($url, OAUTH_HTTP_METHOD_POST, $param);
}

//twitter api
function twitter_api($url, $method=OAUTH_HTTP_METHOD_GET, $param=null) {
$consumerKey = 'consumerKey';
$consumerSecret = '
consumerSecret';
$oauthToken = '
oauthToken';
$oauthTokenSecret = '
oauthTokenSecret';

try {
$oauth = new OAuth($consumerKey, $consumerSecret,
OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);
$oauth->setToken($oauthToken, $oauthTokenSecret);
$oauth->fetch($url, $param, $method);
$response = $oauth->getLastResponse();
return $response;
} catch (OAuthException $e) {
return $e;
}
}
?>

こんな感じかな?いいんじゃないかな?どっちのAPIも良くできているよ.

別になんら難しいことはないんだけど,TwitterのBOTを作って自動フォローやリムーブをしたくなることってあるじゃないですか?特に,人気BOTになってくると,いちいちフォローされましたメールからフォローするなんて,面倒くさいじゃないですか?そうなると,自動でやりたいですよね.ということで,自動フォロー/リムーブするPHPなプログラムを書いたよ.もちろんOAuth対応版だよ.

<?php
$ids = 'yourscreenname';

$friends = array();
$followers = array();
$list_follow = array();
$list_remove = array();

//APIからfriends取得
$url = "http://api.twitter.com/1/friends/ids/$ids.json?cursor=-1";
$res = twitter_api($url);
$json = json_decode($res);
//ユーザIDを抽出して配列に
foreach ($json->ids as $u) {
$friends[] = $u;
}

//APIからfollowers取得
$url = "http://api.twitter.com/1/followers/ids/$ids.json?cursor=-1";
$res = twitter_api($url);
$json = json_decode($res);
//ユーザIDを抽出して配列に
foreach ($json->ids as $u) {
$followers[] = $u;
}

//followするリスト作成
$list_follow = array_diff($followers, $friends);
//removeするリスト作成
$list_remove = array_diff($friends, $followers);

//followする
foreach($list_follow as $f) {
$url = "http://api.twitter.com/1/friendships/create/$f.json";
$res = twitter_api($url, OAUTH_HTTP_METHOD_POST);
}

//removeする
foreach($list_remove as $f) {
$url = "http://api.twitter.com/1/friendships/destroy/$f.json";
$res = twitter_api($url, OAUTH_HTTP_METHOD_POST);
}


//twitter api
function twitter_api($url, $method=OAUTH_HTTP_METHOD_GET, $param=null) {
$consumerKey = 'consumerKey';
$consumerSecret = 'consumerSecret';
$oauthToken = 'oauthToken';
$oauthTokenSecret = 'oauthTokenSecret';

try {
$oauth = new OAuth($consumerKey, $consumerSecret,
OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);
$oauth->setToken($oauthToken, $oauthTokenSecret);
$oauth->fetch($url, $param, $method);
$response = $oauth->getLastResponse();
return $response;
} catch (OAuthException $e) {
return $e;
}
}
?>

トークンは自分のものに置き換えてね!どうせBOTだろうからdevelopersあたりから取れるよね.作り方が雑なんで,適当に改変して利用するといいんじゃないかな.

PECL/oauthはPHPでOAuthなプログラムを書く場合に重宝します.Twitterのbotを書くときにも役立ちます.そのため,比較的頻繁に使っているのですが,ちょっと別の環境でPECL/oauthを使おうと思ったら入っていなくて,入れりゃいいやと思って,pecl install oauthしたらビルドでエラーがでたので,その対処法のメモです.

解決方法はlibpcre3-devを入れる。

sudo apt-get install libpcre3-dev

マキノ式ブログ » Extentionビルドしててpcre.hが存在しないと怒られた。

簡単ね!

TwitterのBASIC認証が2010年6月末で終わり,OAuth/xAuthでの認証が必要になります.以前,xAuthに対応する話を書きましたが,最近になって,botの場合はxAuth申請をする必要がなくなったようです.手順は以下の通り.

まずは,アプリケーションの登録をします.アプリケーションの登録が完了すると,OAuthのConsumer keyとConsumer secretが手に入ります.

100505_twitter01.jpg

この2つの値をコピーしておきます.続いて,右のメニューからMy Access Tokenを選びます.

100505_twitter02.jpg

表示されるAccess TokenとAccess Token Secretをコピーします.準備完了です.あとは,PHPでテストコードを書いてみます.参考コードはウノウラボから.PECL::oauthを前提にしています.


<?php
$consumerKey = '
Consumer key';
$consumerSecret = '
Consumer secret';
$oauthToken = 'OAuth token';
$oauthTokenSecret = 'OAuth token secret';
$oAuthStatusesUpdateUrl = 'http://api.twitter.com/1/statuses/update.xml';

$response = '';
$parameters = array(
'status' => 'OAuthから投稿テスト♪',
);

try {
$oauth = new OAuth($consumerKey, $consumerSecret,
OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);
$oauth->setToken($oauthToken, $oauthTokenSecret);
$oauth->fetch($oAuthStatusesUpdateUrl, $parameters, OAUTH_HTTP_METHOD_POST);
$response = $oauth->getLastResponse();
} catch (OAuthException $e) {
var_dump($e);
exit;
}
var_dump($response);
?>

上記コードの4カ所に先ほどコピーした各値をセットすればokです.簡単ねっ!

関連:
TwitterでxAuthを使う試み - 4403 is written

なにやら2010年6月頃に従来使われていたBASIC認証でのAPIコールができなくなるらしく,OAuthまたはxAuthへの対応が必要となっております.ぶっちゃけ,作っているのはbotなので,OAuthのような仰々しい実装(ぇ)は必要ないので,簡易的なxAuthを用いようと考えました.なお,OAuth対応を行うと60分に350回(将来的には1500回)のAPIコールができるようになるらしい.これはかなり自由度が増します.というわけで,今回はxAuthに対応する話を書いておきます.例によって,実装はPHPです.

参考にしたのはこちら.というか,そのまんまです.OAuth/xAuthを使うには準備が必要です.手順は以下の通り.

準備: アプリケーションを Twitter に登録し、consumer key と consumer secret を取得する
      http://twitter.com/oauth_clients/new にアクセスし、登録する

・Webアプリケーションの場合
  (1) consumer key と consumer secret を使って、リクエストトークン(token と token secret)を取得する
  (2) リクエストトークンのうち、token を使って、ユーザにアクセス許可を求めるための URL を生成し、その URL にリダイレクトする(Web ブラウザに表示させる)
  (3) ブラウザに表示された「許可(allow)」ボタンをユーザが押すと、(アプリケーション登録時に申請した)コールバック URL にリダイレクトされる
  (4) コールバック URL へのアクセスを検知したら、その URL 中に含まれる oauth_verifier パラメータを取り出す
  (5) consumer key, consumer secret, token, token secret, oauth_verifier を使って、アクセストークン(token2 と token2 secret)を取得する
  (6) 以後、consumer key, consumer secret, token2, token2 secret を使って、API を実行する

Twitter API 仕様書 日本語訳 第四十八版 (2010年3月2日版)

簡単ですね.え?まぁまぁ.まずは,http://twitter.com/oauth_clients/newにアクセスして,OAuthを使うアプリケーションを登録します.登録が完了すると以下のような画面が出ます.

100304_xauth01.png

Consumer keyとConsumer secretが表示されるので記録します.で,ウノウラボを参考に以下のようなコードを実行して,アクセストークンを取得してみます.


<?php
$consumerKey = 'Consumer key';
$consumerSecret = 'Consumer secret';
$username = "username";
$password = "password";
$xAuthAccessTokenUrl = 'https://api.twitter.com/oauth/access_token';

$response = '';
$parameters = array(
'x_auth_mode' => 'client_auth',
'x_auth_username' => $username,
'x_auth_password' => $password,
);

try {
$oauth = new OAuth($consumerKey, $consumerSecret,
OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);
$oauth->fetch($xAuthAccessTokenUrl, $parameters, OAUTH_HTTP_METHOD_POST);
$response = $oauth->getLastResponse();
} catch (OAuthException $e) {
var_dump($e);
exit;
}
parse_str($response, $accessTokenInfo);
var_dump($accessTokenInfo);
?>

ウノウラボ Unoh Labs: PECL::oauthでxAuthを参考に一部改変

これを実行すればアクセストークンが取得できるはずです.結果を以下に一部抜粋.


object(OAuthException)#2 (7) {
["message:protected"]=>
string(73) "Invalid auth/bad request (got a 401, expected HTTP/1.1 20X or a redirect)"
(中略)
["lastResponse"]=>
(中略)
<error>Client application is not permitted to use xAuth.</error>
}

おやおや?芳しくないですね.401エラーでxAuthの許可がないと言われています.うーん.ドキュメントを読んでみると,こう書いてあります.

In order to get access to this method, you must apply by sending an email to api@twitter.com -- all other applications will receive a HTTP 401 error.

Twitter API Wiki / Twitter REST API Method: oauth access_token for xAuth

よく読めという話である.つまりは,xAuthを行うにはOAuthのアプリケーション登録をするだけではダメで,メールでの申請がさらに必要とのこと.なるなる.なので,早速メールで申請を行います.・・・って,Twitterって日本語が通じないような気がしますよね?というわけで,どのような文面を書けばよいか.以下をパクりました.

Hello.

I'm a developer of '[Your application]', the twitter client application for windows.
My account is @[Your twitter account].
Please apply this app to use xAuth.

Application: [Your application]

Best regards.
-----------------------------------------------
@[Your twitter account]
[some urls]

xauth request - 3d7b1

簡単ね!これに対するお返事が2日後に来ました.結果は許可ならず.要約すると「おまえbotだろ?なんでxAuthつかうん?もっと説明せーや!」とのこと.ううう・・・.アプリ名を「factoring_bot」にしたのがいかんかったか・・・.確かに,OAuthでやれと言われれば,グーの音もでない.「xAuthを使ってみたいんだよ!」って本音を書きたくなったけど,そこはグッとこらえて,高度な言い訳を.そして更に2日後に「プラットフォームはなに?Windowsでいいのけ?」ってお返事が.ここはクールに「あぁ,最初はWindowsだ.その次はLinux対応だね」って送り返しました.マルチプラットフォームでプログラムを書ける好青年を演じておきました.で,最終的には,コンタクトを始めてから1週間後に以下のメールが来ました.

Your application now has the ability to use XAuth,

おお!!やっと許可されました.粘り強く交渉してみるもんだ.では,先ほど401エラーが返されたプログラムを実行してみましょう.


array(5) {
["oauth_token"]=>
string(50) "oauth_token"
["oauth_token_secret"]=>
string(41) "oauth_token_secret"
["user_id"]=>
string(9) "101753216"
["screen_name"]=>
string(13) "factoring_bot"
["x_auth_expires"]=>
string(1) "0"
}

完璧です.実際にはoauth_tokenとoauth_token_secretには何やらの値が格納されています.ここで見せちゃうとダメだからね^^.ではでは,xAuthを利用してつぶやきをポストしてみましょう.以下のコードを走らせてみます.もちろん,参考コードはウノウラボから.


<?php
$consumerKey = '
Consumer key';
$consumerSecret = '
Consumer secret';
$oauthToken = 'OAuth token';
$oauthTokenSecret = 'OAuth token secret';
$oAuthStatusesUpdateUrl = 'http://api.twitter.com/1/statuses/update.xml';

$response = '';
$parameters = array(
'status' => 'xAuthから投稿テスト♪',
);

try {
$oauth = new OAuth($consumerKey, $consumerSecret,
OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);
$oauth->setToken($oauthToken, $oauthTokenSecret);
$oauth->fetch($oAuthStatusesUpdateUrl, $parameters, OAUTH_HTTP_METHOD_POST);
$response = $oauth->getLastResponse();
} catch (OAuthException $e) {
var_dump($e);
exit;
}
var_dump($response);
?>

で.結果がこちら.

Twitter / 素因数分解ボット「ふぁくたん」: xAuthから投稿テスト♪

アプリ名としてfactoring_botって表示されるのがかっこいい!クール!クール!!クール!!!

まとめ:
TwitterのxAuthはOAuthのライブラリを使って実装可能.xAuthはOAuthのアプリ登録をするだけではダメで,xAuth利用申請をメールで送る必要がある.その際,アプリ名にbotが含まれていると疑われる.というか,最初から自分のアプリを詳細に説明しておけば良いんだと思う.実装のプラットフォームも尋ねられたので,書いておくと良いと思う.実装言語は訊かれなかったけど,アグレッシブに主張した.

OAuth/xAuth採用によって,API制限が少し緩和されるはず.いや,まだfactoring_botにこのテストコードを移植してないけどさ. そのうちにやります.そのうちに・・・.

プロフィール

e-m@il @ddress