1. はじめに
Slackで困ることの一つに、一度に大量のDMを送るのが難しいというのがあります。メールの場合はBCCにメールアドレスを設定すればいいのですが、SlackはBCC的な使い方が公式で用意されてない?ように思います(もしかしたらあるのかもしれないですが)。チャンネルを使えばいいのではという話もあるかもしれないのですが、チャンネルでの通知では不十分であったり、チャンネルにできないような場合もあったりします。
例えば、催促の連絡する場合、関係するチャンネル上で連絡するより該当者に個別でDM連絡した方が目につきやすく回答率が高くなることに加え、関係ない人には催促の連絡が表示されないというメリットがあると思います。また、成績が芳しくない人に連絡する場合など、該当者のチャンネルを作らずに当人のみに送る方が良い場合もあります。数人であれば手動でDMを送れるのですが、数十人規模となると手動ではめんどうです。Slack APIを使うとしても、毎回、どうやるんだっけと調べているので、備忘録として、やり方をまとめておきます。
2. Slack側の設定
まず、Slack Appを作成するためにhttps://api.slack.com/apps にアクセスします。Create New App 、 From scratch をクリックします。出てきたウインドウでアプリの名前を決めれるので、App Nameに適当な名前(例:tngc-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で間違えたメッセージが送信されるので十分注意ください。



