Node.jsでTwitter API v1.1 を叩くには?
Node.jsで、TwitterのAPIを叩こうと思ったら、結構苦労した。
まだ、納得できる解決策にたどり着いていない。
環境
node v0.10.24
2014年1月31日
Twitter API v1.1とは
2013年6月末に、Twitter APIがv1.0からv1.1に変更された。
Node.jsのTwitterモジュールはいくつかあるんだけど、ソースコードを見ると、いくつかのメソッド(あるいは大部分)がv1.1に未対応だったりして、完全にv1.1に対応しているモジュールを探すのに苦労している。
今回実験したのは、ntwitterとnode-twitterの2つのモジュールが中心だが、どちらもv1.1に完全には対応していない様子。他のモジュールも、ソースコードを見る限り、怪しいか対して便利じゃない。
たどり着いた暫定的な方法
まず結論。
npm install twitter
がとりあえず結果が帰ってきた。
などのAPIv1.1に関するドキュメントを見ながら、
var util = require('util'), twitter = require('twitter'); var twit = new twitter({ consumer_key: 'xxx', consumer_secret: 'xxx', access_token_key: 'xxx', access_token_secret: 'xxx' }); twit.get('/search/tweets.json', {"q":"#Node"}, function(data) { console.log(data);
のように、地道にエンドポイントとオプションを指定してツイートを取得。
// twitterモジュールでは一応動く twit.search('nodejs OR #node', function(data) { console.log(data); });
のような便利な関数は、動かない場合が多い。
以下、具体的に自分が試したこと。
ntwitter
Node.jsでのTwitterモジュールとして、一番人気のよう。
https://nodejsmodules.org/tags/twitter
versionは0.5.0で試した。
Streaming APIは大丈夫
技術ブログなどでも、ntwitterを使った記事は多くて、たとえば以下の記事では、Socket.ioとexpress、ntwitterを使って、TwitterのStreaming APIからキーワードにマッチするツイートをリアルタイムで表示するWebアプリを作れる。
node.js + socket.ioでTwitterのStreaming APIを使ってみる - 大人になったら肺呼吸
ntwitterは、Streaming APIを利用するぶんには問題なくて、上記のWebアプリもちゃんと動かすことができた。
REST APIはだめ
AvianFlu/ntwitter · GitHub
ntwitterのgithubのページでは、以下の様なコードが紹介されている。
twit.search('nodejs OR #node', {}, function(err, data) { console.log(data); });
しかし、このコードだとエラーが返される。
原因は、v1.1への以降による、searchのエンドポイント変更に未対応だから。
Githubでlib/keys.jsのソースを見ると、using1.1とは書いてあるのだが、search_baseで廃止されたエンドポイントにアクセスしている。
GET search | Twitter Developers
v1では、http://search.twitter.com
v1.1では、https://api.twitter.com/1.1/search/tweets.json
node-twitter
twitter-nodeやnode-twitterがあって紛らわしいんだけど、とにかく
npm install twitter
でインストールできるやつ。
Githubは
desmondmorris/node-twitter · GitHub
こっちだと、
twit.search('nodejs OR #node', {}, function(err, data) { console.log(data); });
でちゃんと結果が帰ってきた。
しかし、用意されているメソッドでも、以下は結果が帰ってこない。
twit.getMentions(function(data) { console.log(data); });
結局、用意されている便利な関数には頼らないで、リファレンスを見ながら以下のようにAPIを叩くのが良さげ。
var util = require('util'), twitter = require('twitter'); var twit = new twitter({ consumer_key: 'xxx', consumer_secret: 'xxx', access_token_key: 'xxx', access_token_secret: 'xxx' }); //キーワードで検索 twit.get('/search/tweets.json', {"q":"#Node"}, function(data) { console.log(data); }); //自分のツイート最新20件 twit.get('/statuses/user_timeline.json', {include_entities:true}, function(data) { console.log(util.inspect(data)); }); //タイムライン最新20件 twit.get('/statuses/home_timeline.json', {include_entities:true}, function(data) { console.log(util.inspect(data)); }); //フォローしている人 twit.get('/friends/list.json', {include_entities:true}, function(data) { console.log(util.inspect(data)); }); //キーワード検索 twit.get('/search/tweets.json', {"q":"#Node"}, function(data) { console.log(util.inspect(data)); });