LoginSignup
7
8

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-04-07

こんにちはこんにちは!

初投稿です。よろしくお願いします。
さて、みなさんはツイ廃ですか?僕はツイ廃です。
タイムラインに流れるツイートを誰よりも早くふぁぼりたいと思ったことはありませんか?
好きなアーティストや好きなアイドル、果ては恋人まで、最初にふぁぼしたいですよね。
そこで、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_keyconsumer_secretaccess_token_keyaccess_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上のすべてのツイートをふぁぼります。

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全部のふぁぼは難しいかなと思います。
また、プログラミングに馴染みのない人に対して使うと気味悪がられると思います。
自 己 責 任でお願いします!

7
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8