kanke

PHPでGoogle Analytics APIを利用して、アクセス解析のデータをSlackに投げる(後編)

こんにちは。Google Analytics APIとSlackの連携記事の後編です。

前回の記事では、APIを利用してアクセス解析の値を取得するところまでやりました、今回は

  • Slackへの投稿
  • 毎週月曜日の10時に実行させる(定期的にSlackに投稿)

までを行おうと思います!

Slackへの投稿

Slackへの投稿といえばhubotを使ってBotにしたいっていうのもありますが、今回はもうちょっとお手軽にSlackのAPIでchat.postMessageというmethodを使ってみます。

指定のURLに対して、POSTでデータを渡せばSlackに投稿してくれますので、比較的簡単に導入可能です。

アクセストークンの取得

APIを使用するためには、まずは、アクセストークンの取得が必要です。

Slack Web APIのページの下部にトークンの取得のためのボタンがあります。

権限によっては取得できない可能性がありますので、その場合は管理者にお問い合わせを。
トークンを取得したら準備完了なので、コードを書いていきます。

ポストする

設定できる引数は公式のドキュメントを見ていただければと思いますが、最低限、以下の情報があれば投稿することができます。

  • token → 取得したアクセストークン
  • channel → 投稿するチャンネル名
  • text → 投稿するテキスト

今回は、以下の様な形で指定してみました。

$url  = 'https://slack.com/api/chat.postMessage';
$args = [
  'token'      => '取得したアクセストークン',
  'channel'    => '投稿するチャンネル名',
  'text'       => $report . "\n" . $ranking,
  'username'   => 'tamkun',
  'icon_emoji' => ':tam:',
];

ポストする引数を配列にして、テキストには前回Google AnalyticsのAPIで取得した値が入るようになっています。

username は表示する名前、icon_emoji は表示されるアイコンです。何も指定しないと、デフォルトのアイコンと「bot」という名前で投稿されます。

TAMではオリジナルの絵文字で、マスコットキャラクターのTAM君アイコンが用意されているので、TAM君に投稿してもらうようにしました。

次に、実際に送信用の関数を書きます。

// Slack送信用関数
function post($url, $args){
  //引数をURLエンコードされたクエリ文字列に変換
  $content = http_build_query($args);

  //HTTPヘッダーを指定
  $header = [
    "Content-Type: application/x-www-form-urlencoded",
    "Content-Length: ".strlen($content)
  ];
  $options = [
    'http' => [
      'method' => 'POST',
      'header' => implode("\r\n", $header),
      'content' => $content,
    ]
  ];
  $ret = file_get_contents($url, false, stream_context_create($options));
  return;
}
post($url, $args);

file_get_contents 関数を使用してPOSTデータを飛ばします。

この状態でページにアクセスしてPHPを実行してSlackを見てみると…

Slackの指定したチャンネルに投稿されました!素敵!

サーバーで定期実行させる

ここまで出来たら、後はサーバーで定期的に実行させれば、毎週月曜日にSlackにレポートが届く仕組みが作れます!

サーバーは何でも良いのですが、今回はHerokuを使いました。
Herokuの説明は省きますが、詳しく知りたい方は以下の記事を!

いますぐ出来る!HerokuのセットアップからPHP環境の作成まで

Herokuでアプリケーションを作成して、今回作成したコードをアップします!

試しにURLにアクセスしてSlackにちゃんと投稿されていればOKです。

heroku スケジューラーの設定

herokuで定期的にプログラムを実行するために、Heroku Schedulerというアドオンを使用します。

コンソールから追加するか、

heroku addons:add scheduler:standard 

管理画面のResourcesから「Heroku Scheduler」で検索して追加します。

アドオンは無料ですが、月に750時間を超える場合は料金がかかるようです。

アドオンの追加ができたら、設定画面で実行するタスクと時間を設定します。

実行するタスクのところは以下のように書けばOKです。

$ php file-name.php

file-nameのところには作成したphpファイルの名前をいれてください。

定期実行する時間は、プルダウンで選択できるのでこれを毎週月曜日に設定すれば…

と思ったら、10分毎・1時間毎・1日毎しか指定ができません!
正直、毎日はいらないのでPHPを少し変更して月曜日だけ実行されるようにしようと思います。

// 曜日を取得
$date_week = date("w");

// 月曜日だったら
if($date_week == 1){

  //APIを使用してレポートの値を取得
  $report = getWeeklyReport($analytics, $profile);
  $ranking = getWeeklyRanking($analytics, $profile);

 // Slackに送信
  $url  = 'https://slack.com/api/chat.postMessage';
  $args = array(
    'token'      => '取得したアクセストークン',
    'channel'    => '投稿するチャンネル名',
    'text'       => $report . "\n" . $ranking,
    'username'   => 'tamkun',
    'icon_emoji' => ':tam:',
  );
  post($url, $args);
}

関数実行前に日付を取得して月曜日だったら実行されるようにしてみました。

これで月曜日に実行されるようになりましたが、herokuのデフォルトのタイムゾーンはUTCのようで、日本とは9時間時差があるので、それも加味した時間設定が必要です。

タイムゾーンを変更することも出来るようですが、めんどくさいので今回は単純に1時に設定して、日本の10時に実行されるようにしました。

これで定期的にSlackに投稿されるレポートの仕組みが完成です!

応用すれば月ごとのレポートにすることなども可能です!

まとめ

Slackは色々なサービスと連携できるのでエンジニア的にはとても楽しいですね!今度はhubotにも挑戦してみたい!

実はherokuもGoogle Analytics APIも初めてだったので、どうなることかと思いましたがなんとかなるもんですね!
しかし、こういった簡単なサービス作るのにheroku使いやすすぎですね。

お問い合わせはこちら