crashRT のブログ

技術とかそれ以外とか

Slack BotをAPIから作ってみた

Slack Botをたくさん作る必要があったのでAPIから作ろうとしてみました。 ここにマニフェストを使ってAPIからBotを作れると書いてあります。 api.slack.com

まとまった情報があまりなかったのでまとめてみます。 pythonのslack_boltを使っています

App configuration token を取得

API からSlackAppを作るにはApp configuration tokenが必要になります。 以下のサイトに行き「Generate Token」を実行すると取得できます。

api.slack.com

Slack Appの作成

app.client.apps_manifest_create を呼び出すとSlackAppを作成できます。

引数は2つ:

  • token:先ほど取得した App configuration token を使う
  • manifest:今はスコープの設定などができないので、必須のものだけ設定しておく

マニフェストはこんな感じでやってみました:

{
    "display_information": {
        "name": "Sample App",
    }
}

Pythonで書くとこんな感じ:

  import os
  from dotenv import load_dotenv
  from slack_bolt import App

  load_dotenv(".env")
  TOKEN = os.getenv('TOKEN')

  app = App(token=TOKEN)

  app_name = "SampleApp"

  # まずアプリを作成
  init_manifest = {
    "display_information": {
        "name": app_name,
    }
  }

  resp = app.client.apps_manifest_create(token=TOKEN, manifest=init_manifest)

  if not resp["ok"]:
      raise Exception(resp)

  app_id = resp["app_id"]
  oauth_url = resp["oauth_authorize_url"]

App configuration tokenは.envファイルから読み出しています。 レスポンスにapp_idoauth_authorize_urlがあるので取り出しておきます。

詳細はapps.manifest.create についてのドキュメントを見てください。 api.slack.com

アプリの設定をする

app.client.apps_manifest_updateマニフェストの更新ができるので、ここで色々設定をします。 マニフェストについては以下のドキュメントが参考になります。 api.slack.com

必要な引数は3つ。

  • token: 同じくApp configuration tokenを使う
  • app_id : App作成時のレスポンスに含まれる app_id を使う
  • manifest : ドキュメントを参考にJSONなどの形で書く

pythonで書くとこんな感じ:

  manifest = {
    "display_information": {
        "name": str(app_name),
    },
    "features": {
      "bot_user": {
          "display_name":"hoge"
      },
    },
    "settings": {
      "socket_mode_enabled": True,
      "event_subscriptions": {
        "bot_events": [
        ]
      },
    },
    "oauth_config": {
      "scopes": {
        "bot": [
          "chat:write",
          "chat:write.public",
        ]
      },
      "redirect_urls": [
        str(oauth_url)
      ]
    }
  }

  resp = app.client.apps_manifest_update(
      token=TOKEN,
      app_id=app_id,
      manifest=manifest,
  )

  if not resp["ok"]:
      raise Exception(resp)

  print("------------------")
  print(app_name + " を作成しました")

APIの詳細については apps.manifest.update についてのドキュメントを見てください。 api.slack.com

トークンの取得など

App-Level Tokens や Bot User OAuth Token などはAPIからは取得できないので、webから管理画面にアクセスして取得するしかないようです。 管理画面のURLは https://api.slack.com/apps/<app_id> となります。

さいごに

SlackAppをたくさん作る必要があるときに使えば多少手間は省けそうな感じでした。 本当はトークンの取得まで自動でしたかったのですが、流石にできないようです。ここは画面ポチポチするしかなさそうですね〜

僕が書いたコードがあるリポジトリのリンクを一応貼っておきます。使い捨てで書いたコードなのであまりきれいではないですが... github.com

参考資料