MilkcocoaでBaaSを体験!~バックエンドの仕組みと使い方~

第5回圧倒的にリアルタイム通信が楽しくなる! Milkcocoaをサーバーサイドで使ってみよう! ~Milkcocoa Node.js SDKとTwitter APIでツイートのリアルタイム取得&保存を試す~

はじめに

前回はMilkcocoa Node.js SDKの使い所などを紹介して、実際に使用の導入部分に触れました。今回はTwitter APIにNode.jsからアクセスし、Milkcocoa Node.js SDKを用いてリアルタイム描画&保存をしてみたいと思います。

Twitter APIの利用準備

Twitter APIの使い方を説明します。ちなみに、2015年3月時点でのやり方になります。Twitter APIや開発者画面はある程度の期間が経つと更新されるので画面が同じではない場合がありますが、適宜読み取っていただければ幸いです。

Twitter APIの利用方法

ここの手順ではTwitter Botなどを作るときと同じで、

  • コンシューマーキー
  • コンシューマーシークレット
  • アクセストークン
  • アクセストークンシークレット

の4つの情報を取得します。

既にこの4つの情報を持っている方は読み飛ばしてください。

Twitterアプリケーションの作成(コンシューマーキー、コンシューマーシークレットの取得)

まず初めに、Twitterのアプリ開発者ページにアクセスします。

図1 Twitterのアプリ開発者ページ上部
図1 Twitterのアプリ開発者ページ上部
図2 Twitterのアプリ開発者ページ下部
図2 Twitterのアプリ開発者ページ下部

manage your appsから自分のアプリケーション管理画面へアクセスします。

図3 manage your apps
図3 manage your apps

Create New Appsを選択します。

図3 Create New Apps
図4 Create New Apps

以下を参考に、必要な情報を入力しましょう。

  • Application Details
    • Name:32文字以内で適当に名前をつけます。
    • Description:10文字以上200文字以内で適当に説明文を書きます。
    • Website:アプリケーションのURLになります。今回はテストアプリなので適当なURLを入力しておきましょう。
    • Callback URL:今回は使いませんので空欄のままで大丈夫です。
  • Developer Agreement:Yes, I agreeにチェックをしましょう。

Create your Twitter applicationを選択してアプリを新規作成することができます。

図5 アプリを作成したら、Keys and Access Tokensのタブを選択
図5 アプリを作成したら、Keys and Access Tokensのタブを選択

アプリを作成したら、Keys and Access Tokensのタブを選択しましょう。Consumer KeyConsumer Secretが表示されているのでメモしておきましょう。

図6 Create my access tokenというボタンを選択
図6 Create my access tokenというボタンを選択

同じ画面の下のほうに Create my access tokenというボタンがあるので選択します。

図7 Access TokenとAccess Token Secretが取得できた
図7 Access TokenとAccess Token Secretが取得できた

Access TokenAccess Token Secretが取得できました。

これで4つの情報が揃いました。

Node.js+TwitterストリーミングAPIでTweetのリアルタイム取得をしてみる

Milkcocoaとの連携を前に、Node.jsからTwitter API使ってみます。Twitterモジュールを使ってみましょう。

前回のmilkcocoaフォルダにtweet.jsを作成して試していきます。

図8 前回のmilkcocoaフォルダにtweet.jsを作成
図8 前回のmilkcocoaフォルダにtweet.jsを作成
$ npm i twitter

検索ワードを第2引数にして実行すると検索ワードを含んだTweetを取得できます。

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

var twit = new twitter({
  consumer_key: 'コンシューマーキー',
  consumer_secret: 'コンシューマーシークレット',
  access_token_key: 'アクセストークン',
  access_token_secret: 'アクセストークンシークレット'
});

var keyword = process.argv[2];
var option = {'track': keyword};
console.log(keyword+'を含むツイートを取得します。');

twit.stream('statuses/filter', option, function(stream) {
  stream.on('data', function (data) {
    console.log(data);
  });
});

実行します。

$ node tweet.js (検索ワード)
図9 実行例
図9 実行例

こんな感じでTweetが取得されれば成功です。Twitter APIを扱うことが出来ました。

Milkcocoaを使ってTweetをリアルタイムに描画してみる

ここからMilkcocoaを使い、ストリーミングAPIで取得したツイートをリアルタイムにWebページに描画させます。

構成としては前回紹介した負荷分散にMilkcocoaを利用する際の構成と同じです。

