ようへいの日々精進XP

よかろうもん

Slack API を利用してメッセージに絵文字リアクションするメモ

やりたいこと

Slack のメッセージに API を利用して直近のメッセージに絵文字のリアクションをつけたい!

やったこと

処理の流れ

  1. 直近のメッセージの情報を取得
  2. 取得したメッセージに絵文字リアクションを付与

とてもシンプル.

準備

1. 新しい App を登録

https://api.slack.com/apps にて Create New App をクリックして, 必要な情報を登録する.

f:id:inokara:20200815113721j:plain

App Name を設定して, Development Slack Workspace にて対象のワークスペースを選択する.

2. App に必要な権限を付与

作成した App に必要な権限を付与する.

App 一覧より, 作成した App をクリックして OAuth & Permissions ページの Scope にて以下の権限を設定.

f:id:inokara:20200815114201p:plain

今回は Bot Token Scope に権限を設定した. 必要な権限については, https://api.slack.com/methods にて確認することが出来る. 例えば, メッセージ一覧を取得するメソッド conversations.history については, 下図のように明記されているので, 明記されている権限を付与する.

f:id:inokara:20200815114606p:plain

OAuth & Permissions ページにて Bot User OAuth Access Token をコピーしておく.

3. App をチャンネルに追加

Slack チャンネルの詳細メニューからアプリを追加するより, 作成した App を追加する.

f:id:inokara:20200815120613p:plain

4. ざっくりとシェルスクリプトを書く

取り急ぎ, ざっくりと以下のようなシェルスクリプトを書いた.

#!/bin/bash

SLACK_API_TOKEN="xoxb-1111111111-2222222222-xyzxyzxyzxyzxyzxyzxyzxyzxyz"
SLACK_CHANNEL_ID="XXXXXXXXXXXXXX"

LATEST_MESSAGE=$(curl -s -XGET "https://slack.com/api/conversations.history?token=${SLACK_API_TOKEN}&channel=${SLACK_CHANNEL_ID}&limit=1" \
  | jq -rc '.messages[]|[.ts, .text]|@sh' | tail -1)

LATEST_MESSAGE_TS=$(echo "${LATEST_MESSAGE}" | awk '{ print $1 }' | sed s/\'//g)
LATEST_MESSAGE_TEXT=$(echo "${LATEST_MESSAGE}" | cut -d ' ' -f 2- | sed s/\'//g)

curl -s -XPOST \
  -d "token=${SLACK_API_TOKEN}" \
  -d "channel=${SLACK_CHANNEL_ID}" \
  -d "name=eyes" \
  -d "timestamp=${LATEST_MESSAGE_TS}" \
  "https://slack.com/api/reactions.add"

LATEST_MESSAGE_TEXT を取得しているのはおまけ. 手順の 2 で控えておいた Access Token を変数 SLACK_API_TOKEN に設定しておく.

以下, 処理の流れ.

  • API エンドポイント /api/conversations.history にクエリパラメータ limit=1 を付与して直近のメッセージを取得
  • メッセージにリアクションする場合, 対象のメッセージのタイムスタンプをパラメータとして API エンドポイント /api/reaction.add に POST する (トークンとチャンネル名, 絵文字名も必要)

動作確認

シェルスクリプトを実行すると, 以下のようにリアクションが付いた.

f:id:inokara:20200815121005p:plain

やったーーー.

シェルスクリプトの出力は以下の通り.

$ ./test.sh
1597460829.002900
テスト、テスト、テスト
{"ok":true}

以上

メモでした.