node.js で社会性フィルター


はじめまして

@albno273 と申します。
以前からはてなブログの方でちょっとした備忘録を日記と混ぜて投稿していたのですが、今後は Qiita に備忘録、はてなブログに日記を書くことにしました。
ウケがよかったものについてはブログからこちらに移植しようと考えています。
ちなみに Twitter もあります。
よろしくお願いします。

社会性フィルター

Qiita で最初の記事を書くにあたってネタを探していたところ、
【にゃーん】社会性フィルターをPython3で実装する / Qiita
というのがあり、ついでに今自分が置かれている状況が死ぬほどつらいので写経代わりに node.js で作ってみました。

つくった

ソース: GitHub
follow: --- は適宜自分の ID に書き換えてください。

var twitter = require('twitter');
var confu = require('confu');

var conf = confu('.', 'config', 'key.json');
var client = new twitter({
    consumer_key: conf.test.cons_key,
    consumer_secret: conf.test.cons_sec,
    access_token_key: conf.test.acc_token,
    access_token_secret: conf.test.acc_token_sec
});

var filter = ['つらい', '死にたい', '死ね', '殺す', '疲れた'];
var count = 1;

console.log('Sociality filter activated.');
client.stream('statuses/filter', { follow: --- }, function (stream) {

    stream.on('data', function (tweet) {
        var text = tweet.text;
        var id = tweet.id_str;
        var i = filter.length;

        while (i--) {
            if (text.indexOf(filter[i]) !== -1) {

                console.log('Negative word(s) detected!')
                console.log('catch: ' + filter[i]);
                setTimeout(function () {
                    client.post('statuses/destroy/' + id, function (err, rep) {
                        if (!err) {
                            console.log('Delete succeeded.');
                            setTimeout(function () {
                                var tweet_body = 'にゃーん (通算' + count + '回目)';
                                client.post('statuses/update',
                                    { status: tweet_body },
                                    function (err, rep) {
                                        if (!err) {
                                            console.log('Tweet succeeded. Meow!');
                                            count++;
                                        } else {
                                            console.log('Tweet failed...');
                                            console.log(err);
                                        }
                                    });
                            }, 1000);
                        } else {
                            console.log('Delete failed...');
                            console.log(err);
                        }
                    });
                }, 1000);

                break;
            }
        }
    });

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

});

ネストが綺麗ですね(すっとぼけ)。

実行してみる

考察

  • 企業の人事に見られても恥ずかしくない Twitter が実現
  • フィルタリングする語句をどのように選ぶか考える必要がある
    • ひたすらデータベースを増やしていく
    • ネガポジ判定
    • みんなから募るとか

感想

にゃーん(早く合否知らせてくれ)