図10 負荷分散にMilkcocoaを利用する際の構成
図10 負荷分散にMilkcocoaを利用する際の構成

この図に照らし合わせると、tweet.jsがバックエンドのサーバ以下で作っていくwebsate/index.htmlはフロントエンドのWebサイトになります。

Milkcocoaのアプリ準備

第2回と同様にMilkcocoaのアプリ登録をします。今回はgihyo.jpという名前でアプリを作成しました。

図11 今回はgihyo.jpという名前でアプリを作成
図11 今回はgihyo.jpという名前でアプリを作成

このアプリIDを覚えておきましょう。

Milkcocoa Node.js SDKの準備

ここまでの手順で既に準備は出来ていると思いますが、まだの方は第4回のとおりにMilkcocoa Node.js SDKを準備しましょう。

取得したTweetをMilkcocoaに保存

先ほどのtweet.jsに前回のsample.jsの内容を追加していきます。

tweet.js
var twitter = require('twitter');
var MilkCocoa = require('./index.js'); //MilkcocoaのSDK読み込み
var milkcocoa = new MilkCocoa('https://{YOUR APP ID}.mlkcca.com');
var ds = milkcocoa.dataStore('tweet');

var twit = new twitter({
  consumer_key: 'コンシューマーキー',
  consumer_secret: 'コンシューマーシークレット',
  access_token_key: 'アクセストークン',
  access_token_secret: 'アクセストークンシークレット'
});

var keyword = process.argv[2]; //第一引数
var option = {'track': keyword};
console.log(keyword+'を含むツイートを取得します。');

twit.stream('statuses/filter', option, function(stream) {
  stream.on('data', function (data) {
    if(data.lang !== 'ja') return; //日本語のツイートだけ取得

    var tweetData = {
      tw_id: data.id_str, //ツイートのid
      userIcon: data.user.profile_image_url, //ユーザーのアイコン
      text: data.text, //ツイート本文
      screen_name: data.user.screen_name, //ユーザー名
      created_at: data.created_at //投稿時間
    };

    //tweetDataの内容をpushする
    ds.push(tweetData, function(res){
        console.log(res);
    });
  });
});

これでツイートを取得するたびにPushメソッドが実行され、Milkcocoaのデータストアに対してPushイベントが発火されます。

  • 19行目:data.langにツイートの言語情報が入っているので、日本語のツイートだけを抽出するようにします。
  • 21~27行目:データストアにpushするツイート情報を選定します。
  • 29~31行目:データストアにpushします。

Webサイト(フロント)側の構築

Node.js側で受け取ったツイートのPushイベントを取得するサイトを、Milkcocoaのチュートリアルを基に作成してみましょう。

index.html
<!doctype html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>simple chat!</title>
  <script src="http://cdn.mlkcca.com/v0.2.8/milkcocoa.js"></script>
  <script src="main.js"></script>
</head>
<body>
  <ul id="board"></ul>
</body>
</html>

とりあえずツイート内容を画面に描画してみましょう。

main.js
var milkcocoa = new MilkCocoa('https://{YOUR APP ID}.mlkcca.com');
var ds = milkcocoa.dataStore('tweet');
var board;

window.onload = function(){
  board = document.getElementById('board');
}

ds.on("push",function(data){
  console.log(data);
  addText(data.value.text);
});

function addText(text){
  var msgDom = document.createElement('li');
  msgDom.innerHTML = text;
  board.insertBefore(msgDom, board.firstChild);
}

今回はこのようにmilkcocoaフォルダ内にwebsiteフォルダを作成し、その中にindex.htmlmain.jsを作成しました。

図12 milkcocoaフォルダ内にwebsiteフォルダを作成し、その中にindex.htmlとmain.jsを作成
図12 milkcocoaフォルダ内にwebsiteフォルダを作成し、その中にindex.htmlとmain.jsを作成

実際に公開する際にはこのwebsiteフォルダはtweet.jsを動かすサーバとは別のサーバにホスティングしているイメージです。

試してみる

先ほどのプログラムを実行すると、ツイートを取得するごとにMilkcocoaにPushされて、それと同時にPushイベントを監視しているmain.jsの9~12行目が実行されます。あらかじめwebsite/index.htmlをブラウザで表示させておきましょう。

$ node tweet.js facebook

Facebookと言う単語のツイートをリアルタイムに取得しています。

図13 ⁠Facebook」と言う単語のツイートをリアルタイムに取得(サムネイルでは表示が崩れます。ご了承ください。)
図13 「Facebook」と言う単語のツイートをリアルタイムに取得

