開発情報・ナレッジ

投稿者: SPIRERS ナレッジ向上チーム 2024年2月1日 (木)

定期的に Slack へ通知するサンプルプログラム

以前に、フォームからデータが登録された際に SLACK に登録通知を行うサンプルプログラムを公開しました。
今回は、定期的に DB をチェックし、該当するレコードがあったら SLACK に通知を行う手順をご紹介します。
未対応のお問い合わせがあったら通知するユースケースを想定しています。

通知を飛ばす手順 および サンプルプログラムを作成しましたので、
通知機能を作成したい方はぜひ参考にしてみてください。

SLACK側の設定

手順1
通知を飛ばすためのチャンネルを追加いたします。
すでに通知したいチャンネルがある場合は、追加不要です。
プライベートチャンネルでも通知できます。

手順2
通知したいチャンネルのタブで右クリックを行い、表示されたメニューから ① 「チャンネル詳細を表示する」を押下します。

手順3
詳細画面で、② の「インテグレーション」タブを押下し、③ の「アプリを追加する」のボタンを押下します。

手順4
検索の箇所で「Incoming Webhook」を検索し、「インストール」ボタンを押下します。

手順5
インストールボタンを押下するとブラウザが立ち上がります。
⑤ の「SLACKに追加」ボタンを押下します。

手順6
通知を行うチャンネルを設定します。
手順7
チャンネルの設定を行いましたら、下部の Webhook URL の箇所の ⑥ URLのコピーを行います。
Webhook のURLを使用して、通知のプログラムを作成いたしますので、漏れてしまうと、第三者からメッセージの投稿ができてしまいます。取り扱いには、ご注意ください。
URLを保存しましたら、完了ボタンを押下し、設定が終了となります。

「名前をカスタマイズ」「アイコンをカスタマイズする」にて通知時の名前やアイコンを変更ができます。

SPIRAL ver.2 側の設定

SPIRAL ver.2 の設定は、問い合わせ内容を保管するDBにスケジュールトリガを作成して、PHP実行アクションを紐付けします。
問い合わせ内容を保管するDBは、以下のフィールドを含むことを想定しています。

ステータス
未対応・対応済などを管理するセレクトタイプフィールド
問い合わせ件名
問い合わせ時に入力する件名のテキストタイプフィールド

スケジュールトリガの設定は、下記のサポートサイトをご参照ください。
サポートサイト スケジュールトリガ
サポートサイト スケジュールトリガのPHP実行アクション

今回のトリガの設定例はサポートサイトの設定例をもとにしていますが、対応漏れを防ぐ目的の通知ですので、実行タイミングは始業前や業務終了の1時間前などもおすすめです。

PHP実行アクションに設置するPHPプログラムのサンプルは以下となります。

PHP
<?php
// スパイラル設定値
define("API_URL", "https://api.spiral-platform.com/v1");
define("API_KEY", "APIキー");
define("APP_ROLE", "アプリロール識別名");
define("APP_ID", "アプリID");
define("DB_ID", "DBID");
define("STATUS_FIELD", "フィールド識別名"); // 未対応・対応済などを管理するセレクトタイプフィールドの識別名
define("BACKLOG_STATUS_ID", "0"); // 上記セレクトタイプフィールドの「未対応」項目のID番号
define("CONTACT_TITLE", "問い合わせタイトル識別名"); // 通知に記載する問い合わせ件名

// slack設定値
define("SLACK_WEBHOOK_URL", "SLACKのWebhookURL");

// 月曜日から金曜日のみ実行
$weekday = date('w');
if($weekday >= 1 && $weekday <= 5){
    // 「未対応」のお問い合わせリストを取得
    $apikey = API_KEY;
    $spiralApiUrl = API_URL."/apps/".APP_ID."/dbs/".DB_ID."/records?where=@".STATUS_FIELD."=".BACKLOG_STATUS_ID."&enableTotalCount=true&sort=_id:asc";
    $result = SPIRAL_API_send($spiralApiUrl);
    $backlogs = $result["items"];
    $totalCount = $result["totalCount"];

    // 「未対応」が1件でもあったらslackへ通知
    if($totalCount){
        // 通知メッセージを作成
        $message = array();
        $message[] = "未対応の問い合わせが".$totalCount."件あります。(最大10件表示)"."\n";
            // 最大10件の問い合わせを通知
            for($i = 0; $i < 10 && $i < $totalCount; $i++){
                // 投稿日時のタイムゾーンを日本時間に変更
                $_createdAtDateTime = new DateTime(date('Y-m-d H:i', strtotime($backlogs[$i]["_createdAt"])), new DateTimeZone('Asia/Tokyo'));
                $_createdAt = $_createdAtDateTime->format('Y-m-d H:i');
                // ID.問い合わせ件名(投稿日時:20XX-XX-XX XX:XX)
                array_push($message, $backlogs[$i]["_id"].".".$backlogs[$i][CONTACT_TITLE]."(投稿日時:".$_createdAt.")\n");
            }
            $url = "https://XXXXXXXXX.spiral-platform.com/user-area/apps/".APP_ID."/dbs/".DB_ID."/records?role=xxxx";
        $messageTxt = <<<EOF
内容を確認して対応をお願いします。

アプリ利用画面URL(表示権限があるユーザでSPIRAL ver.2 にログインしている時のみアクセスできます。)
$url
EOF;
        array_push($message, $messageTxt);
        $data = array();
        $data["text"] = implode($message);

        // slackへ通知
        SLACK_WEBHOOK_send($data);
    }
}


