tw2mvをTwitterのxAuthに対応させたメモ

標準

TwitterのBasic認証が6月末に終了するということで、やっとこさmixiボイスへの転送スクリプト”tw2mv”をxAuthに対応させてみました。

xAuthはOAuthの簡易版ですので、可能な限りOAuthで実装するのが筋だと思います。
ただ、本スクリプトはコマンドラインスクリプトのため、OAuthでWebの画面を開いて認証させるのは余計な手間がかかると判断しxAuthを採用しています。

1. Twitterへのアプリケーション登録

通常のOAuth利用と同じく、ConsumerKeyが必要なのでアプリケーションの申請を行います。

https://twitter.com/apps/new
クライアントアプリケーションなので「あなたの招待状」の部分を「送信」で登録。(日本語訳がおかしいですね。。)

2. xAuthの利用申請メール

Using xAuth | dev.twitter.com

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

参考サイト:

One Comment

  1. Pingback: Tweets that mention tw2mvをTwitterのxAuthに対応させたメモ @ php-tips -- Topsy.com

コメントを残す

Page optimized by WP Minify WordPress Plugin