英語をつぶやくTwitter botをNode.jsで作ってみた。
英語をつぶやく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