Slack APIを使用してメッセージを送信する

# 概要

SlackのAPIを使用してメッセージを送信するまでの操作メモです。

**環境**

* [Slack] (https://slack.com/) (Free plan).
* curl (Windows版)

**参考**

* [Welcome to the Slack API] (https://api.slack.com/)


## API

Slackの外部からメッセージを送信するにはWEB APIを使用する方法と、Incoming webhooksを使用する方法があります。


### [WEB API] (https://api.slack.com/web)

> The Slack APIs allow you to integrate complex services with Slack to go beyond the integrations we provide out of the box.

WEB APIを利用するには事前にTOKENを取得する必要があります。
用意されているメソッドは[API Methods] (https://api.slack.com/methods)で確認できます。

#### TOKENの取得

左側メニューのチーム名をクリックしコンテキストメニューからConfigure Integrationsを選択します。
IntegrationsページのAll ServicesタブにあるSlack API(ページの下の方にあります)をクリックします。

![s04.png](https://qiita-image-store.s3.amazonaws.com/0/22772/69624de6-7040-e1e7-c806-53a30bfacf08.png)

左側メニューのAPIS -> Web APIをクリックします。

![s05.png](https://qiita-image-store.s3.amazonaws.com/0/22772/9993b112-4792-f444-4bab-1db2210ff980.png)

AuthenticationのCreate tokenボタンをクリックしてTokenを取得します。

![s07.png](https://qiita-image-store.s3.amazonaws.com/0/22772/e9934159-c8f8-327f-1df4-8a549642769c.png)


#### auth.test

tokenのテストができるAPIが用意されていますので、それを使って確認してみます。

```bat:auth.test
curl -XPOST "https://slack.com/api/auth.test?token=<TOKEN>&pretty=1"
```

または

```bat:auth.test
curl -XPOST -d "token=<TOKEN>" -d "pretty=1" "https://slack.com/api/auth.test"
```

***response***

okキーの値がtrueであれば成功です。


#### chat.postMessage

chat.postMessage APIを使ってメッセージを送信してみます。
tokenパラメータに取得したトークンを指定します。

```bat:chat.postMessage
curl -XPOST "https://slack.com/api/chat.postMessage?token=<TOKEN>&channel=%23general&text=Hello%20@rubytomato&username=rubybot"
```

* URLはパーセントエンコードする必要があります。

または

```bat:chat.postMessage
curl -XPOST -d "token=<TOKEN>" -d "channel=#general" -d "text=Hello @rubytomato" -d "username=rubybot" "https://slack.com/api/chat.postMessage"
```

***response***

![s06.png](https://qiita-image-store.s3.amazonaws.com/0/22772/643a8227-eb2d-389b-eb60-e9a2d754ac8c.png)



### [Incoming WebHooks] (https://api.slack.com/incoming-webhooks)

> Incoming Webhooks are a simple way to post messages from external sources into Slack. They make use of normal HTTP requests with a JSON payload, which includes the message and a few other optional details described later.

Incoming WebHooksを使用するには事前にIntegration serviceに登録する必要があります。


#### Integration serviceに登録

Slackの左側メニューのチーム名をクリックしコンテキストメニューからConfigure Integrationsを選択します。
IntegrationsページのAll ServicesタブにあるIncoming WebHooks(ページの下の方にあります)をクリックします。

![s01.png](https://qiita-image-store.s3.amazonaws.com/0/22772/4c54e776-98e0-4c10-8709-ee647e6bebfa.png)

Post to Channelでchannelを選択して登録します。

![s02.png](https://qiita-image-store.s3.amazonaws.com/0/22772/1dcecbe5-efd4-860b-5ee9-b90c47e9bd76.png)

登録するとWebhook URLが発行されますので、そのURLに対してメッセージ登録のHTTPリクエストを発行します。

Webhook URLは下記のような形式です。

`https://hooks.slack.com/services/Txxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxx`


#### メッセージの送信

channelキーを省略するとIncoming WebHooksを登録するときに選択したchannelがデフォルトの送信先となりますが、channelキーを上書きすることで他のchannelへメッセージを送信することができます。

```bat
curl -X POST "<Webhook URL>" -d @message.json
```

```json:message.json
payload={
  "channel": "#general",
  "username": "webhookbot",
  "text": "This is posted to #general and comes from a bot named webhookbot.",
  "icon_emoji": ":ghost:"
}
```

***response***

![s03.png](https://qiita-image-store.s3.amazonaws.com/0/22772/35e1a0a6-2489-531b-fb44-2d6451e4d0f0.png)

**Direct Message**

channelキーに`@ユーザー`を指定するとそのユーザーへDirect Messageを送信できます。

```bat
"channel": "@rubytomato"
```


## メモ

### curl

Windows版のcurlでhttpsに対してリクエストを送ると下記のエラーが発生することがあります。

```text
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
```

このエラーが発生する場合は、http://curl.haxx.se/docs/caextract.htmlにアクセスして最新の証明書を取得します。
このページのca-bundle.crtというテキストリンクをクリックしてその内容をcurl-ca_bundle.crtとしてcurl.exeと同じディレクトリに保存します。

![s08.png](https://qiita-image-store.s3.amazonaws.com/0/22772/7e254bd6-f9da-f618-5e26-a1e48e420aa2.png)


### API TEST

```bat:api.test
curl -XPOST "https://slack.com/api/api.test"
```

```json:response
{"ok":true}
```

クエリにerrorというパラメータが存在するとリクエストは必ず失敗するようになります。

```bat:api.test
curl -X POST "https://slack.com/api/api.test?error=test&foo=bar&pretty=1"
```

または

```bat:api.test
curl -X POST -d "error=test" -d "foo=bar" -d "pretty=1" "https://slack.com/api/api.test"
```

```json:response
{
    "ok": false,
    "error": "test",
    "args": {
        "error": "test",
        "foo": "bar",
        "pretty": "1"
    }
}
```

この形式のリクエストはできないようです。

```bat:api.test
curl -X POST --data-urlencode "{\"error\":\"test\", \"foo\":\"bar\", \"pretty\":1}" "https://slack.com/api/api.test"
```


### Slackのメモ

#### Public Channel

> This will create a new public channel that anyone on your team can join.
> If you need this conversation to be private, you should create a new Private Group instead.

チームに招待されたメンバーであればだれでも参加できるチャネルです。

#### Direct Message

> Direct messages are private, 1-to-1 messages. Once you invite people, you'll be able to chat with them here.

指定するユーザーと直接メッセージの交換ができます。

#### Private Group

> A private group is only visible to its members, and only members of a private group can read or search its contents.

招待したメンバーしか参加できないグループです。


#### Invite People

ユーザーには下記のroleがあり、roleによって操作できる内容が異なります。

* Owner
* Admin
* Member
* Restricted Account
* Single-Channel Guest

##### Full Members

> Full Members can access messages and files in any public channel and access the full team directory.

> Team members have access to standard features like joining any public channel, uploading files, and other optional abilities. This is the default for new people added to your team.

##### Restricted Accounts

> Restricted Accounts see a partial team directory and can only access messages and files from selected channels and groups.

> These accounts can access only a limited set of channels. Restricted accounts are not able to view the entire team directory or search messages and files outside of their permitted channels.

##### Single-Channel Guest

> Single-Channel Guests can only access messages and files in a single channel. This account type is free.

> Guests are a type of Restricted Account that are only allowed to join a single channel or group.


* Free planではRestricted Accounts、Single-Channel Guestは利用できません。
* 有料planではRestricted Accounts、Single-Channel Guestを利用できます。


#### Integrations

Integration serviceを登録するにはチーム名をクリックしコンテキストメニューから"Configure Integrations"をクリックします。

free planでは登録数に制限があります。

* Free planでは`10 service integrations`。
* 有料planでは`Unlimited service integrations`。

下記もIntegration Serviceの1つなので使用するなら有効にする必要があります。

* Incoming WebHooks
* Outgoing WebHooks
* Slackbot

### Desktop Apps for Windows

[Desktop Apps] (https://slack.com/apps)よりダウンロードできます。