TwitterでxAuthを使う試み

|
Clip to Evernote TwitterでxAuthを使う試み

なにやら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 [email protected] -- 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