Slack Appを作成し、Bot Userとして、任意のチャネルに投稿する（Slackの設定 & curlコマンド）

## 概要

この記事では、以下の2点を扱います：

1. プログラムからSlackに投稿するために必要なSlackの設定
2. `curl`コマンドでSlackの任意のチャネルに投稿する

## 動作環境

```console
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.4
BuildVersion:	18E226
$ curl --version
curl 7.54.0 (x86_64-apple-darwin18.0) libcurl/7.54.0 LibreSSL/2.6.5 zlib/1.2.11 nghttp2/1.24.1
(以下略)
```

## Slackの設定

slackapi/python-slackclientのドキュメントがわかりやすかったです。
https://github.com/slackapi/python-slackclient/blob/master/tutorial/01-creating-the-slack-app.md

前作業：投稿したいワークスペースにブラウザでログインしておくことで、スムーズに運びました

1. https://api.slack.com/apps?new_app=1 にアクセス
    - 名前とワークスペースを指定してAppを作成
<img width="991" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82132/e8797c65-74f7-0240-0ffc-8ab17f433c2a.png">
2. 1で作ったアプリの設定画面が表示されます。左側の **Features** の *Bot User* という項目から Bot Userとして追加
    - Bot User名を指定する
<img width="990" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82132/5ebde1ef-4499-8d85-02b7-a2fe8097a9a0.png">
3. 左側の **Settings** の *Install App* という項目から ワークスペースにAppをインストール
<img width="982" alt="Appのインストールを許可する画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82132/142d3d07-1abe-092f-bc6b-bb79be77c6fc.png">
    - インストール後に表示される **Bot User OAuth Access Token** をこの後使います[^1][^3]
<img width="984" alt="slack_bot_user_tokens.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82132/903c3eed-b59d-6f80-ae58-24f3d403a039.png">

[^1]: トークンの確認や、Slack App の管理は、https://api.slack.com/apps にアクセスすることで行えるようです
[^3]: この記事では使っていない「OAuth Access Token」ですが、[Slack Web API](https://api.slack.com/web)を呼び出す際に使いました（Testerに設定したり、URLのクエリに渡したりします）

## `curl`で投稿する

Slackのドキュメント https://api.slack.com/web のサンプルにならって、`curl`[^2]でSlackに投稿してみます。

- 投稿先チャネル：#experiments（`--data`に指定したJSONのchannel）
- 投稿内容：Slack post by curl（`--data`に指定したJSONのtext）

```console
$ curl -X POST -H 'Authorization: Bearer xoxb-1234-56789abcdefghijklmnop' \
-H 'Content-type: application/json' \
--data '{"channel":"experiments","text":"Slack post by curl"}' \
https://slack.com/api/chat.postMessage
```

※1つ目のヘッダ（`-H`）は`xoxb-...nop`の部分を、上でインストールしたAppのBot User OAuth Access Tokenに置き換えます

日本語でも投稿できました。

<img width="849" alt="experimentsチャネルに英語でも日本語でも投稿" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82132/c43aa5bd-2c0b-ad84-831c-7b596d1befb0.png">

[^2]: curlはOSに合わせてインストールしてください。ここでは詳細には立ち入りませんが、macOS環境には`brew`（Homebrew）でインストールしました。例えば、Ubuntuには`apt`でインストールすることになると思います

## Incoming Webhookと何が違うのか

プログラムからSlackに投稿する仕組みとしては *Incoming Webhook* も知られています。
設定方法は例えば、以下のドキュメントが参考になります：https://api.slack.com/messaging/webhooks

Incoming Webhookのイメージは、「*特定のチャネル* に投稿できるURL」です。
そこに投稿内容のJSONをPOSTすることで投稿されます。

この記事で扱ってきたBot Userとの違いは、Bot Userであれば**投稿するチャネルを任意に変えられる**ことと考えています。
上記のcurlコマンドで投稿先チャネルの指定を変えることで、簡単に他のチャネルに投稿できます（#generalに変える例を示します）。

```console
$ curl -X POST -H 'Authorization: Bearer xoxb-1234-56789abcdefghijklmnop' \
-H 'Content-type: application/json' \
--data '{"channel":"general","text":"Slack post by curl"}' \
https://slack.com/api/chat.postMessage
```

ただ、私自身そこまでSlackのAPIを使い込んでいるわけではありませんので、Incoming Webhookでしかできないことがあればコメントなどで教えていただけると嬉しいです。

追伸
Bot Userはどのチャネルにも投稿できる分、広い範囲へのアクセス権限が与えられます。
それに対しIncoming Webhookは、1チャネルだけとアクセス権限が狭められるという利点があるかもしれません（詳しく調べてはいませんが）。