LoginSignup
31
23

More than 5 years have passed since last update.

オウム返し slack bot をぱっとつくる

Last updated at Posted at 2017-08-26

slackで @channel メンションに消耗してる人のために 'at channel police' という Bot を作った.
https://gyazo.com/e2e0e7241579a38ce051660b969ba77b

メッセージの送信をトリガーにした slack bot を作るのが意外と面倒だったのでまとめた.タイトルにはぱっと作るって書いたけど,書いてみたら全然ぱっと作れなさそう.

サンプルコードはrailsだけど,slack上の設定の方が圧倒的にウェイトが重いので,そこを中心にまとめた.
ちなみにサンプルでは slack-ruby-client という公式のgemを使った.

Prepare

slack app を作る

https://api.slack.com/apps
App name と team を入力して作成,

https接続

callback URL が https でないといけないので, ngrokをつかうと便利.
ref: ngrokを使用してローカル環境を外部に公開する

表記について

slack の設定ページURLは
https://api.slack.com/apps/{APP_ID}/general
となっていてリンクをベタ書きしづらいので,サイドバーの名称をとって xx page と表記することにする.

image.png
↑これだったら Basic Information page と表記

Bot の作成

Bot Users page から Default username を設定して追加する

image.png

callback urlの設定, verify

このリンク先から auth 用 と Event API 用をそれぞれ設定する.

Screenshot from Gyazo

(at channel police では InteractiveMessage も使ったので Event Subscriptions の上の Interactive Messages からも callback の設定をしないといけなかった.)

image.png
↑InteractiveMessageってこういうやつ

Events API 用の callback を設定する時は verify が必要で,

{
    "token": "Jhj5dZrVaK7ZwHHjRyZWjbDl",
    "challenge": "3eZbrw1aBm2rZgRNFdxV2595E9CY3gmdALWMmHkvFXO7tYXAYM8P",
    "type": "url_verification"
}

ってリクエストが飛んでくるので, challenge をまんまオウム返しする必要がある.

rails で書くとこんな感じ.

class ReportController < ApplicationController
  def callback
    @body = JSON.parse(request.body.read)
    case @body['type']
    when 'url_verification'
      render json: @body
    when 'event_callback'
      # ..
    end
  end
end

ref: url_verification event

Events API

websocket を使った Real Time Messaging API というのがあったけど,今回は Events API で十分ぽかったのでコレを使った.

Subscribe する Event を Event Types を参考に Event Subscriptions page で設定する. 今回はユーザからの Message に反応したいだけなので, message.channels のみでいいっぽい.

image.png

あわせて OAuth & Permissions page から Required Scope の設定もする.追加するのは channels:history と,メッセージを送る chat.postMessage というAPIを使用するために chat:write:bot を追加する. (bot は Bot を有効にした時に自動で追加されてる. channels:write はユーザをチャンネルから kick する時に必要だったやつ)

image.png

ref: OAuth Scopes

必要な token

使用する API によって必要な token が違う. Message の post をする chat.postMessage を使うためには bot, workspace, user のどれかの token を使う.

Screenshot from Gyazo

bot token を使えば bot が post するし, user token を使えば authenticate したユーザが post する.tokenは OAuth & Permissions pageで両方見られる.

(ちなみにメンバーをチャンネルから kick する時は User token が必要だったので at channel police は post message と合わせて1つのアプリケーション内で2種類の token を使いわける実装になった.)

オウム返しする

これでオウム返しができるようになる.

def callback
  @body = JSON.parse(request.body.read)
  case @body['type']
  when 'event_callback'
    Slack.configure do |config|
      config.token = ENV['SLACK_BOT_USER_TOKEN']
    end
    client.chat_postMessage(
      as_user: 'true',
      channel: @body['event']['channel'],
      text: @body['event']['text']
    )
    end
    head :ok
  end
end

あとがき

ただオウム返しさせるだけでやること多くて疲れたし,設定ページで見たいリソースがどこにあるのかがわかりづらくていちいちたどるのに時間がかかった.
slack-ruby-client という公式のgemを使ったけど, chat_postMessage とかいう名前のメソッドを見てつらい気持ちになった.

at channel police を完成させる元気はなくなってしまったけどこのまま成果ゼロは嫌だったので知見だけまとめた.

REF

Slack-Ruby-Onboarding-Tutorial

31
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
23