読者です 読者をやめる 読者になる 読者になる

英語をつぶやくTwitter botをNode.jsで作ってみた。

Twitter node.js English MongoDB

英語をつぶやくTwitter botをNode.jsで作ってみました。
1日に1回、ランダムで英語の文をつぶやくようにしています。
Twitter

下記のサイトから英語の文を追加すること、つぶやくことの一覧を見ることが可能です。
この英語は役に立つと思ったら追加してください。wisdom of crowdを持つ英語botができると理想です。
English Tweet Bot
※まだ未実装なeditボタンやdeleteボタンは動作しないと思います。(^^;)

Heroku上のcronを利用して、定期的にNode.jsのコードが実行されるようになっています。
※herokuのcronは1日1回であれば、無料ですが、1日に複数回実行させようとすると有料です。
まだ英文は少ないので、ひとまず1日1回にしています。将来的には1時間ごとなども考えていきます。

今回もコードと手順を公開していきます。

herokuにcronをaddするのは下記のコマンドで実行します。

$ heroku addons:add cron:daily

heroku内でcronを利用するなら、Rakefileがフォルダ直下に必要です。
Rakefileは下記のように記載します。

task :cron do
  sh "node twitter_bot.js"
end

sh "node twitter_bot.js"の部分は自分の実行させたいコードに置き換えてください。

本処理の説明に移る前に今回利用しているnpmパッケージを説明します。
下記のパッケージが必要です。
・twitter - node.jsからtweetするためのライブラリ、たくさんあるが、一番簡単そうなので。
・mongoose - 言わずと知れたmongodb用ライブラリ。自分のアプリはmongodb内に英文があるので。

package.jsonファイルは下記のとおりです。

{
  "name": "english_tweet_bot",
  "version": "0.0.1",
  "dependencies": {
    "mongoose": ">=1.8.1",
    "twitter": ">=0.1.17"
  }
}

本処理は下記のような感じで実行しています。
1. データベース全体を取得。
2. その中からランダムに一つの文を選択。
3. Twitterのステータスをアップデート。
特に特別なことはしていませんね。


twitter_bot.js

var sys = require('sys');
var twitter = require('twitter');
var mongoose = require('mongoose');

// Twitter KEY
var CONSUMER_KEY = 'XXXXXXXXXXXXXX';
var CONSUMER_SECRET = 'XXXXXXXXXXXXXX';
var ACCESS_TOKEN_KEY = 'XXXXXXXXXXXXXX';
var ACCESS_TOKEN_SECRET = 'XXXXXXXXXXXXXX';
var TIME = 60 * 60 * 1000; // 1hour

var NUM_OF_TWEETS = 1;

var Schema = mongoose.Schema;

//DB Schema, body = message本体、 commentBy = コメントした人、 date = コメントした日付
var commentSchema = new Schema({
    body :String,
    commentBy :String,
    date    :Date
});

var mongoUri = process.env.MONGOHQ_URL || 'mongodb://localhost/english_tweet';
mongoose.connect(mongoUri);
console.log(mongoUri);
mongoose.model('Comment', commentSchema);
var Comment = mongoose.model('Comment');

var twit = new twitter({
    consumer_key: CONSUMER_KEY,
    consumer_secret: CONSUMER_SECRET,
    access_token_key: ACCESS_TOKEN_KEY,
    access_token_secret: ACCESS_TOKEN_SECRET
});

Comment.find(function(err, docs) {
        
    if (!err) {
        var index = Math.floor(Math.random()*docs.length);
        var count = 0;
        while (1) {
        var message = docs[index].body + ' by @' + docs[index].commentBy;
        twit.updateStatus(message,
        function (data) {
            sys.puts(sys.inspect(data));
        });
        count++;
        if (count == NUM_OF_TWEETS) {
            break;
        }
        sleep(TIME);
        }
        mongoose.disconnect();
    }
});

//sleep処理
function sleep(millisec){
    var d1 = new Date().getTime();
    var d2 = new Date().getTime();
    while( d2 < d1 + millisec ){
        d2=new Date().getTime();
    }
    return;
}

If you are interested in English, please follow him!
Twitter

and please add your interesting English sentences!
English Tweet Bot