小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


node.js + socket.ioでTwitterのStreaming APIを使ってみる

2013.06.09追記

最新版で動作するよう、記事を修正しました。

はじめに

node.js + socket.ioでTwitterが提供するStreaming APIを使ってみました。今回作ったサンプルアプリケーションは、Streaming APIで指定されたキーワードにマッチするツイートを拾って、画面に表示させるものです。
この記事を書くにあたり、以下のブログを参考にさせていただきました。

サーバサイドJavaScript Node.js入門
清水俊博 大津繁樹 Jxck 小林秀和 佐々木庸平 篠崎祐輔 高木敦也 西山雄也
アスキー・メディアワークス
売り上げランキング: 177,797

ソフトウェアのバージョン
  • Mac OS X Mountain Lion 10.8.3
  • node.js v0.10.8
  • npm@1.2.23
  • express@3.2.5
  • socket.io@0.9.14
  • ntwitter@0.5.0
必要なもの

Twitterの開発者向けアカウント。以下のサイトで取得することができます。

サンプルプログラムの作成

1.はじめに、expressコマンドで、SampleAppという名前のサンプルアプリケーションを作成します。

express -e SampleApp

2.カレントディレクトリを移動しつつ、必要なライブラリをインストールします。

cd SampleApp && npm install

3.socket.ioをインストールします。

npm install socket.io

4.node.jsからTwitter Streaming APIを使うにはntwitterが便利です。今回はntwitterを使ってつくります。

ntwitterをインストールします。

npm install ntwitter

5.app.jsを編集します。
このとき、dev.twitter.comで取得したカスタマーキーやアクセストークンキーを指定する必要があります。

var twitter = new twitter({
  consumer_key: 'xxx',
  consumer_secret: 'xxx',
  access_token_key: 'xxx',
  access_token_secret: 'xxx'
});

以下のコードをコピーペーストして、app.jsに上書きします。

/**
 * Module dependencies.
 */

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path');

var app = express();

// add start
var twitter = require('ntwitter');
var io = require('socket.io').listen(app);
// Twitter APIを使うためのおまじない
var twitter = new twitter({
  consumer_key: 'xxx',
  consumer_secret: 'xxx',
  access_token_key: 'xxx',
  access_token_secret: 'xxx'
});
// add end

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

// del start
//app.get('/', routes.index);
// del end
app.get('/users', user.list);

// update start
//http.createServer(app).listen(app.get('port'), function(){
var server = http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});
// update end

// add start
var io = require('socket.io').listen(server);
var keyword = "AKB48";
app.get('/', function(req, res){
  // リクエストからキーワードを取得する
  if (req.query.keyword) {
    keyword = req.query.keyword;
  }
  res.render('index', {
    keyword: keyword
  });
  
  // Twitter Streaming APIを呼び出す
  twitter.stream('statuses/filter', {'track': keyword},function(stream) {
    stream.on('data', function (data) {
      io.sockets.emit('message',data.text);
    });
    stream.on('end', function (response) {
      // 切断された場合の処理
    });
    stream.on('destroy', function (response) {
      // 接続が破棄された場合の処理
    });
  });
});
// add end

6.viewsディレクトリのindex.ejsを編集します。
以下のコードをコピーして、index.ejsに上書きします。

<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Twitter × Node.js feat. socket.io</title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    <script src="/socket.io/socket.io.js"></script>
    <script>
      var socket = io.connect('http://localhost:3000');
      socket.on('message', function(t){
        $('<div></div>')
          .html('<li>' + t + '</li>')
          .prependTo('#tweets');
      });
    </script>
  </head>
  <body>
    <h1>Twitter × Node.js feat. socket.io</h1>
    <form id="frm" name="frm" method="GET" action="/">
    <input type="text" id="keyword" name="keyword" value="<%=keyword %>">
    に関する<input type="submit" id="search" name="search" value="ツイートを眺める">
    </form>
    <ul>
    <div id="tweets"></div>
    </ul>
  </body>
</html>

7.public/stylesheetsディレクトリのstyle.cssを編集します。
以下のコードをコピーして、style.cssに上書きします。

body {
  padding: 50px;
  font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
}

a {
  color: #00B7FF;
}

li {
  padding: 5px;
  margin-bottom: 7px;
  color: #FFF;
  background-color: #0593e2;
  border-radius: 5px;
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;
}
サンプルプログラムを動かす

1.nodeコマンドでサンプルプログラムを起動します。

node app.js

2.http://localhost:3000にアクセスします。テキストボックスに検索キーワードを入力してしばらく待つと、ヒットしたツイート次々と表示されます。

おわりに

Twitter Streaming APIはおもしろそうです。キーワード次第で地域ごとの天気だったり、列車の遅延状況を知らせるアプリケーションが簡単に作れてそうですね。