Hubotを使ってGoogle AnalyticsのデータをSlackに流す
1年ほど前にまとめたものです。
初botつくりです。
環境準備
(公式ページ通りですが)
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を利用します。
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から取得したJSONのclient_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
を利用して取得します。下記リンク先を参考にしてみてください。
- Core Reporting API - 一般的なクエリ | アナリティクス Core Reporting API | Google Developers
- Core Reporting API - リファレンス ガイド | アナリティクス Core Reporting API | Google Developers
- Dimensions & Metrics Explorer | アナリティクス Core Reporting API | Google Developers
その他
取得した情報を特定のルームに流す
robot.send({ room: 'roomname' }, message);
#roomname
のように#
をつけると、3系からはエラーになります。