誰よりも早くあの子のツイートを自動でふぁぼる (つい消しもあるよ)

こんにちはこんにちは！  

初投稿です。よろしくお願いします。
さて、みなさんはツイ廃ですか？僕はツイ廃です。
タイムラインに流れるツイートを誰よりも早くふぁぼりたいと思ったことはありませんか？ 
好きなアーティストや好きなアイドル、果ては恋人まで、最初にふぁぼしたいですよね。
そこで、TwitterのStreaming APIとnode.jsをつかって、誰よりも早くふぁぼってみたいと思います。

*Special Thanks* (ほぼ下記の内容に沿って解説します。) 
 http://wikiwiki.jp/matcha-memo/?Node.js%2Ftwitter%20bot
## 用意するもの
* Linux機 または Mac または Bash on Ubuntu on Windows の使えるWin機  
* 	Twitterの`consumer_key` 、`consumer_secret`、`access_token_key `、`access_token_secret `

取得方法:http://hello-apis.blogspot.jp/2013/03/twitterapi.html

## node.jsのインストール  
については省略します。
インストールするだけですので簡単です。
`sudo apt-get install nodejs npm`
とかでいけるはず。
## node-twitter のインストール  
については省略します。
インストールするだけですのでｒｙ
`npm install twitter -g`
とかでいけるはず。
参考 : https://www.npmjs.com/package/twitter

## ソース
※このソースの場合はRTと自分のツイート以外のTL上のすべてのツイートをふぁぼります。

```favTwitter.js
var Twitter = require('twitter');
 
var client = new Twitter({ // Twitterオブジェクトの作成
	consumer_key: '取得したキー',
	consumer_secret: '取得したキー',
	access_token_key: '取得したキー',
	access_token_secret: '取得したキー'
});

function streamOn(){ // Streamingの開始と受取
	client.stream('user', function(stream)  {
		stream.on('data', function(tweet)  { // RTと自分のツイートは除外
			// 特定の人をふぁぼるなら if(!tweet.retweeted_status && tweet.user.screen_name == "realDonaldTrump") とか
			if(!tweet.retweeted_status && tweet.user.screen_name != '自分のtwitter ID') {
				createFav(tweet.id_str);
			}
		});

		stream.on('end', function(tweet) {  // 接続が切れた際の再接続
			stream.destroy();
			setTimeout(function() {
				streamOn
			}, 1000);
		});
	});
}

function createFav(tweetId) { // ふぁぼる！
	client.post("favorites/create",{"id" : tweetId});
}

streamOn();  

```
# 実行
`nodejs favTwitter.js` で実行します。  
foreverを導入して永続化したり、Herokuにデプロイしたり、ラズパイで動かしたり、あとはお好きなように。
注意点としてはStreaming APIはネットワークの安定した場所で実行しないと接続が重複してエラーを起こしたりします。
(僕はBash on Ubuntu on Windows上で実行しています。)

## 解説
ほぼ最初のURLの記事の内容と同じですが、若干仕様が異なっているので、そこについて説明します。

node-twitterについて、ネット上では古い実装の記載が多く、最初に記載したURLの通りに実装しても多分詰みます。
いつごろからか仕様がかわったようです。  
具体的には下記の点が異なっています。(参考:https://github.com/desmondmorris/node-twitter)  

* *Twitterの createFavorite といったfunctionがなくなっている*
現在の仕様では、TwitterのAPI上のPATHを指定するように変更されています。
(ふぁぼる場合には `favorites/create`、ツイートする場合には`statuses/update` といった具合です。)

* *`stream.on("data")`で流れてくる情報が少なくなっている*
 おそらく以前の仕様では `stream.on("date")` でツイ消しやふぁぼられといった情報が流れていたんだと思います。
 しかし、現在ではparserが実装されており、
 `stream.on('event')`、`stream.on('delete')`、`stream.on('friends')`等
 で受け取る必要があります。

# つい消しの検知
上記を踏まえて、つい消し等の検知を実装すると、下記のようになります。

```streamTwitter.js
var Twitter = require('twitter');
 
var client = new Twitter({ // Twitterオブジェクトの作成
	consumer_key: '取得したキー',
	consumer_secret: '取得したキー',
	access_token_key: '取得したキー',
	access_token_secret: '取得したキー'
});

function streamOn(){ // Streamingの開始と受取
	client.stream('user', function(stream)  {
		
		stream.on('friends', function(tweet) {  // 接続開始時にはフォロワー情報が流れます
			console.log(JSON.stringify(tweet));
		});
		
		stream.on('data', function(tweet) { // RTと自分のツイートは除外
			if(!tweet.retweeted_status && tweet.user.screen_name != '自分のツイートID') {
				createFav(tweet.id_str);
			}
			console.log(JSON.stringify(tweet))
		});
		
		stream.on('delete', function(tweet) {  // つい消しの場合
			console.log(JSON.stringify(tweet));
		});
		
		stream.on('event', function(tweet) {  // 位置情報の削除やふぁぼられといったeventはここに流れます
			console.log(JSON.stringify(tweet));
		});
		
		stream.on('error', function(tweet) {  // エラー時は再接続を試みた方がいいかもしれません(未検証)
			stream.destroy();
			setTimeout(function() {
				streamOn
			}, 1000);
		});

		stream.on('end', function(tweet) {  // 接続が切れた際の再接続
			stream.destroy();
			setTimeout(function() {
				streamOn
			}, 1000);
		});
	});
}

function createFav(tweetId) { // ふぁぼる！
	client.post("favorites/create",{"id" : tweetId});
}

streamOn();  

```

上記の例ではすべて標準出力で表示していますが、たとえば `console.log(JSON.stringify(tweet))` のかわりに

```
var fs = require('fs');
fs.appendFile("tweet.log", JSON.stringify(tweet) + "\r\n", "utf8", funciton(errorLog){
	console.log(errorLog);
})
```

とすれば、ログ出力できるのであとから見返すこともできます  
(ツイートの後に改行コードを入れているのは、mongoDBへのインポートを簡単にするためです)
参考 : http://d.hatena.ne.jp/m-hiyama/20130913/1379036064

##最後に  
Streamに接続してふぁぼる程度であれば、30行でできるのでnode.jsはお手軽でよいですね。
現在も動かしていますがふぁぼもAPIの制限(15分)がありますので、フォロワーの多い方はなにかしら制御がないとTL全部のふぁぼは難しいかなと思います。
また、プログラミングに馴染みのない人に対して使うと気味悪がられると思います。
自 己 責 任でお願いします！