Pythonスクリプトの完了とエラーをSlack Webhookで自動通知できるようにした話。確認しに行く作業がなくなった

自動化の落とし穴:ログ確認

月末のメール送信を自動化した。取引先60社へのメールが、スクリプトを1回動かすだけで全部出ていくようになった。あとはログを見れば、送ったかどうか分かる。

ところが、そのログを見に行く作業が残った。

まず、担当者は毎朝PCを開き、ターミナルを立ち上げ、ログファイルを確認する。エラーが出ていないか。全件処理されているか。内容が問題なければ閉じる。それだけの確認だった。

でも、この「確認しに行く」という行為が、思いのほか重かった。

在宅勤務の日は、自宅から社用PCにリモートで繋いで確認する。スマートフォンに通知が来るわけでもない。「何かあれば誰かが言ってくるだろう」と放置した日に限って、エラーで止まっていた。

次に、自動化したのに、完全には手が離れていなかった。

Slack Webhook:メッセージ送信と運用上の注…

Slack Incoming Webhooksは。特定のURLにJSON形式のデータをPOSTすると。指定したチャンネルにメッセージが届く仕組みだ。Slack Appを作成してIncoming Webhooksを有効にすると。URLが1本発行される。あとはそのURLに向かってrequests.postするだけ。認証のヘッダーは不要。

基本的な送信はこの形になる。

import requests

SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/T.../B.../..."

def notify_slack(message):
    payload = {"text": message}
    requests.post(SLACK_WEBHOOK_URL, json=payload)

json=payload

Webhook自動処理と利用上の注意

一方で、と指定すると。Content-TypeとJSONのシリアライズをrequestsが自動で処理する。手動でheadersを設定する必要はありません。

注意点は2つある。Webhook URLは外部に漏れると誰でもメッセージを送れるため。環境変数や.envファイルで管理する。もう一つは、1チャンネルあたり1秒1通のレート制限があること。バッチで大量のログを一括送信しようとすると制限に引っかかる場合がある。

既存処理へのSlack通知導入と工夫

既存の処理スクリプトに通知を追加する場合、変更は最小限で済む。メイン処理の末尾に完了通知を入れるだけです。

環境変数と詳細情報でバッチ完了をSlack通知、異常検知

import requests
import os
from datetime import datetime

SLACK_WEBHOOK_URL = os.environ.get("SLACK_WEBHOOK_URL")

def notify_slack(message):
    if not SLACK_WEBHOOK_URL:
        return
    requests.post(SLACK_WEBHOOK_URL, json={"text": message})

def main():
    # 既存の処理(メール送信・集計・PDF出力など)
    run_batch()

    # 完了通知(追加4行)
    now = datetime.now().strftime("%Y-%m-%d %H:%M")
    notify_slack(f"✅ バッチ完了: {now}\n処理件数: 60件 / エラー: 0件")

if __name__ == "__main__":
    main()

Slack通知の環境対応と情報改善

SLACK_WEBHOOK_URL

そのため、を環境変数から取得しているため、コードにURLを直接埋め込まなくて済む。環境変数が設定されていない場合はreturnで抜けるようにしておくと。ローカルテスト時に余分な通知が飛ばありません。

完了後に届くSlackメッセージには、実行日時と処理件数を入れておく。「今日の分が終わった」という事実だけでなく「何件処理されたか」まで含めることで。件数が少ないときの異常値を自然に察知できるようになる。

ここで一度立ち止まって考えてみてください

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。

プログラミングスクール Enjoy Tech!(エンジョイテック) →

Slackでのエラー通知とトレースバック

完了通知より重要なのが、エラー通知だ。処理が途中で止まっていても気づかないのが。「確認しに行く」手間の本質的な問題だった。

しかし、例外が発生したときにSlackへ通知を飛ばすには。except節の中にnotify_slackを呼ぶだけでいい。

tracebackエラー通知とraiseの原則

