slack api でのメッセージ送信Eventを確認する 〜 integromat

# はじめに
応答するbotをslackとintegromatを連携して作成し、やっと疑問が残るところが解消されたので、まとめました。
ポイントは

- 受けたWebhookは3秒以内にレスポンスを返す
- botとユーザ（bot以外）を見分けよう

です。


![スクリーンショット 2020-10-24 20.29.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/329d18b1-6355-e883-2a76-d86f9ce6ad50.png)

# メッセージ送信時のEventAPIの発生

認証時のEventAPIについては、[こちら](https://qiita.com/nofrmm/items/c05fa1cc54c1c58c5b51)に記載しました。

ユーザのメッセージ送信以外にbotからのメッセージ送信についてもEventAPIが送信されます。

![スクリーンショット 2020-10-23 18.22.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/8c5569d4-d5b8-a537-2778-6a3a4e5455e9.png)

## ユーザがslackからメッセージ送信した時のフロー
![スクリーンショット 2020-10-26 6.29.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/66beca6c-3a49-aa06-c91d-f1c7a27c32e3.png)

### Webhookの内容
要素のいくつかはマスクしています。
使用しているパラメータは

- `event.type`
- `event.text`
- `event.user`
- `event.channel`
![スクリーンショット 2020-10-23 18.36.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/bd55b06c-dc4c-851b-78c3-b57bf32325af.png)

### webhookへのレスポンスは3秒以内に
Webhookへのリクエストはbotもユーザ同様に送信されてきます。
いずれもレスポンスにステータス200を返し、EventAPIに3秒以内でリターンします。
以降の処理はbotのuseridを取得してフィルターの対象にします。

ただ、実際組んだこのシナリオでは3秒以内にリターンできないことがままありました。

![スクリーンショット 2020-10-23 21.34.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/4c18b05a-2343-67b2-f026-e91e96e68f72.png)

### 取得したtextからデータを取得

ものすごく適当なテストデータです。
data storeから取得する時も、別のリソースから取得する方法はいくつもありますので
参考程度に。

![スクリーンショット 2020-10-23 22.23.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/47fb1c9e-a0ff-2236-1acf-503f7216651f.png)

![スクリーンショット 2020-10-23 22.49.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/2c3c7257-a326-dcbc-f58b-9ee1584a0c5a.png)


### Bundle別に取得したデータをひとつのBundleのArrayに

![スクリーンショット 2020-10-23 22.55.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/e029ae90-d4e6-5e3b-b089-b76358fa7e26.png)

![スクリーンショット 2020-10-23 22.43.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/75c2b507-a4a7-dd06-516f-d1059d7a2a94.png)

### Arrayをフィルタして要素を取り出す

![スクリーンショット 2020-10-23 22.55.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/7f243242-884c-3c18-e7c2-156e374ba64c.png)

### メッセージを送信

channelにはevent.channelを使用します。
メッセージ送信にはim.openでチャンネルを開ける必要がありますが、botアプリのメッセージ欄では最初から開いています。

![スクリーンショット 2020-10-23 23.04.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/0d396736-4220-af6c-40d9-912657a3f103.png)


## botからのメッセージ送信をした後のフロー

リクエストを受けてレスポンスを返すだけ、を適当に対応すると
繰り返しbotメッセージが送信されるループに入ります。

![スクリーンショット 2020-10-24 0.23.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/2050bfbf-2d2f-e9f7-7422-b6829851f686.png)

### エラーと判定される条件の確認
こちらを確認してください。
https://api.slack.com/events-api#the-events-api__field-guide__error-handling__failure-conditions

RouterでWebhookのレスポンスと、テキストによる検索を並列にしていた時に繰り返し送信したメッセージが表示されるので、直列に修正しました。
VirifyずみのWebhookには3秒ルールしないと、最高三回メッセージが投げられます

ヘッダーに理由と実施回数を乗せて送信されてくるので、メッセージが繰り返されたら要チェックです。
![スクリーンショット 2020-10-24 1.08.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/fb00146d-1918-98a3-75b7-7681cc8e1157.png)

## リトライのリクエストを受けた後のフロー

ステータスコードに`502`、headerに`X-slack-No-Retry`をつけて返しています。
![スクリーンショット 2020-10-24 21.02.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/fe00b24d-9bc2-fffe-dc71-f3fc853cfa36.png)


# 最後に
integromatでslackを扱う場合、モジュールが用意されているので概ねそちらを使えば支障はないかと思います。workspaceにintegromatアプリを追加するあたりが忌避要素でした。
シナリオだとAPIレベルで何をやっているか知るためには、サーバもいらないですし、エラー対応も独自で組めるのが良いところだと思います。
よくないところでは、Webhookの初期化で1秒近くかかる場合も確認していて、
使用するモジュールが増えると全てを初期化する時間がWebhookの応答を遅らせました。