barutanGNE's blog

kindleで読んだ本の感想や、プログラミングに関する記事など。

Node.jsでTwitter API v1.1 を叩くには?

Node.jsで、TwitterAPIを叩こうと思ったら、結構苦労した。
まだ、納得できる解決策にたどり着いていない。

環境

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に完全には対応していない様子。他のモジュールも、ソースコードを見る限り、怪しいか対して便利じゃない。

たどり着いた暫定的な方法

まず結論。

  1. Streaming APIを使う分には、大抵どのモジュールでも問題ない。
  2. REST APIを使うときには、モジュールは
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));
});