function SPIRAL_API_send( $spiralApiUrl){

    $header = array(
    "Authorization:Bearer ".API_KEY,
    "Content-Type:application/json",
    "X-Spiral-Api-Version: 1.1",
    );  
    if(APP_ROLE){
        $header = array_merge($header,array("X-Spiral-App-Role: ".APP_ROLE));
    }
    // curl
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_URL, $spiralApiUrl);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

    $response = curl_exec($curl);
    if (curl_errno($curl)) echo curl_error($curl);
    curl_close($curl);
    return json_decode($response, true);
}

function SLACK_WEBHOOK_send($data){

    $header = array(
    "Content-Type:application/json",
    );
    // curl
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_URL, SLACK_WEBHOOK_URL);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");

    $response = curl_exec($curl);
    if (curl_errno($curl)) echo curl_error($curl);
    curl_close($curl);
    return json_decode($response, true);
}

設定値に関して

共通で使用する値に関しては、定数として初めに設定します。

スパイラルの設定値は下記を設定してください。

API_URL リクエスト先URLの固定部分です。固定値ですので特に変更する必要はありません。
API_KEY 発行したAPIキーを設定してださい。別途権限の付与が必要になります。
APP_ROLE 設定したアプリロールの識別名を入れてください。全権限の場合は値は空で大丈夫です。
APP_ID レコード操作を行うDBがあるアプリのIDを設定してください。
DB_ID レコード操作を行うDBのIDを設定してください。
STATUS_FIELD 今回は未対応ステータスの場合に Slack へ通知を出します。
未対応・対応済などを管理するセレクトタイプフィールドの識別名を記載してください。
BACKLOG_STATUS_ID 未対応・対応済などを管理するセレクトタイプフィールドの「未対応」項目のID番号を記載してください。
CONTACT_TITLE 通知に記載する問い合わせ件名などのフィールド識別名を記載してください。
通知に記載したい項目が複数ある場合は適宜定数を追加してください。

Slackの設定値は下記の1ヶ所を設定してください。

SLACK_WEBHOOK_URL
13行目
Slack側の設定の手順7で取得したWebhook のURLを設定

次にメッセージ内容を修正します。
29行目 - 44行目の箇所になります。
メッセージには、アプリ利用画面のURLをつけておくと便利です。
38行目の XXXX の箇所を、サイトのドメインやアプリロール名に変更して試してみてください。
なおアプリ利用画面へアクセスするには、該当アプリのアプリロールの設定が必要ですのでご注意ください。

PHP
        $message[] = "未対応の問い合わせが".$totalCount."件あります。(最大10件表示)"."\n";
            // 最大10件の問い合わせを通知
            for($i = 0; $i < 10 && $i < $totalCount; $i++){
                // 投稿日時のタイムゾーンを日本時間に変更
                $_createdAtDateTime = new DateTime(date('Y-m-d H:i', strtotime($backlogs[$i]["_createdAt"])), new DateTimeZone('Asia/Tokyo'));
                $_createdAt = $_createdAtDateTime->format('Y-m-d H:i');
                // ID.問い合わせ件名(投稿日時:20XX-XX-XX XX:XX)
                array_push($message, $backlogs[$i]["_id"].".".$backlogs[$i][CONTACT_TITLE]."(投稿日時:".$_createdAt.")\n");
            }
            $url = "https://XXXXXXXXX.spiral-platform.com/user-area/apps/".APP_ID."/dbs/".DB_ID."/records?role=xxxx";
        $messageTxt = <<<EOF
内容を確認して対応をお願いします。

アプリ利用画面URL(表示権限があるユーザでSPIRAL ver.2 にログインしている時のみアクセスできます。)
$url
EOF;

最後に

設定後は動作確認を必ず行い、動作に問題がないか確認をしてください。
不具合やほかのやり方が知りたい等あれば、下記の「コンテンツに関しての要望はこちら」からご連絡ください。
解決しない場合はこちら コンテンツに関しての
要望はこちら