凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

20 行で作る node.js による Twitter bot 作成講座

はじめに

あんまり見当たらなかったので node.js での Twitter bot 制作について解説してみます。つぶやきを受け取ってそれをそのままオウム返しするところまで 20 行くらいで実現できます。User Stream でつなぐので cron で回す必要も無いです。

(追記: 2013/03/23)
TwitterAPI 1.1 化に伴い、以下のエントリを参考に twitter モジュールの代わりに mtwitter モジュールを使ってみてください:

(追記: 2014/04/30)
元の twitter モジュールでも対応されているので問題なく動きます。

下準備

Twitter のアカウントへ接続するために、Consumer Key と Access Token を取得します。

などを参考にして Consumer Key / Consumer Secret / Access Token / Access Token Secret の4つの文字列を取得して下さい。

Hello, world をつぶやかせてみる

まずは適当に Twitter につぶやくところを作ってみます。Twitter への接続には node-twitter という便利な node モジュールを使うと便利です。

次のように npm でサクッと落としてきます。

$ npm install twitter

そして、Hello, world とつぶやくコードを書いてみます。

bot.js
var twitter = require('twitter');

var bot = new twitter({
	consumer_key        : 'xxxxxxxxxx',
	consumer_secret     : 'xxxxxxxxxx',
	access_token_key    : 'xxxxxxxxxx',
	access_token_secret : 'xxxxxxxxxx'
});

bot.updateStatus('Hello, world!', function (data) {
	console.log(data);
});

xxxxxxxxxxx のところには先ほど取得したキー達を入れて下さい。

$ node bot

これで「Hello, world!」とつぶやきます。

User Stream への接続とオウム返し部分

を実装すればボットとして完成です。

var twitter = require('twitter');
const BOT_ID = 'MY_BOT_ID';

var bot = new twitter({
	consumer_key        : 'xxxxxxxxxx',
	consumer_secret     : 'xxxxxxxxxx',
	access_token_key    : 'xxxxxxxxxx',
	access_token_secret : 'xxxxxxxxxx'
});

bot.stream('user', function(stream) {
	stream.on('data', function(data) {
		var id        = ('user' in data && 'screen_name' in data.user) ? data.user.screen_name : null;
		var text      = ('text' in data) ? data.text.replace(new RegExp('^@' + BOT_ID + ' '), '') : '';
		var ifMention = ('in_reply_to_user_id' in data) ? (data.in_reply_to_user_id !== null) : false;

		if (!ifMention || id == BOT_ID) return;
		var msg = '@' + id + ' ' + text;
		bot.updateStatus(msg , function (data) {
			console.log(data);
		});
	});
});

MY_BOT_ID には自分の bot の ID を入れて下さい。
stream を 'user' を引数にとって呼び出すと User Stream に接続し、更新があると stream.on で登録したコールバックが呼ばれます。その際の引数 data に Twitter から降ってきた JSON(を Object に落とし込んだもの)が入っているので、mention かどうかといったことや、やってきたツイートが自分のつぶやきではないか等をチェックして、「updateStatus で@を飛ばしてきた id + @MY_BOT_ID を差し引いたメンション」を呟いてやればオウム返しボットの完成です。
改行やら考えなければ大体 20 行くらいです。

おわりに

つぶやきを取得した後は MongoDB に突っ込んでほげほげしたり C++ で作った node モジュールを経由させてふがふがしてあげたりすれば面白いボットが大量生産できそうです。