処理結果をSlackとMacの通知に自動で飛ばす方法

処理結果をSlackとMacの通知に自動で飛ばす方法 定期実行と通知

集計が自動で動くようになっても、結果を見に行かなければ意味がありません。

ファイルに保存されているだけでは、結局開かなくなります。私は最初これで失敗しました。作った本人が3週間見ていませんでした。

そこで、結果のほうから届くようにしました。使っているのは2つです。

届け方 役割
チャット(Slack) 内容そのものを送る。あとから見返せる
Macの通知 要点だけ画面の隅に出す。今すぐ気づける

この2つは役割が違うので、両方使っています。


Slackに送る:URLを1つもらうだけ

Slackに外部から書き込むには Incoming Webhook という仕組みを使います。プログラムからSlackに投稿するための、専用の宛先URLです。

受け取り方

  1. Slackの管理画面でアプリを新規作成する
  2. Incoming Webhook を有効にする
  3. 投稿したいチャンネルを選ぶ
  4. https://hooks.slack.com/services/... というURLが発行される

無料プランで使えます。ここまで5分ほどです。

送る

あとは、そのURLに文章を投げるだけです。

curl -s -X POST -H 'Content-type: application/json' \
  --data '{"text":"月末着地の集計が終わりました"}' \
  "https://hooks.slack.com/services/..."

これだけでチャンネルに投稿されます。


⚠️ URLをプログラムに直接書かない

ここが最も注意すべき点です。

このURLを知っている人は、誰でもそのチャンネルに書き込めます。 パスワードと同じ扱いが必要です。

プログラムの中に直接書くと、次の事故が起きます。

  • ファイルを人に渡したときに一緒に漏れる
  • 手順を記事やチャットに貼ったときに写り込む

私は別ファイルに置いて、プログラムからは読むだけにしています。

# URLだけを書いたファイルを作る(本人以外読めないようにする)
echo 'https://hooks.slack.com/services/...' > ~/scripts/keiri/.slack_webhook
chmod 600 ~/scripts/keiri/.slack_webhook

プログラム側では、こう読みます。

HOOK=$(head -1 "$HOME/scripts/keiri/.slack_webhook")

curl -s -X POST -H 'Content-type: application/json' \
  --data "{\"text\":\"集計が終わりました\"}" "$HOOK"

💡 万一漏れても、SlackでそのWebhookを無効にすれば止まります。 作り直して、ファイルを差し替えるだけです。この復旧のしやすさも、ファイルに分けておく利点です。


集計結果をそのまま流す

実際には、決まった文言ではなく計算結果を本文にして送ります。

注意点が2つあります。改行と引用符です。 そのまま送ると形が崩れたり、送信自体が失敗します。

OUT="$HOME/scripts/keiri/着地予想.txt"
HOOK=$(head -1 "$HOME/scripts/keiri/.slack_webhook")

# 引用符を打ち消し、改行を \n に置き換える
BODY=$(sed 's/\\/\\\\/g; s/"/\\"/g' "$OUT" | awk 'BEGIN{ORS="\\n"}{print}')

curl -s -X POST -H 'Content-type: application/json' \
  --data "{\"text\":\"📊 *月末着地予想* ($(date '+%-m月%-d日'))\n\`\`\`${BODY}\`\`\`\"}" \
  "$HOOK"

本文を ``` で囲むのがコツです。 Slackで等幅表示になり、桁が揃って読みやすくなります。数字を送るならこれをおすすめします。


Macの通知に出す

Slackは見返せますが、他の会話に流されます。 そこで、要点だけをMacの通知に出しています。

追加のソフトは不要です。Macに標準で入っているコマンドで出せます。

osascript -e 'display notification "止まっているチーム: 3 / 8" \
  with title "週次チェック" subtitle "詳細はログを確認" sound name "Glass"'
部分 役割
display notification 本文(ここを短くする)
with title 見出し
subtitle 補足
sound name 音。省くと無音

本文には結果の要点を1行だけ入れます。 通知は数秒で消えるので、詳細を入れても読めません。

結果から1行だけ抜いて通知する

LINE=$(grep "全社合計" "$OUT" | tail -1)
[ -z "$LINE" ] && LINE="集計は終わりましたが、結果が読めませんでした"

osascript -e "display notification \"${LINE}\" \
  with title \"月末着地予想\" sound name \"Glass\""

2行目を入れておいてください。 集計が途中で失敗したとき、通知が空になると「動かなかった」のか「気づかなかった」のか分からなくなります。


通知先は用途ごとに分ける

運用してみて分かったことです。

すべての通知を同じチャンネルに流すと、読まれなくなります。

私は分けています。

内容 宛先 頻度
経理の着地予想 経理用チャンネル 月1回
チームの停滞チェック 別チャンネル 週1回

Webhookのファイルも別々にしています。片方を止めたくなったときに、もう片方に影響しません。

⚠️ 通知は増やすほど価値が下がります。
「毎日届くが誰も読まない通知」は、無いのと同じです。読む気になる頻度に落としてください。


成功したときも通知するか

意見が分かれるところですが、私は成功時も通知しています。

理由は単純で、失敗したときだけ通知する設計だと、「通知が来ない」の意味が2通りになるからです。

  • 正常に動いて、問題がなかった
  • そもそも動いていなかった

この2つを区別できないのは危険です。月1回の集計なら、成功も通知して困りません。

ただし毎日動くものは話が別で、成功通知が毎日届くと読まなくなります。頻度によって決めてください。


まとめ

  • 結果は見に行くのではなく、届くようにする
  • Slackは Incoming Webhook にURLを投げるだけ。無料プランで足りる
  • WebhookのURLはパスワード扱い。別ファイルに置いて読むだけにする
  • 数字を送るときは ``` で囲むと桁が揃う
  • Macの通知は osascript。本文は要点1行だけ
  • 通知先は用途ごとに分ける。混ぜると読まれなくなる
  • 月1回程度なら成功時も通知する。無音の意味が2通りになるのを避ける

通知を付けてから、仕組みが「使われるもの」に変わりました。自動化の最後の一手間は、結果を人の目の前に置くことです。

コメント

タイトルとURLをコピーしました