🧱

Rust で slack-morphism を使って Slack にメッセージを送る

に公開

内容

Rustslack-morphism クレートを使って Slack にメッセージを送る。

Slack に API を使ってメッセージを送るだけならばプランを問わず Free プランでも チャンネル あたり 1秒1件 メッセージを送ることができる。
Burst 送信で多少オーバーすることはできるらしい。
少し厳しい条件だが通知を集約したりなどすれば実用上は問題がない印象。

具体的な curl でのリクエストや、レガシーな手法を比較しながら、現在(2025年6月)一番モダンな Slack Block API を使ったコードを示す。

準備

アプリの作成

  1. https://api.slack.com/apps からアプリを作成する。 "From scratch" を選択する。

  2. "New app & choose workspace" でフォームに従って入力して "Create App"。

  3. アプリの "OAuth & Permission" の項目から "Scopes" の "Bot Token Scopes" で chat:write を付与する。


  4. "Install to <WORK-SPACENAME>" でワークスペースに組み込む。

  5. Bot User OAuth Token を取得する。

Slack チャンネルに設定する。

  1. Slack チャンネルの "チャンネル情報" の最下部の チャンネル ID を取得する。

  2. 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) を渡す。

https://github.com/Creanciel/ZennSlackMorphism/blob/16df7b1f9b413fc28eb3ec22709819628792a443/block/src/main.rs#L10-L21

次のように環境変数を渡すといい。

SLACK_TOKEN= \
CHANNEL_ID= \
  cargo run

Block の作成

Block API は https://slack.com/api/chat.postMessage に対して

{
    "blocks": []
}

という形の JSON を送ることになる。

今回はテキストを送信する。

https://github.com/Creanciel/ZennSlackMorphism/blob/16df7b1f9b413fc28eb3ec22709819628792a443/block/src/main.rs#L36-L39

実際の REST API のリクエストとしては下記のような JSON が送られることとなる。

{
    "blocks": [
        {
            "type": "section",
            "text": {
                "type": "plain_text",
                "text": "Hello"
            }
        }
    ]
}

Reference:

https://api.slack.com/reference/block-kit/blocks#section

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 な書き方

古い記事や簡易的な方法として書かれているが、レガシーだから使ってはいけない。
参考までに載せておく。

https://github.com/Creanciel/ZennSlackMorphism/blob/16df7b1f9b413fc28eb3ec22709819628792a443/legacy/src/main.rs#L26

JSON のフォーマットとしては

{
    "text": "Hello"
}

まとめ

Slack の API を slack-morphism で叩く方法を述べた。
Slack のメッセージ送信においては非推奨な書き方で書かれた記事などが多く出てくる。
テキストの送信は述べたとおりであるが、 Slack のテキストの横に色をつける attachments APIcolor も代替手段はないが非推奨である。

https://api.slack.com/messaging/attachments-to-blocks#direct_equivalents

Slack の通知などはプロジェクトでもメンテナンスはあまりされない機能だろう。これから新しく作る場合は Block API のみで書くことを推奨する。

Discussion