import traceback

def main():
    try:
        run_batch()
        now = datetime.now().strftime("%Y-%m-%d %H:%M")
        notify_slack(f"✅ バッチ完了: {now}\n処理件数: 60件")
    except Exception as e:
        error_detail = traceback.format_exc()
        notify_slack(
            f"❌ バッチ失敗: {datetime.now().strftime('%Y-%m-%d %H:%M')}\n"
            f"{str(e)}\n```\n{error_detail[:500]}\n```"
        )
        raise

traceback

エラー通知のポイント:トレースバックの工夫とエラー処理

モジュールを使うと、エラーの発生箇所とスタックトレースをSlackに送れる。ただし。トレースバックが長くなりすぎるとSlackのメッセージが読みにくくなるため。

[:500]

で先頭500文字に切ることが多い。

さらに、末尾の

raise

を忘れないようにする。通知だけして処理がサイレントに終了すると、呼び出し元でエラーを検知できなくなる。通知はあくまで「知らせる」だけで、エラーをなかったことにしてはいけありません。

Chatwork APIでのメッセージ送信

パネル/chatwork-api-python-message-send.png

まず、社内でSlackを使っていない場合、Chatworkが選択肢になる。中小企業ではChatworkを使っているチームも多い。

送信方法はSlackと本質的に同じで、URLとヘッダーの書き方が変わるだけです。

まず。Chatworkのトップページ右上にある歯車アイコンから「サービス連携」→「API発行」でAPIトークンを取得する。次に、送信先のルームIDを確認する。ブラウザでChatworkを開いたとき。URLに表示される数字がルームIDだ(例:。

https://www.chatwork.com/#!rid12345678

次に、→ ルームIDは

12345678

)。

Chatwork通知機能の共通インターフェース化

import requests
import os

CHATWORK_API_TOKEN = os.environ.get("CHATWORK_API_TOKEN")
CHATWORK_ROOM_ID = os.environ.get("CHATWORK_ROOM_ID")

def notify_chatwork(message):
    if not CHATWORK_API_TOKEN or not CHATWORK_ROOM_ID:
        return
    url = f"https://api.chatwork.com/v2/rooms/{CHATWORK_ROOM_ID}/messages"
    headers = {"X-ChatWorkToken": CHATWORK_API_TOKEN}
    params = {"body": message}
    requests.post(url, headers=headers, params=params)

Slack・Chatwork通知の共通化と切り替え

Slack Webhookと異なり。Chatworkはヘッダーにトークンを指定する形式です。

notify_slack

一方で、と

notify_chatwork

を同じインターフェースで定義しておけば。環境変数の有無だけで切り替えられるようになる。

完全自動化へのSlack通知

Pythonで業務を自動化したとき。「実行結果を確認しに行く」という作業が残りやすい。ログファイルを開く、ターミナルを確認する、エラーが出ていないかチェックする。この確認作業は地味でも、毎日続くと積み重なる。

そのため、Slack Webhookは、URLとrequests.postで動く。設定が複雑ではない。完了通知とエラー通知を入れることで、スクリプトから完全に手が離れる。

実装の最小ステップを整理する。

  1. Slack AppのIncoming WebhooksでURLを1本発行し、環境変数に入れる
  2. notify_slack(message)を1関数として定義する
  3. メイン処理の末尾に完了通知を追加する
  4. except節にエラー通知を追加し、raiseで再送出する

これだけで、スマートフォンにSlack通知が届くようになる。在宅日でも、外出中でも、スクリプトが動いたかどうかをその場で知れる。

しかし、自動化は「手を動かさない」だけでなく。「画面を見に行かない」まで達成してはじめて完成する。そこまでできて、ようやく手が完全に離れた、と言える。

関連リンクとチェックリスト

学習サービスとアンケート

このスキルを活かしてさらに前へ進むなら

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。

プログラミングスクール Enjoy Tech!(エンジョイテック) →