Monthly Archives: 6月 2015

Node.jsでのTwitterタイムライン取得方法

お久しぶりです。
リプレーションのインフラ担当SE、utunです。
この間のAWS Summit 2015、登壇して参りました!

という事で、若干の余裕ができた(勝手に余裕できたと思っている・・・っ!)ので
久しぶりにブログ更新するよ!

本当ならsummitで話した「GRASSLAND」の話をするべき所なんだけど、纏めているとちょっと時間がかかるので、普段使っているNode.jsのちょっとした小技(?)的なものを紹介しようと思います。

Node.jsとは

皆大好きNode.js!
ここのページを見てる人には別に説明なんて必要ないよね!
というか、説明すると長くなるし、詳細知りたい人は検索した方がここよりも詳しい説明あるんで省略。
簡単に言うと、サーバサイドのJavascriptです。

Twitter API 1.1

Twitterいいよね。
お知らせとかTwitterで出来ると、Webシステムの一部機能を丸投げできる。
って事で、結構皆そうしていると思うんだけど、APIが1.1になってからサーバサイドで取ってね!という仕様に・・・。
別にそれ自体はいいんだけど、サーバ側から取るとリクエスト制限引っかかるんじゃね?という疑問があるんだ。
これをどうやって解決するのかというと、普通にキャッシュすればいい。
せっかくNode.jsを使うんであれば、もうTwitter用のクラス作ってしまえば簡単だよね!

ちなみに、今回は単純に自分のTwitterアカウントのタイムラインを取得する部分だけなのであしからず!

requestモジュール

さて、まずはTwitterのAPIをどうやって叩くかという話がある。
これはrequestモジュールを使う事で簡単にできるんだ。
前に自前であれこれ書いてたら超絶面倒だったので、是非こういったライブラリを使う事をお勧めします!
普通にTwitter API用のサンプル書いてあるんで、これ見れば十分かも・・・。
という気もするけど、一応次へ!

Twitterをクラス化して定期取得!

ここで本題。
誰が書いても大差無いと思うんで、サンプルを丸ごとどうぞ!

// 超便利なHTTPリクエスト系ライブラリ
var request = require('request');

// クラス定義
var TwitterObject = function(_cb){
	// インスタンス生成直後にデータ取得したい場合はこのコールバックで!
    var callback = _cb === undefined ? function(){} : _cb;

	// user_timeline取得用URL。オプションはお好みで!
	this.url = 'https://api.twitter.com/1.1/statuses/user_timeline.json?count=3&trim_user=1';
	// 認証用情報 「Twitter Application Management」からGetしてね!
	this.oauth = {
		consumer_key: '<Consumer key>',
	    consumer_secret: '<Consumer secret>',
	    token: '<Access token>',
	    token_secret: '<Access token secret>'
	};
	// 情報の更新間隔(ms)
	this.refreshWait = 60000;
	// ツイートのリストを格納
	this.twList = [];

	// 初回の情報取得!
	this.refresh(callback);
};
TwitterObject.prototype.run = function(){
	var self = this;
    console.log("TwitterObject: run");
	// 更新間隔をよしなにばらしながら定期実行(分散環境用です!)
	setTimeout(function(){
		self.refresh();
		self.run();
	}, (this.refreshWait / 2) + (this.refreshWait * Math.random()));
};
// Twitter APIから情報取得して自分の情報を書き換えるよ!
TwitterObject.prototype.refresh = function(_cb){
	var self = this;
    var callback = _cb === undefined ? function(){} : _cb;
	request.get({url:this.url, oauth:this.oauth, json:true}, function (e, r, user) {
		self.twList = [];
		user.forEach(function(tw){
			self.twList.push({
				created_at: tw.created_at,
				text: tw.text,
				url: 'https://twitter.com/' + self.screen_name + '/status/' + tw.id_str
			});
		});
        console.log("TwitterObject: refresh: twList: " + JSON.stringify(self.twList));
        callback(self);
	});
};
// 以下、Tweet取得用関数。適当に必要そうなものを揃えよう!
TwitterObject.prototype.get3Tweets = function(){
	return this.twList.slice(0,3);
};
TwitterObject.prototype.getAllTweets = function(){
	return this.twList;
};
TwitterObject.prototype.getEncoded3Tweets = function(){
	return encodeURIComponent(JSON.stringify(this.twList.slice(0,3)));
};
TwitterObject.prototype.getEncodedAllTweets = function(){
	return encodeURIComponent(JSON.stringify(this.twList));
};

// main処理。 ファイル分けるとかまどろっこしい事はしないぜ!
var twObj = new TwitterObject(function(two){
	var tweets3 = two.get3Tweets();
	console.log('初回の即時取得! -> ' + JSON.stringify(tweets3));
});
// 定期実行開始!
twObj.run();

蛇足

ちょっと前にオイスターバーへ行きました。
カキを頼んだらエビに睨まれたでござる。

カキ