Slackにメッセージを追加する

はじめに

INTER-Mediatorは以前からメール送信は可能でしたが、Slackのメッセージ送信についても可能にしました。メールと同様に、データベースへの書き込み、更新、読み出しの後に、それらのデータを用いてのメッセージ送信が可能です。Slack側の仕組みは簡単で、Slack Appという設定を行い、ワークスペースにインストールするだけです。Slack Appは単にボットからの書き込みを許可する設定だけです。(設定のリファレンスは本ページの末尾にあります。)

Slackでメッセージを受け付けるようにする

Slackのメッセージングを行うには、ワークスペース単位にSlack Appのインストールを行います。ここで使うSlack Appは単なる設定です。Slack Appを設定すれば、認証用のトークンが発行されます。そして、メッセージを投入するときに、どのチャンネルなのかと、どんなメッセージなのかを指定します。つまり、Slack Appを作成後は、トークン、チャンネル、メッセージの3つの情報があれば、SlackのAPIコールが可能ということになります。以下、メッセージを受け付けるようにするまでのSlack側の設定を紹介します。

SlackのAPIのページに移動します。ログインしていない場合は、「sign in to your Slack account」の部分をクリックして、まずはログインをします。

ログインのページで、ワークスペースにログインをします。

SlackのAPIのページに移動すると、Create New Appボタンが見えています。このボタンをクリックします。

パネルが表示されます。ここで、App Nameを入力し、使用するワークスペースを選択します。App Nameはメッセージの送信者として、投稿したメッセージの中で見えるようになります。そして、Create Appをクリックします。

作成したSlack Appの編集画面に入ります。以後は、必要に応じて、保存を行ってください。まず、Add features and functionalityのところにある「Permissions」のボックスをクリックします。必要ならスクロールするなどして探してください。

移動したOauth & Permissionsのページで、Scopesのボックスを見つけます。そこにあるAdd an OAuth Scopeボタンをクリックします。

ドロップダウンの枠が出てくるので、ここで、「chat:write:bot」を選択します。

Scopsのリストに、「chat:write:bot」の項目が追加されました。

ページをスクロールして前の方に移動すると、Install App to Workspaceというボタンがあります。このボタンをクリックします。

OAuthでやりとりするメッセージの設定を行います。そのままAllowボタンをクリックするので構いませんが、必要ならば設定の変更を行います。

OAuth Access Tokenとして、認証トークンが得られました。本稿では、以後はアクセストークンの例は、「xoxp-XXXXXXXXXXX-XXXXXXXXXXX-XXXXXXXXXXXX-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx」と記載します。Copyボタンをクリックするとクリップボードに文字列がコピーされます。

設定したことがメールでも送信されています。

Slack側の設定は以上です。

INTER-Mediatorで開発する定義ファイルの設定

サンプルファイルでは、samples/Sample_chatにあるinclude_MySQL.phpファイルに設定例があります。まず、こちらは、定義ファイルの設定例です。

<?php
require_once(dirname(__FILE__) . '/../../INTER-Mediator.php');

IM_Entry(
    array(
        array(
            'records' => 100000000,
            'name' => 'chat',
            'key' => 'id',
            'sort' => array(
                array('field' => 'postdt', 'direction' => 'desc'),
            ),
            'default-values' => array(
                array('field' => 'postdt', 'value' => date("Y-m-d H:i:s")),
            ),
            'authentication' => array(
                'all' => array( // load, update, new, delete
                    'target' => 'field-user',
                    'field' => 'user',
                ),
            ),
            'messaging' => [
                'driver' => 'slack',
                'create' => [
                    'subject-constant' => 'message-posting-test',
                    'body' => 'message',
                ]
            ]
        ),
    ),
    array(
        'authentication' => array( ... ),
        'slack' => array(
            'token' => 'xoxp-XXXXXXXXXXX-XXXXXXXXXXX-XXXXXXXXXXXX-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
            'channel => '',
        ),
    ),
    array('db-class' => 'PDO'),
    false
);

こちらは、params.phpファイルの例です。

$slackParameters = [
    "token"=>'xoxp-XXXXXXXXXXX-XXXXXXXXXXX-XXXXXXXXXXXX-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    "channel" => 'message-posting-test',
];

認証トークンとチャンネルは、params.phpファイル、あるいは定義ファイルの2つ目の引数であるオプション指定に記述が可能です。両方に定義があると、params.php側が優先されます。params.phpファイルでは、変数$slackParametersに配列を代入し、配列はキーがtokenとchannelの連想配列になるようにしておきます。定義ファイルのオプション領域では、slackキーに対する連想配列で、tokenキーとchannelキーでそれぞれの指定を行います。

そして、定義ファイルのコンテキストと定義に、messagingキーを記述することで、データベース処理に対するメッセージング処理の動作を記述できます。messagingキーの直下は、driver、create、update、readのいずれかのキーを記述しますが、driverは必ず指定して、値はslackにしてください。これを省略するとメール送信とみなします。create、update、readの1つは必ず指定することになると思われます。そのデータベース処理が行われた後に、Slackへメッセージが飛びます。ここで、それぞれの操作の配列に使えるキーは、subject、subject-constat、body、body-constantのいずれかになります。subjectの2つのキーは、チャンネルを示します。チャンネルは3箇所に指定できますが、優先順位はコンテキスト内のものが最優先となります。bodyの2つのキーはメッセージです。subject、bodyは、いずれもコンテキストに存在するフィールド名を1つだけ記述します。一定の文字列で良い場合は、body-constantに文字列を記述します。なお、body-constantではテンプレート処理も行い、その中の「@@フィールド名@@」の記述部分が、コンテキストで得られるデータベースのフィールドの値に置き換わります。なお、コンテキストで複数のレコードが得られる場合、それぞれのレコードに対してメッセージが送信されます。

メッセージが送られる様子は、こちらのビデオでご確認できます。

以下、設定可能な項目について、まとめておきます。

[第1引数, コンテキスト定義]
Slackメッセージ送信

キー インデックス 下位のキー
'messaging' 'driver' 'slack' と指定する
'read' コンテキストに対してレコードの取り出しを行った後にメールを送信する。
'subject' チャンネルが含まれるフィールド名
'subject-constant' チャンネルを文字列で指定。文字列内に「@@フィールド名@@」の記述があれば、フィールドのレコードに置き換わる
'body' メッセージが含まれるフィールド名
'body-constant' メッセージを文字列で指定。文字列内に「@@フィールド名@@」の記述があれば、フィールドのレコードに置き換わる
'create' コンテキストに対してレコード作成を行った後にメールを送信する。下位のキーはreadと同じ
'update' コンテキストに対してレコードの更新を行った後にメールを送信する。下位のキーはreadと同じ

[第2引数, オプション設定]
Slackメッセージング

配列指定 params.phpで変数名
第1次元 第2次元
'slack' 'token' Slackの認証トークン $slackParameters
'channel' メッセージを送信するサーバ
連想配列、キーは第2次元のキーワードと同一