Slack API の始め方をまとめました

# Slack API の始め方をまとめました
## 目次
- SlackにAppを登録
- Slack App を作成
- Slack API を利用してメッセージを投稿する。

※ rubyを使用します

## SlackにAppを登録
ブラウザで次のページよりSlack APIにログインする。
https://slack.com/signin

### 開発用のワークスペースを作成

ログインを終えたら次のページより開発テスト用のワークスペースを作成する.
![create_workspace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366451/b6b67064-0f74-7f4d-288a-549e30587b1f.png)
まずは、`+ Create a New Workspace` をクリック。

![workspace_setup_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366451/122211cb-4386-9bbd-de88-3f7dc77f7d42.png)
作成するワークスペースの名前を聞かれるので任意の名前を入力し、`Next`をクリック。
（筆者は 『development』 という名前に設定）

![workspace_setup_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366451/b9fbacc0-7ad0-c24a-b97d-b9470971c0e8.png)
次にワークスペースを利用する目的を聞かれるので任意のメッセージを入力し、`Next`をクリック。
（筆者は 『slack api』 と記述）

![workspace_setup_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366451/4a9ab211-9fbe-f9a5-83c2-dd89c4493acd.png)
次に招待するメンバーを聞かれるので、無視して`Skip this step`をクリック。

![workspace_setup_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366451/ff04a89e-44b8-f3bb-f506-b932c610f3e7.png)
これでワークスペースの作成が完了。

### Slack App を作成する
#### 1. Slack App を作成する
ブラウザで次のページよりSlack Appを作成する。
https://api.slack.com/apps?new_app=1

![create_app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366451/66507078-4b71-ecd5-2349-cd731b37329b.png)
**App Name**
アプリの名前を任意に入力
※ 後から変更可能

**Development Slack Workspace**
アプリを適用するワークスペース(先ほど作成した)を選択
※ 後から変更不可のため注意

入力・選択後`Create App`をクリック。

#### 2. ScopesでSlackアプリの権限を設定

![set_permission.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366451/38d3ab85-86db-e7f3-69ac-0827677429db.png)
`Permission`をクリックし移動

![set_scope.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366451/0893b883-c213-b04f-2aaa-76c3d47b52ed.png)
`Add an OAuth Scope`をクリックした後、`chat:write`を選択し、Scopeを追加する。
(chat:write)によりBotによる投稿が可能になる
※ 後から追加可能

#### 3. アプリをworkspaceにインストールする
![install_app_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366451/db58b800-2c7a-a772-0ed6-292fc7f82d9d.png)
Scopeを設定したページと同様のページにて、
`Install to Workspace`をクリックし、Slackアプリをワークスペースにインストール。

![install_app_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366451/74914c1b-175b-28bf-1bc7-c552808ca4cd.png)
次の様なページが表示されるので`Allow`をクリック。
(ワークスペースないでアプリを実行して良いかを確認しています。)

![install_app_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366451/5525e6c0-e76e-d2da-bb4b-13738714cf77.png)
これでワークスペースへのアプリのインストールが完了しました。
上記の`Bot User OAuth Access Token`は後で使用するのでメモ。

### Slack API を利用してメッセージを投稿する
#### 1. Gemfileを追加する
Gemfileを作成する

```ruby:Gemfile
source 'https://rubygems.org'

gem 'http'
gem 'json'
```

```
$ bundle install
```

#### 2. スクリプト実行用のファイルを用意する

```ruby:test.rb
require 'http'
require 'json'

BOT_USER_ACCESS_TOKEN="< 先ほどメモしたBot User OAuth Access Token をコピペ >"

response = HTTP.post("https://slack.com/api/chat.postMessage", params: {
  token: BOT_USER_ACCESS_TOKEN,
  channel: '#random',
  text: 'hello slack',
  as_user: true
  })
puts JSON.pretty_generate(JSON.parse(response.body))
```

**解説入り**

```ruby:test.rb
# Apiリクエスト送信に用いる
require 'http'
# Jsonデータ作成に用いる
require 'json'

# ACCESS_TOKENを設定
# Scopeへのアクセスに利用する
BOT_USER_ACCESS_TOKEN="< 先ほどメモしたBot User OAuth Access Token をコピペ >"

# HTTPリクエストを特定にSlackApiのURLに送信する
# chat.postMessage では投稿を作成する
# paramsの中身は指定された値を渡す
response = HTTP.post("https://slack.com/api/chat.postMessage", params: {
  token: BOT_USER_ACCESS_TOKEN,
  channel: '#random',
  text: 'hello slack',
  as_user: true
})
puts JSON.pretty_generate(JSON.parse(response.body))
```

**paramsの中身について**

<table>
  <tr>
    <td>token</td>
    <td>認証トークンを指定</td>
  </tr>
  <tr>
    <td>channel</td>
    <td>メッセージを投稿するチャンネルを指定</td>
  </tr>
  <tr>
    <td>text</td>
    <td>メッセージを指定</td>
  </tr>
  <tr>
    <td>as_user</td>
    <td>trueを渡すと認証されたユーザーとしてメッセージが投稿される</td>
  </tr>
</table>

詳しくはこちらのページに記載されています。
https://api.slack.com/methods/chat.postMessage

今回はメッセーを投稿するために`chat.postMessage`を用いましたが他にも様々なapiメソッドが用意されています。
https://api.slack.com/methods

#### Botをチャンネルに招待する
![invite_bot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366451/f84fd2a8-059a-07eb-40bf-4ef23f8a57de.png)
Apiによるメッセージの送信に用いるチャンネルのメッセージにて
`/invite @<Bot_Name>`を入力し、Botをチャンネルに招待する。

#### 3. 実行

次のコマンドによりスクリプトを実行

```
$ bundle exec ruby test.rb
{
  "ok": true,
  "channel": "...",
  "ts": "...",
  "message": {
    "bot_id": "...",
    "type": "message",
    "text": "hello slack",
    "user": "...",
    "ts": "...",
    "team": "...",
    "bot_profile": {
      "id": "...",
      "deleted": false,
      "name": "test_app",
      "updated": ...,
      "app_id": "...",
      "icons": {
        "image_36": "https://a.slack-edge.com/80588/img/plugins/app/bot_36.png",
        "image_48": "https://a.slack-edge.com/80588/img/plugins/app/bot_48.png",
        "image_72": "https://a.slack-edge.com/80588/img/plugins/app/service_72.png"
      },
      "team_id": "..."
    }
  }
```
実行結果が上記のようになっていれば成功です！

Slackを確認してみましょう！
![success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366451/82655c68-6926-aae9-b842-dd333612bc77.png)
反映されていますね、これにて終了です。
お疲れ様でした :grin:

#### エラーについて
エラーについて簡単にまとめたので参考までに

<table>
  <tr>
    <td>channel_not_found</td>
    <td>チャンネルが存在しない</td>
  </tr>
  <tr>
    <td>not_authed</td>
    <td>認証トークンが設定されていない、もしくは間違っている</td>
  </tr>
  <tr>
    <td>missing_scope</td>
    <td>スコープ権限が正しく設定されていない</br>設定を変更したらreinstallが必要</td>
  </tr>
  <tr>
    <td>not_in_channel</td>
    <td>チャンネルにBotが追加されていない</td>
  </tr>
</table>