Rust で slack-morphism を使って Slack にメッセージを送る
内容
Rust
の slack-morphism
クレートを使って Slack にメッセージを送る。
Slack に API を使ってメッセージを送るだけならばプランを問わず Free プランでも チャンネル あたり 1秒1件 メッセージを送ることができる。
Burst 送信で多少オーバーすることはできるらしい。
少し厳しい条件だが通知を集約したりなどすれば実用上は問題がない印象。
具体的な curl でのリクエストや、レガシーな手法を比較しながら、現在(2025年6月)一番モダンな Slack Block API を使ったコードを示す。
準備
アプリの作成
-
https://api.slack.com/apps からアプリを作成する。 "From scratch" を選択する。
-
"New app & choose workspace" でフォームに従って入力して "Create App"。
-
アプリの "OAuth & Permission" の項目から "Scopes" の "Bot Token Scopes" で
chat:write
を付与する。
-
"Install to <WORK-SPACENAME>" でワークスペースに組み込む。
-
Bot User OAuth Token
を取得する。
Slack チャンネルに設定する。
-
Slack チャンネルの "チャンネル情報" の最下部の
チャンネル ID
を取得する。 -
Slack チャンネルの "インテグレーション" の App から "アプリを追加" する。
時々、アプリが表示されない時があるがチャンネルにユーザーを追加するように @ でチャンネルに招待すると追加できる。
slack-morphism
Install
cargo add slack-morphism --features=hyper
cargo add tokio --features=full
Client の作成
環境変数から先ほど取得した SLACK_TOKEN
(Bot User OAuth Token
) と CHANNEL_ID
(チャンネル ID
) を渡す。
次のように環境変数を渡すといい。
SLACK_TOKEN= \
CHANNEL_ID= \
cargo run
Block の作成
Block API は https://slack.com/api/chat.postMessage
に対して
{
"blocks": []
}
という形の JSON を送ることになる。
今回はテキストを送信する。
実際の REST API のリクエストとしては下記のような JSON が送られることとなる。
{
"blocks": [
{
"type": "section",
"text": {
"type": "plain_text",
"text": "Hello"
}
}
]
}
Reference:
curl で書くならば
SLACK_TOKEN=
CHANNEL_ID=
curl -i -X POST https://slack.com/api/chat.postMessage \
-H "Authorization: Bearer $SLACK_TOKEN" \
-H "Content-Type: application/json; charset=utf-8" \
-d "{
\"channel\": \"$CHANNEL_ID\",
\"blocks\": [
{
\"type\": \"section\",
\"text\": {
\"type\": \"plain_text\",
\"text\": \"Hello\"
}
}
]
}"
という形になる。
Legacy な書き方
古い記事や簡易的な方法として書かれているが、レガシーだから使ってはいけない。
参考までに載せておく。
JSON のフォーマットとしては
{
"text": "Hello"
}
まとめ
Slack の API を slack-morphism
で叩く方法を述べた。
Slack のメッセージ送信においては非推奨な書き方で書かれた記事などが多く出てくる。
テキストの送信は述べたとおりであるが、 Slack のテキストの横に色をつける attachments API
の color
も代替手段はないが非推奨である。
Slack の通知などはプロジェクトでもメンテナンスはあまりされない機能だろう。これから新しく作る場合は Block API のみで書くことを推奨する。
Discussion