node.jsのtwitterモジュールを使ってみた作業メモ (2)

**注意:** ここは作業メモ、大した情報は無いですょ。

* [前回:node.jsのtwitterモジュールを使ってみた作業メモ (1)](http://qiita.com/rarewin/items/d38ba161864107f94f7d)

## 他にも色々とためす

前回、

```js
var twitter = require('twitter');

var client = new twitter({
    consumer_key:        '取得したconsumer key',
    consumer_secret:     '取得したconsumer secret',
    access_token_key:    '取得したtoken key',
    access_token_secret: '取得したtoken secret',
});
```

というコードを用意したので、その後に色々と追加して試してみます。

### ツイートする

```js
client.post('statuses/update',
	    {status: 'Hello world (このツイートはテストです)'},
	    function(error, tweet, response) {
		if (!error) {
		    console.log(tweet)
		}
	    })
```

これを実行しても、jsonでなんかベロベロと吐きだしますね。
まぁ、それはさておき、無事にツイートされている事を確認。

REST APIのマニュアルは [ここ](https://dev.twitter.com/rest/reference/post/statuses/update) で。

なお、直後にフォロワーから core dumped とか返信されました。
やはり、テストは、てけとーなアカウントでした方がよろしいか……。

### Streaming APIもためす

REST APIだけでなく、Streaming APIというのもあるんですね。
ひとまず、以下のようなコードを記述。

```js
client.stream('statuses/filter',
	      {track: 'Node.js'},
	      function(stream) {

		  stream.on('data', function(tweet) {
		      console.log(tweet.text);
		  });

		  stream.on('error', function(error) {
		      console.log(error);
		  });
	      }
	     );
```

で、実行すると以下のように、Node.jsという文字列が含まれるツイートを表示していくようで。
Ctrl+cを押すまで実行止まらず。

    $ nodejs ./twitter-test/twitter-test.js 
    .@clevertech is looking for remote Driven JavaScript / Node.js Developer #nodejs #js #senior #support 📣 https://t.co/d3Laulx8Au
    .@clevertech is looking for remote Driven JavaScript / Node.js Developer #nodejs #js #senior #support 📣 https://t.co/hx0x8RdgZz
    Node.js vs Angular.js https://t.co/2EQnrGsC6X
    That's certainly handy for us @nodejs folks https://t.co/O1FDCKvLTH
    @Ingcarlosreina Hola Carlos, adjunto el error al querer instalar Gulp en consola CMD. instalé Node.js en Windows 8.1 https://t.co/b9UQgyaGgD
    Refactoring a node.js application on a Friday afternoon. What could possibly go wrong?
    RT @d3viant0ne: That's certainly handy for us @nodejs folks https://t.co/O1FDCKvLTH
    RT @swissspidy: Refactoring a node.js application on a Friday afternoon. What could possibly go wrong?

そもそもStreaming APIとはなんぞや、REST APIと何が違うんだって件に関しては、
[Streaming APIのマニュアル][Streaming-API-manual]に書いてあるようで。
要は、REST APIはユーザのリクエストに逐一返事をするけど、
Streaming APIだとずっとコネクション貼ったまんまで結果を垂れ流すって感じでしょうか?

## Socket.ioと組み合わせてみる

せっかくなので、Streaming APIで取得したデータを、
Socket.ioを使って動的に表示させてみました。
以下、コード。

```js:twitter-test.js
var http = require('http');
var socketio = require('socket.io');
var twitter = require('twitter');
var fs = require('fs');

var twitter_client = new twitter({
    consumer_key:        '取得したconsumer key',
    consumer_secret:     '取得したconsumer secret',
    access_token_key:    '取得したtoken key',
    access_token_secret: '取得したtoken secret',
});

var http_server = new http.createServer(function(req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end(fs.readFileSync('./index.html', 'utf-8'));
}).listen(13000);

var sio = socketio.listen(http_server);

sio.sockets.on('connection', function (socket) {

})

twitter_client.stream('statuses/filter',

		      {track: 'linux'},

		      function(stream) {

			  stream.on('data', function(tweet) {
			      sio.sockets.emit('twitter_message', {'name': tweet.user.name, 'text': tweet.text})
			      console.log(tweet.user.name);
			      console.log(tweet.text);
			      console.log();
			  });

			  stream.on('error', function(error) {
			      console.log(error);
			  });
		      });
```

index.htmlも以下のように用意しました。
コードはかなり適当で、bootstrapも使いかたよくわからずに使っております。

```html:index.html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">

    <head>

	<title>Twitter test</title>

	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">

	<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
	<script type="text/javascript" src="/socket.io/socket.io.js"></script>

    </head>

    <body>

	<h1>Twitter test</h1>

	<hr />

	<div class="container">
          <div class="row">
            <div id="messageView">
	    </div>
          </div>
	</div>

	<script type="text/javascript">

	 var ioSocket = io.connect("http://localhost:13000");

	 ioSocket.on("disconnect", function() {});

	 ioSocket.on("twitter_message", function(data) {
	     appendMessage(data.name, data.text)
	 });

	 function appendMessage(name, text) {
	    $("#messageView").append(
              "<div class=\"panel panel-default\">" +
	        "<div class=\"panel-heading\">" +
	          "<h3 class=\"panel-title\">" + name + "</h3>" +
	        "</div>" +
                "<div class=\"panel-body\">" +
                  text +
	        "</div>" +
	      "</div>");
	 }

	</script>

    </body>

</html>
```

twitter-test.jsを実行した後、ブラウザで http://localhost:13000/ にアクセスすると、
以下のような画面で、次々とツイートが表示されていきました。
どうやら成功のようです。
無駄なコードやら、かなり筋の悪い事やってそうな気もするのですが、その辺りは追い追い馴れてく感じで。

![twitter-test.jsの実行結果](https://qiita-image-store.s3.amazonaws.com/0/122416/901764d1-93c5-d1e5-c455-7db1181fc5f9.png)

と、ここまでやってみて、ほとんど同じような事をずいぶんと前にされてる先人がいらっしゃいました。
やはり、考えることはみんな一緒か……。
<[Node.js + Socket.io + StreamingAPIでツイートを取得してWebサイトにリアルタイム描画する][streming-twitter]>

## 参考

* [Twitter API client library for node.js][Twitter-nodejs]
* [REST APIs reference][REST-API-manual]
* [Streaming APIs reference][Streaming-API-manual]
* [チャットを作りながら学ぶSocket.IO][chat_sock.io]
* [Node.js + Socket.io + StreamingAPIでツイートを取得してWebサイトにリアルタイム描画する][streming-twitter]

[Twitter-nodejs]:https://www.npmjs.com/package/twitter
[Twitter-API-matome]:https://syncer.jp/twitter-api-matome
[REST-API-manual]:https://dev.twitter.com/rest/public
[Streaming-API-manual]:https://dev.twitter.com/streaming/overview
[chat_sock.io]:http://engineer.recruit-lifestyle.co.jp/techblog/2015-07-29-node4/
[streming-twitter]:http://qiita.com/n0bisuke/items/327e10da3eac09dd6985