Write and Run

it's a simple way, but the only way.

OAuthライブラリを再発明しました

こんばんは。
突然ですが、みなさん Node.js で OAuth 使う時、モジュールは何を使ってますか?
そのモジュール、Twitter の User Stream や、filter API は使えますか?
多分、多くのライブラリはストリームを扱えないか、古すぎて https がサポートされていないかのどちらかだと思います。
それになにより、それらのモジュールの API は Node.js っぽくない! (俺調べ)
ということで、書き直しました!

OAuth-Revenge

"Revenge"と名が付いているのは、自分が今まで同じような動機でいくつも OAuth Client モジュールを作ってきたからです。
まぁ、名前の由来とかどうでもいいので、とっとと実物を見てみましょう。
KOBA789/oauth-revenge - GitHub
まぁ、github にソースは上がってますが、使うだけであれば、NPM 先輩を呼び出して

npm install oauth-revenge

だけでおっけーです。
使う手順としては、

  1. Consumer Key/Secret と、必要であれば Token を用意
  2. それらを適切な Signer のコンストラクタに渡して Signer のインスタンス(signer)を生成
  3. signer を Client のコンストラクタに渡して Client のインスタンス(client)を生成
  4. client のメソッドである GET/POST/PUT/DELETE に URL と Query(省略可) とコールバック(省略可)を渡して、リクエストをポンポン発行する
  5. コールバックを登録していれば、そこから Response オブジェクトを受け取る
  6. Response オブジェクトのイベントにリスナーとか登録してごにょごにょ

という感じです。
まぁ、実際のコードを見たほうがわかりやすいだろう、ということでこんな感じです。

var oauth = require('oauth-revenge');

var consumer = {
  key: 'YOUR CONSUMER KEY'
, secret: 'YOUR CONSUMER SECRET'
};

var token = {
  token: 'YOUR ACCESS/REQUEST TOKEN'
, tokenSecret: 'YOUR ACCESS/REQUEST TOKEN'
};

var signer = oauth.createHmac(consumer, token);
var client = oauth.createClinet(signer);

var url = 'https://api.twitter.com/1/statuses/update.json';
var query = {
  status: 'posting my status from oauth-revenge!'
};

client.POST(url, query, function (res) {
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
    console.log(chunk);
  });
  res.on('end', function () {
    console.log('<<END>>');
  });
});

var filterUrl = 'https://stream.twitter.com/1/statuses/filter.json';

var trackQuery = {
  track: '#nodejs'    
};

client.POST(filterUrl, trackQuery, function (res) {
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
    var data = JSON.parse(chunk);
    console.log(data.text);
  });
});

なんの変哲もないリクエストを投げるコードです(リポジトリの README からコピペ)。
注目して欲しいのは、普通にストリームを扱えちゃったり、HTTPS を扱えちゃったり、んでもってどこかで見たことがある感じの API だってことですね。
もう両手に収まらないほどのコンストラクタ引数を覚える必要はなく、なんかそれとなく OAuth で通信できちゃうわけです。
client も使いまわせるので、適当にとっておけば request はバシバシ飛ばせます。

とまぁ

荒っぽい説明でしたが、みんな UserStream とか使ってサービス作りたいよね? って話でした。
自分は既にこのモジュールを使って、UserStream のデータを全部 CouchDB に突っ込んでます。(id:yssk22 さんも似たようなことやってたな……)
github も OAuth 使ってるし、なんかおもしろいことできるんじゃないかなぁ(あれ、2.0だっけ)。