kei0425tan’s blog

技術的なことを主に

claudia.jsでslack custom commandsを作る

kei0425tan.hatenablog.com

というわけで、まずはslackを使いこなせないと始まりません。

手始めに、custom commandsを使ってみます。

こちらが公式ページ(英語です)
api.slack.com

その前に、ここまでできてる前提で話しますね。
kei0425tan.hatenablog.com

slackの設定

というわけで、AWS lambdaで、web APIは使いこなせる??ようになっているはずです。
なので、slackでの設定を行います。

まずは、slackのチーム名の隣の下向き▼を押して、メニューを出して、「Apps & integrations」をクリックします。

面倒だったら、以下をクリックで!
slack.com

外部連携は基本的にいつもこのページからできるはずです。

その後、右上の「Build」をクリックし、「Something just for my team」をクリックします。

すると、以下の4つが表示されます。

  • Incoming WebHooks

→ slackにメッセージを表示する。

  • Bots

→ いわゆるBots

  • Slash Commands

→ /で始まるコマンド

  • Outgoing WebHooks

→ slackの表示されたメッセージを外部に渡す。

今回は、Slash Commandsを作成するので、そちらを選択します。

そうすると、コマンド名を入力する画面になるので、好きなコマンド名を入力します。

すると、まずPOSTデータのサンプルが表示されます。

token=RIKqnGNDN6r2yx01mOkIGgwe
team_id=T0001
team_domain=example
channel_id=C2147483705
channel_name=test
user_id=U2147483697
user_name=Steve
command=/weather
text=94070
response_url=https://hooks.slack.com/commands/1234/5678

それぞれの意味は以下です。

  • token → slackの認識用のトークン。受け取ったらまずここをチェックして違ったら弾くこと。
  • team_id → チームID。チームドメインは変更可能だが、team_idはずっとユニークで変更できないはず。
  • team_domain → チームドメイン。urlの最初。
  • channel_id → チャンネルID。チャンネル名は変更可能だが、こちらはユニーク。
  • channel_name → チャンネル名。
  • user_id → ユーザID。こちらもユニーク
  • user_name → ユーザ名
  • command → 入力されたコマンド(/つき)
  • text → 入力されたコマンドの引数。日本語も入ります。入力通りに受け取れます。
  • response_url → 処理に時間が掛かるときに利用するレスポンス用URL

次に、上から順に以下を設定していきます。

  • URL → 前回作成したURL
  • Method → POSTのまま
  • Token → そのまま。メモっておきましょう。
  • Customize Name → 表示するコマンド名。
  • Customize Icon → アイコンの変更ができます。
  • Preview Message → 上のCustomize NameとCustomize Iconを適用したプレビュー
  • Autocomplete help text → こちらを設定しておくと補完が効いてヘルプが見えます。
  • Escape channels, users, and links → ここを設定しておくと、POSTデータのtextが拡張されて、一緒にユーザIDなどが来ます。
  • Descriptive Label → なんだろう??知ってる人教えてください。

というわけで、大事なのはURLだけですね。

ここでは仮に、
コマンド名は/test
claudiaのpathも
https://yfw8aqrorg.execute-api.ap-northeast-1.amazonaws.com/latest/test
にしましょう。

それで、最後までいったら「Save Integration」をクリックします。
画面は遷移しませんが保存されます。

AWSの設定


とりあえず、前回のスクリプトに以下を追加。トークンは上のトークン入れてくださいね。

api.post('/test', function (request) {
    if (request.post.token != 'トークン') {
        return {message:'token error'};
    }
    
    return {
        "response_type": "in_channel",
        "text": "It's 80 degrees right now.",
        "attachments": [
            {
                "text":"Partly cloudy today and tomorrow"
            }
        ]
    };
    
});

APIのレスポンスはJSONで返します。

  • response_type → "in_channnel"を指定するとチャンネル全員が見えます。"ephemeral"を指定するとコマンドを発行した人のみに見えます。デフォルトでは、"ephemeral"を指定したのと同じです。
  • text → 表示するメッセージです。
  • attachments → 追加情報。引用みたくみえます。

さあ、ここまでできれば、あとは自由自在にコマンドを作れますね。

レッツコーディング!