TwitterのBasic認証が6月末に終了するということで、やっとこさmixiボイスへの転送スクリプト”tw2mv”をxAuthに対応させてみました。
xAuthはOAuthの簡易版ですので、可能な限りOAuthで実装するのが筋だと思います。
ただ、本スクリプトはコマンドラインスクリプトのため、OAuthでWebの画面を開いて認証させるのは余計な手間がかかると判断しxAuthを採用しています。
1. Twitterへのアプリケーション登録
通常のOAuth利用と同じく、ConsumerKeyが必要なのでアプリケーションの申請を行います。
https://twitter.com/apps/new
クライアントアプリケーションなので「あなたの招待状」の部分を「送信」で登録。(日本語訳がおかしいですね。。)
2. xAuthの利用申請メール
xAuth access is restricted to approved applications. If your application is a desktop or mobile application and the standard web OAuth flow or PIN-code out-of-band flow is not right for you, send a detailed message to api@twitter.com to request xAuth privileges. Include the name of your application, the consumer key, the application ID (if available), and a summary of how xAuth is best-suited for your application.
api@twitter.com宛にメールで利用の申請をしてねとのことなので、メール(英語)でお伺いを立てました。
To: api@twitter.com Subject: xauth request Hello. I'm a developer of "tw2mv". "tw2mv" is a php script, for sync messages between twitter and "mixi voice". ("mixi voice" is twitter-like service, in japanese SNS "mixi". Please apply this app to use xAuth. Application Name: tw2mv App Source Code : http://github.com/nojimage/twitter2mixivoice My account : @nojimage Thank you.
タイミングもあったと思いますが、申請から8hで承認がおりました。thanks!
(よく見たら、ConsumerKeyもメールに書いておいてねとある。。
3. OAuthライブラリ
pearのHTTP_OAuthを利用しました。
pear install HTTP_OAuth-0.1.10
4. コードの変更
ざくっと、修正のポイント。
4.1. OAuthオブジェクトの生成
SSL通信でOAuthを利用できるように下準備しておきます。
$this->http = new HTTP_Request2(); $this->http->setConfig('ssl_verify_peer', false); // OAuthリクエスト $consumer_request = new HTTP_OAuth_Consumer_Request(); $consumer_request->accept($this->http); // $this->config->twitter_oauth_consumer_key等は、OAuthのConsumer keyとConsumer secret $this->oauth = new HTTP_OAuth_Consumer($this->config->twitter_oauth_consumer_key, $this->config->twitter_oauth_consumer_secret); $this->oauth->accept($consumer_request);
4.2. Access Tokenの取得
Access Token を取得するには、x_auth_username、x_auth_passwordにユーザ名とパスワード、x_auth_modeを”client_auth”としてPOSTしてくれとのことなので、その通りに。
tw2mvでは、Twitterクライアントクラスのコンストラクタ内でやっちゃってます。
$params = array( 'x_auth_mode' => 'client_auth', 'x_auth_username' => 'username', // twitterのユーザ名 'x_auth_password' => 'password'); // twitterのパスワード $response = $this->oauth->sendRequest('https://api.twitter.com/oauth/access_token', $params, HTTP_Request2::METHOD_POST); if ($response->getStatus() !== 200) { throw new Exception($response->getBody(), $response->getStatus()); } // レスポンスデータを解析 $access_token_info = array(); parse_str($response->getBody(), $access_token_info); // 設定ファイルへ保存 // 次回以降は保存しておいたtokenを呼び出して認証します。 $this->config->saveTwitterAccessToken($access_token_info['oauth_token'], $access_token_info['oauth_token_secret']);
取得したAccess Tokenを、HTTP_OAuth_Consumerオブジェクトにセットするのを忘れずに。
// トークンをセット $this->oauth->setToken($this->config->twitter_oauth_access_token); $this->oauth->setTokenSecret($this->config->twitter_oauth_access_token_secret);
4.3. メソッドの書き換え
今まで、HTTP_Request2を利用してリクエストを行っていた部分を、HTTP_OAuth経由で送信するようにしました。
// 投稿 $result = $this->_json_decode($this->post_request(self::$HTTP_URI . 'statuses/update.json', $datas, true));
post_requestメソッドは何の変哲もなく、こんな感じ。
/** * POST Request * * @param $url * @param $datas * @return string * @since version 2.1.0 */ public function post_request($url, $datas = array()) { $body = ''; try { $response = $this->oauth->sendRequest($url, $datas, HTTP_Request2::METHOD_POST); $body = $response->getBody(); } catch (Exception $e) { debug($e->getMessage()); } return $body; }
実際のスクリプトの変更内容はこちらです。
Commit ea57ced14b323dfe39f037dcdc3aca5babbcb590 to nojimage’s twitter2mixivoice – GitHub
参考サイト:
Pingback: Tweets that mention tw2mvをTwitterのxAuthに対応させたメモ @ php-tips -- Topsy.com