こんにちはこんにちは!
初投稿です。よろしくお願いします。
さて、みなさんはツイ廃ですか?僕はツイ廃です。
タイムラインに流れるツイートを誰よりも早くふぁぼりたいと思ったことはありませんか?
好きなアーティストや好きなアイドル、果ては恋人まで、最初にふぁぼしたいですよね。
そこで、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 のインストール
については省略します。
インストールするだけですのでry
npm install twitter -g
とかでいけるはず。
参考 : https://www.npmjs.com/package/twitter
ソース
※このソースの場合はRTと自分のツイート以外のTL上のすべてのツイートをふぁぼります。
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')
等
で受け取る必要があります。
つい消しの検知
上記を踏まえて、つい消し等の検知を実装すると、下記のようになります。
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全部のふぁぼは難しいかなと思います。
また、プログラミングに馴染みのない人に対して使うと気味悪がられると思います。
自 己 責 任でお願いします!