シェルスクリプトを使ってSlackで複数人にDMを送る方法

シェルスクリプトを使って複数人にSlack DMを送る方法です。比較的よく使うので備忘録として残しておきます。なお、この記事は少し前にQiitaに投稿した「Slackで複数人にDMを送る方法の記録」という記事を移動したものです。

1. はじめに

Slackで困ることの一つに、一度に大量のDMを送るのが難しいというのがあります。メールの場合はBCCにメールアドレスを設定すればいいのですが、SlackはBCC的な使い方が公式で用意されてない?ように思います(もしかしたらあるのかもしれないですが)。チャンネルを使えばいいのではという話もあるかもしれないのですが、チャンネルでの通知では不十分であったり、チャンネルにできないような場合もあったりします。

例えば、催促の連絡する場合、関係するチャンネル上で連絡するより該当者に個別でDM連絡した方が目につきやすく回答率が高くなることに加え、関係ない人には催促の連絡が表示されないというメリットがあると思います。また、該当者のチャンネルを作らずに当人のみに送る方が良い場合もあります。数人であれば手動でDMを送れるのですが、数十人規模となると手動ではめんどうです。Slack APIを使うとしても、毎回、どうやるんだっけと調べているので、備忘録として、やり方をまとめておきます。下記は自動でDMを送ったときのSlack上の送信履歴の様子です。

2. Slack側の設定

まず、Slack Appを作成するために https://api.slack.com/apps にアクセスします。「Create New App」、「From scratch」をクリックします。出てきたウインドウでアプリの名前を決めれるので、App Nameに適当な名前(例:sample-bot)を入れて、アプリを入れたいワークスペースを選択後、「Create App」 をクリックします。

続いて、表示された画面の左側の一覧から「OAuth & Permissions」を探して選択します。

さらに出てきた画面をスクロールし、Scopesセクションを探します。ScopesセクションにあるUser Token Scopesの下にある、「Add an OAuth Scope」をクリックすると、アプリに与える権限を追加することができるので「chat:write」と「im:write」を選択します。下図は権限が追加された後の状態です。

さらに、画面の左側の一覧から 「Install App」を選択し、「Install to ワークスペース名」をクリック、「許可する」をクリックします。成功すると、下図のように、User OAuth Tokenの欄に xoxp- からはじまるトークンが表示されます。後ほどこのトークンを使うのでコピーしておきます。

3. 同じメッセージを複数人にDMで送る場合

いろいろやり方はあると思いますが、この記事では、ローカルPC上のシェルスクリプトとcurlを使ってSlack APIを叩く方法でDMを送ります。

まず、DMを送信したいメンバーのメンバーIDを1行ずつ記述したテキストファイル(例:user_ids.txt)を作成します。メンバーIDの収集方法はこの記事の範囲外としますが、管理者であれば管理画面からメンバーIDリストを取得できます。管理者以外の場合はAPIを使って取得する方法があるようです。

U01234567
U02345678
U03456789
...

さらに、下記のコードを send_dm.sh のような名称で user_ids.txt と同じディレクトリに保存します。トークンのところには、Slack側の設定時に取得した xoxp- からはじまるトークンを記入します。なお、今回の記事作成にあたって、一部生成AIのコードを参考にしました(これまで使っていた自作コードと大枠は同じでしたが、エラー処理がきちんと書かれてました)。

#!/bin/bash

# --- 設定 ---
# トークン
SLACK_TOKEN="xoxp-xxx"

# 送信メッセージ
MESSAGE="こんにちは!\nこれはテストメッセージです。"

# ユーザーIDリストのファイル名
USER_LIST_FILE="user_ids.txt"
# ------------

if [ ! -f "$USER_LIST_FILE" ]; then
    echo "エラー: $USER_LIST_FILE が見つかりません。"
    exit 1
fi

echo "送信を開始します..."

# リストを1行ずつ読み込んで処理
while IFS= read -r user_id || [ -n "$user_id" ]; do
    if [ -z "$user_id" ]; then
        continue
    fi

    echo "Sending to: $user_id"

    response=$(curl -s -X POST "https://slack.com/api/chat.postMessage" \
        -H "Authorization: Bearer $SLACK_TOKEN" \
        -H "Content-type: application/json" \
        --data "{
            \"channel\": \"$user_id\",
            \"text\": \"$MESSAGE\"
        }")

    if echo "$response" | grep -q '"ok":true'; then
        echo "  -> Success"
    else
        echo "  -> Failed: $response"
    fi

    sleep 0.5

done < "$USER_LIST_FILE"

echo "全ての処理が完了しました。"

ターミナルで実行権限をつけて実行してみます。

$ chmod +x send_dm.sh
$ ./send_dm.sh

DM送信に成功すると下記のように表示されます。

送信を開始します...
Sending to: xxxxxxx 
  -> Success
Sending to: xxxxxxx 
  -> Success
Sending to: xxxxxxx 
  -> Success
全ての処理が完了しました。

自分のアカウントからDMの送信履歴があれば成功です。

4. ユーザ毎に異なるメッセージをDMで送る場合

一方、個別に異なるメッセージを送りたい場合もあります。その場合は、DMを送信したいユーザーのID(メンバーID)とメッセージをカンマで区切って1行ずつ記述した下記のようなCSVファイル(例:user_messages.csv)を作成します(メッセージの文字コードはUTF-8である必要があるので環境によっては注意が必要です)。

U01234567,おはようございます!
U02345678,こんにちは!
U03456789,こんばんは!
...

さらに、下記のコードを send_custom_dm.sh のような名称で user_messages.csv と同じディレクトリに保存します。トークンのところには、Slack側の設定時に取得した xoxp- からはじまるトークンを記入します。なお、コード作成にあたり、一部生成AIのコードを参考にしました。

#!/bin/bash

# --- 設定 ---
# トークン
SLACK_TOKEN="xoxp-xxx"

# メッセージファイルのファイル名
DATA_FILE="user_messages.csv"
# ------------

if [ ! -f "$DATA_FILE" ]; then
    echo "エラー: $DATA_FILE が見つかりません。"
    exit 1
fi

echo "個別メッセージの送信を開始します..."

# リストを1行ずつ読み込んで処理
while IFS=, read -r user_id message_text || [ -n "$user_id" ]; do
    if [ -z "$user_id" ] || [ -z "$message_text" ]; then
        continue
    fi

    echo "Sending to: $user_id"
    # echo "  Message: $message_text" 

    response=$(curl -s -X POST "https://slack.com/api/chat.postMessage" \
        -H "Authorization: Bearer $SLACK_TOKEN" \
        -H "Content-type: application/json; charset=utf-8" \
        --data "{
            \"channel\": \"$user_id\",
            \"text\": \"$message_text\"
        }")

    if echo "$response" | grep -q '"ok":true'; then
        echo "  -> Success"
    else
        echo "  -> Failed: $response"
    fi

    sleep 0.5

done < "$DATA_FILE"

echo "全ての処理が完了しました。"

ターミナルで実行権限をつけて実行してみます。

$ chmod +x send_custom_dm.sh
$ ./send_custom_dm.sh

DM送信に成功すると下記のように表示されます。

送信を開始します...
Sending to: xxxxxxx 
  -> Success
Sending to: xxxxxxx 
  -> Success
Sending to: xxxxxxx 
  -> Success
全ての処理が完了しました。

自分のアカウントからDMの送信履歴があれば成功です。

5. おわりに

以上、Slackで複数人にDMを送る方法の記録でした。メッセージを間違えると自分からのDMで間違えたメッセージが送信されるので十分注意ください。