Cloudflare Workers から Slack にメッセージする

# Bot User OAuth Token の作成

こちらの記事に倣って、作成できます。

> [Slack API を使用してメッセージを投稿する](https://zenn.dev/kou_pg_0131/articles/slack-api-post-message)

# Slack チャネル作成

チャネルを作成し、Bot が投稿できるように Integrations を追加します。

![image-20221105014944617](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20221105014944617.png)

# コード準備

[kyouheicf/workers-slack-cron](https://github.com/kyouheicf/workers-slack-cron) のコードを使います。基本パターンとして、以下の記事を参照しました。

> [Build and Post Messages to Slack Using Javascript and the Slack API | by Alejandro González | Trabe | Medium](https://medium.com/trabe/build-and-post-messages-to-slack-using-javascript-and-the-slack-api-55c9b4f43ae7)

```shell
git clone https://github.com/kyouheicf/workers-slack-cron
cd workers-slack-cron
```

# wrangler インストール

```shell
# npm install -g wrangler
% wrangler --version  
 ⛅️ wrangler 2.1.15 
--------------------
```

# ローカルテスト用の環境変数設定

`.dev.vars` に設定します。

```toml:.dev.vars
SLACK_BOT_ACCESS_TOKEN = "xoxb-xxx"
SLACK_BOT_ACCESS_CHANNEL = "your-channel-name"
```

# ローカル Cron Trigger テスト

> [Cron Triggers · Cloudflare Workers docs](https://developers.cloudflare.com/workers/platform/triggers/cron-triggers/)

以下のコマンドで実施できます。

```shell
wrangler dev --test-scheduled
```

で立ち上げた後に、`__scheduled`エンドポイントにリクエストを投げます。

```shell
curl "http://localhost:8787/__scheduled?cron=*+*+*+*+*"
```

すると、以下のように確認できます。

```shell
% wrangler dev --test-scheduled
 ⛅️ wrangler 2.1.15 
--------------------
Using vars defined in .dev.vars
Your worker has access to the following bindings:
- Vars:
  - SLACK_BOT_ACCESS_TOKEN: "(hidden)"
⬣ Listening at http://0.0.0.0:8787
- http://127.0.0.1:8787
- http://192.168.1.11:8787
Total Upload: 10.12 KiB / gzip: 2.81 KiB
1:19:28 AM GET /__scheduled 200
cron processed: event cron = * * * * *
cron processed: event type = scheduled
cron processed: event scheduledTime = 1667578768096
cron processed: event scheduledTime date = Fri Nov 04 2022 16:19:28 GMT+0000 (Coordinated Universal Time)
cron processed: event scheduledTime date jst = 11/5/2022, 1:19:28 AM
╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ [b] open a browser, [d] open Devtools, [l] turn on local mode, [c] clear console, [x] to exit                                                                                  │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
```

Slack でもメッセージを受信できたことが確認できます。

![image-20221105013736227](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20221105013736227.png)

# シークレット設定

作成した Bot User OAuth Token と Slack チャネル名をシークレットとして、設定します。

```shell
wrangler secret put SLACK_BOT_ACCESS_TOKEN
wrangler secret put SLACK_BOT_ACCESS_CHANNEL
```

# Cron Trigger で公開

`wrangler.toml` ファイルに以下のように、記述します。
（`"* * * * *"` だと毎分実行）

```toml:wrangler.toml
[triggers]
crons = [ "* * * * *" ]
```

以下のコマンドで公開し、定期実行させます。

```shell
wrangler publish src/index.js
```

# Cron Trigger の確認

Cron Trigger により定期実行されるまで、多少時間がかかるケースがあります。

> Testing Cron Triggers and potential delays
>
> The recommended way of testing Cron Triggers is using Wrangler. Changes such as adding a new Cron Trigger, updating an old Cron Trigger, or deleting a Cron Trigger may take several minutes to propagate to the Cloudflare network edge.

Cloudflare Workers が Cron Trigger により定期実行され、Slack にメッセージされたことが確認できます。

![image-20221105020048280](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20221105020048280.png)

Real-time Logs でも定期実行の様子が確認できます。

![image-20221105015940958](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20221105015940958.png)

# 参考

- [codewithkristian/workers-slack-bot](https://github.com/codewithkristian/workers-slack-bot)
- [JavaScript で実行環境に左右されず常に JST 日本時間を取得する - Neo's World](https://neos21.net/blog/2020/12/09-01.html)
- [日本時間を取得 - JavaScript | nju33](https://nju33.com/notes/javascript/articles/%E6%97%A5%E6%9C%AC%E6%99%82%E9%96%93%E3%82%92%E5%8F%96%E5%BE%97#JST%20%E3%81%8C%E9%81%B8%E6%8A%9E%E5%8F%AF%E8%83%BD%E3%81%AA%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%AE%E5%A0%B4%E5%90%88)
- [Block Kit を使ってより情報的なレストラン検索コマンドを作ろう | Slack](https://api.slack.com/lang/ja-jp/slash-block-kit)
- [Slack appのアイコンを指定する方法 | セミブログ](https://semiyama.com/slack-app-icon/)