これでMilkcocoa Node.js SDKがSocket.ioなどのWebsocketライブラリの代わりに動作してくれることがわかると思います。

Milkcocoaをデータベースとして利用してみる

第4回の初めのほうで、MilkcocoaはSocket.ioやmongoDBの肩代わりをしてくれると言う話をしました。

ここまでで、Milkcocoa Node.js SDKを使うことでSocket.ioなどのWebSocketライブラリの代わりになってくれることがわかったと思います。

次はmongoDBなどのデータベースの代替になることがわかるように、データベースとしてMilkcocoaを扱ってみたいと思います。

データストアに保存したツイートを検索する機能を作る

今回はデータベースから取得してくるだけなので、フロント実装だけです。

図14 先ほどのwebsiteフォルダにget.htmlとget.jsを作成
図14 先ほどのwebsiteフォルダにget.htmlとget.jsを作成

先ほどのwebsiteフォルダget.htmlget.jsを作成します。

get.html
<!doctype html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>simple chat!</title>
  <script src="http://cdn.mlkcca.com/v0.2.8/milkcocoa.js"></script>
  <script src="get.js"></script>
</head>
<body>
  検索したいユーザー名を入力:
  <input type="text" name="name" id="msg" value="">
  <button name="button" onClick="getUserTweet()">find message!</button>
  <ul id="board"></ul>
</body>
</html>

簡単なフォームとボタンをhtmlで作成しました。Milkcocoaのドキュメントを参考にQueryメソッドを利用してみます。

get.js
var milkcocoa = new MilkCocoa('https://{YOUR APP ID}.mlkcca.com');
var ds = milkcocoa.dataStore('tweet');
var query = ds.query();
query.limit(30);

var textArea, board;
window.onload = function(){
  textArea = document.getElementById('msg');
  board = document.getElementById('board');
}

function getUserTweet(){
  var targetUser = textArea.value;
  ds.query({screen_name : targetUser}).done(function(data) {
    render(data); //取得したツイートを描画
  });
}

function render(tweet){
  for(var i = 0, len = tweet.length; i < len; i++){
    addText(tweet[i].text);
  }
}

function addText(text){
  var msgDom = document.createElement('li');
  msgDom.innerHTML = text;
  board.insertBefore(msgDom, board.firstChild);
}

ユーザ名でツイートを検索して表示する

あらかじめtweet.jsを実行させておき、ツイートを保存しておきましょう。今回はligincを検索ワードにしてツイートを取得しておきました。

$ node tweet.js liginc

確認するために、あらかじめ自分のTwitterアカウントでligincという文字列が入るツイートをしておきました。

図15 あらかじめ「liginc」という文字列が入るツイートをしておく
図15 あらかじめ「liginc」という文字列が入るツイートをしておく

その後、先ほどのget.htmlにアクセスしてフォームからツイートを取得するユーザ名を入力しましょう。今回はn0bisukeと入力します。

図16 ユーザ名がn0bisukeのツイートをデータストアから検索して描画
図16 ユーザ名がn0bisukeのツイートをデータストアから検索して描画

先ほどツイートした情報がMilkcocoaに保存されていたので、今回はフロント側だけの実装でユーザ名がn0bisukeのツイートをデータストアから検索して描画することができました。

まとめ

いかがでしたでしょうか?

Milkcocoa Node.js SDKを使い方を事例とともに紹介しました。Socket.ioとmongoDBを用意しなくてもサーバープログラム実装だけでリアルタイム通信やデータ保存が出来ていることがおわかりいただけたかと思います。

Milkcocoa Node.js SDKがとても簡単に利用できて、様々な場面で利用出来るという可能性を感じていただけたのではないでしょうか?

筆者は実際にLIGとSHIFTBRAINで企画したリアル連動イベントでMilkcocoa Node.js SDKを使って実装をしましたが、とても手軽に使えてスピーディな開発を可能にしてくれました。

興味を持たれた方はぜひMilkcocoa Node.js SDKを使って何かモノを作ってみましょう!

Milkcocoa Node.js SDKを使った事例集

最後になりますが、簡単にMilkcocoa Node.js SDKを使った事例を紹介したいと思います。こう言ったプラットフォームは実際に利用シーンがイメージ出来たほうが利用モチベーションが上がると思いますので、この事例を参考にアイディアを膨らませるきっかけにしてみてはいかがでしようか。

おすすめ記事

記事・ニュース一覧