Hubotを使ってGoogle AnalyticsのデータをSlackに流す

1年ほど前にまとめたものです。


botつくりです。

slackhq/hubot-slack · GitHub

環境準備

(公式ページ通りですが)

hubot, coffee-script, yo, generator-hubotをグローバル環境にインストールします。

npm install -g hubot coffee-script yo generator-hubot

yoでベースをつくります。

yo hubot

Bot adapterをslackにします。

? Bot adapter slack

起動

起動の前にHubot用のSlack Tokenが必要です。 SlackのIntegrationsからHubotを追加してトークンを取得してください。

起動は以下コマンドで。

HUBOT_SLACK_TOKEN=xoxb-1234-5678-91011-00e4dd ./bin/hubot --adapter slack

Slackでbotのステータスがオンラインになれば、ひとまず成功です。

いくつか試してみたい場合はscripts/example.coffeeが便利です。 例えば以下部分のコメントアウトをはずします。

robot.hear /badger/i, (msg) ->
    msg.send "Badgers? BADGERS? WE DON'T NEED NO STINKIN BADGERS"

badgerと話しかけると、返信してくれるようになります。

Herokuで動かす

Gitの初期化がまだの場合、git initしておきます。

create

heroku create my-company-slackbot

config

heroku config:add HUBOT_HEROKU_KEEPALIVE_URL=https://my-company-slackbot.herokuapp.com
heroku config:add HUBOT_SLACK_TOKEN=xoxb-1234-5678-91011-00e4dd

push

git push heroku master

これで完了です。

うまく動かない場合は、Procfileを確認してみてください。

web: bin/hubot -a slack

HUBOT_HEROKU_KEEPALIVE_URL

configで設定しているこの項目は、HubotをHeroku上で起動させ続けるために必要になります。

hubot-scripts/hubot-heroku-keepalive: A hubot script that keeps the hubot Heroko web dyno alive

Google Analyticsの情報を取得

GoogleのNode.js client libraryを利用します。

google/google-api-nodejs-client: Google’s officially supported Node.js client library for accessing Google APIs.

install

npm install googleapis --save

OAuth 2.0を利用した認証と各種APIの利用が可能です。 今回はサーバー上で認証をおこなうため、JWT (Service Tokens) を利用します。

Google Developersの設定

googleapisを利用するためにGoogle Developersの設定をします。

Google Developers Console から以下2つの設定を行います。 (「プロジェクト」がない場合は、先に作成を済ませてください。)

1. APIを有効にする

[API Manager] –> [概要] からAnalytics APIを有効にします。

2. サービス アカウント キーを作成する

[API Manager] –> [認証情報] から新しいサービス アカウント キーを作成します。キーのタイプはJSONにします。

認証

まだAnalyticsにアクセスはできませんが、認証処理がうまくいくか先に確認してみます。

var google = require('googleapis');
var key = require('path/to/key.json');
var jwtClient = new google.auth.JWT(key.client_email, null, key.private_key, ['https://www.googleapis.com/auth/analytics'], null);

jwtClient.authorize(function(err, tokens) {
  if (err) {
    console.log(err);
    return;
  }
  console.log(tokens)
});

key.jsonはアカウントキー作成時にダウンロードしたJSONファイルです。 認証処理がうまくいけば、tokensの情報が確認できます。

補足: Scopeについて

['https://www.googleapis.com/auth/analytics']の部分には必要なScopeを設定します。 Google Analyticsを利用するだけならこのままで大丈夫です。

OAuth 2.0 Scopes for Google APIs  |  Google Identity Platform  |  Google Developers

Analyticsの設定

Analytics側の設定を確認します。

1. ビューIDの確認

[アナリティクス設定] –> [ビュー] –> [ビュー設定] から「ビュー ID」の確認をします。

2. メールアドレスの追加

[アナリティクス設定] –> [ビュー] –> [ユーザー管理] から「表示と分析」が可能なメールアドレスを追加します。

Developer Consoleから取得したJSONclient_emailを利用します。

Analyticsのデータを取得

ここまで準備ができたら Core Reporting API を利用してデータの取得が可能です。

analytics.data.ga.getメソッドを利用してデータのリクエストを行います。

var google = require('googleapis');
var key = require('path/to/key.json');
var jwtClient = new google.auth.JWT(key.client_email, null, key.private_key, ['https://www.googleapis.com/auth/analytics'], null);
var analytics = google.analytics('v3');
var viewId = 'xxx'; // 設定画面で確認した「ビューID」

function authTask() {
  return new Promise((resolve, reject) => {
    jwtClient.authorize((err, result) => {
      if (err) {
        console.log('authTask/reject');
        reject(err);
      } else {
        console.log('authTask/resolve');
        resolve(result);
      }
    });
  });
}

function gaTask(token, viewId) {
  return new Promise((resolve, reject) => {
    analytics.data.ga.get({
      'ids': 'ga:' + viewId,
      'start-date': '7daysAgo',
      'end-date': 'today',
      'metrics': 'ga:pageviews',
      'dimensions': 'ga:pagePath',
      'sort': '-ga:pageviews',
      'access_token': token
    }, (err, result) => {
      if (err) {
        console.log('gaTask/reject');
        reject(err);
      } else {
        console.log('gaTask/resolve');
        resolve(result);
      }
    });
  });
}

module.exports = robot => {
  robot.respond(/hi$/i, msg => {
    authTask().then(result => {
      return gaTask(result.access_token, viewId);
    })
    .then(result => {
      console.log(JSON.stringify(result));
    })
    .catch(err => {
      console.log(err);
    });
  });
};

botに対してhiと話しかけると、過去7日間のページビューランキングを取得します。

ページビューランキング以外のデータもanalytics.data.ga.getを利用して取得します。下記リンク先を参考にしてみてください。

その他

取得した情報を特定のルームに流す

robot.send({ room: 'roomname' }, message);

#roomnameのように#をつけると、3系からはエラーになります。

自動実行させる

ncb000gt/node-cron