menu-icon

PHPでSlackのslash commandsを作ってみる

PHP(フレームワークなし)でslackのslash commands(スラッシュコマンド)を作ってみます。

Slack側での作業

Slack Appの作成

Slack App画面のTOPにて[Create an App]ボタンを押すと作成画面に遷移します。

アプリ名とワークスペースを入力して作成します。

Signing Secret の確認

アプリを作成したら、Basic Information画面のApp Credentialsの欄でSigning Secret を確認し、控えておいてください。Slackからのリクエストの検証に必要になります。

slack commandsの作成

FearturesSlash Commands で下の画面へ遷移し、[Create New Command] ボタンでコマンドを新規作成します。

Commandにコマンド名を入力します。今回は入力した内容をそのまま出力するだけのコマンドなので /echo コマンドにします。また、Request URLに実行時にSlackから呼ばれるURLを入力します。今回は仮にhttps://hogehoge.com/slack.phpとしました。説明なども適切に入力したらSaveします。

Saveすると下の状態となります。

アプリ連携

Slack側での設定は終わりましたので、アプリをワークスペースに連携しておきます。Install App画面にて [Install App to Workspace] を押して、後は画面の指示に従います。

エンドポイントの用意

先ほど指定した https://hogehoge.com/slack.php を用意します。入力を返すだけなので、特に難しいことはないのですが、リクエストの検証部分はこちらのドキュメントをよく読んでください。 なお 'your secret'に控えておいたSecretを入れます。

<?php

define('SLACK_SIGNING_SECRET', 'your secret');

$body = file_get_contents('php://input');
$headers = getallheaders();

// リクエストの検証
if (verify($body, $headers) !== true) {
    response('Bad Request');
}

// 入力値をそのまま返す
response($_POST['text']);

function verify(string $body, array $headers): bool
{
    if (array_key_exists('X-Slack-Request-Timestamp', $headers) !== true
        || array_key_exists('X-Slack-Signature', $headers) !== true) {
        return false;
    }

    $timestamp = $headers['X-Slack-Request-Timestamp'];
    if (abs(time() - $timestamp) > 60 * 5) {
        return false;
    }

    $base_string = 'v0:' . $timestamp . ':' . $body;
    $my_signature = 'v0=' . hash_hmac('sha256', $base_string, SLACK_SIGNING_SECRET);

    return $my_signature === $headers['X-Slack-Signature'];
}

function response(string $message): void
{
    header("Content-type: application/json");
    echo json_encode([
        'response_type' => 'in_channel',
        'text'          => $message,
    ]);
    exit(0);
}

実行

Appの設定が正しくできていれば、オートコンプリートが表示されます。

入力を確定すると、無事に入力した文字列が返却されました!