Pythonの常駐プログラムを監視したい
尚且つ
- 監視サーバの為にサーバ用意するのはちょっと…
- お金も払いたくない
- 簡単がいい
- スマホでも確認できて通知が来れば最高
何かいい方法ないかなって、考えた結果
DiscordにWebhookが用意されているのでそれ使ってやってみました。
そもそもDiscordとは?
Discord
テキスト・音声・ビデオ通話を利用できる無料のコミュニケーションツールです。
最近ではSteamやゲームアプリの公式もここでチャンネルを作ってユーザが最新情報をチェックしたり、ユーザ同士の交流の場として使われています。
私自身も「ゲームの攻略掲示板」くらいの感覚しか無かったので今回のような使い方ができるのには驚いております。
監視までの流れ
①Pythonがエラーをキャッチ
②DiscordのWebhookにエラーをPOST
③Discordがキャッチしてチャンネルにメッセージを投稿
④スマホにDicordのアプリを入れておいて、通知を受け取る
以上!
完成するとこんな感じ

手順
Discordのアカウントを作っておく
特に難しい事はないので割愛します。
サーバ開設

ログインしている状態で+マークのアイコンをクリックして開設してください。

「オリジナルの作成」を押して進み、「自分と友達のため」を選択してください。
チャンネル開設

開設されたサーバを選択した状態で「テキストチャンネル」の+マークを押すとチャンネルを新規追加できます。

チャンネルの種類とチャンネル名を入力して作成してください。
WebhookのURLを取得する

チャンネル追加が完了すると一覧の中に追加したチャンネルが出てきます。
歯車マークをクリックしてWebhookのURLを取得します。

連携サービスを選んで「ウェブフック」→「新しいウェブフック」
作成されたwebhookのURLをコピーします。
あとはこのURLに対してPythonからPOSTするだけで開設されたチャンネルにメッセージが投稿されるようになります。
Python側のサンプル
必要なライブラリ
pip install requests
Discordへ通知する為にrequestsをいれておきます。
send_discordという関数を叩くとPOSTするはず(引数にメッセージを入れてね)
import requests
# Discord Webhook URL
WEBHOOK_URL = "https://discord.com/api/webhooks/XXXXXXXX/XXXXXXXX"
def send_discord(message):
response = requests.post(
WEBHOOK_URL,
json={
"content": message
},
timeout=10
)
response.raise_for_status()
もう少しちゃんとしたいのなら
import datetime
import requests
discord_webhook_url = "https://discord.com/api/webhooks/XXXXXXXX/XXXXXXXX"
def log(msg):
# 1. 現在の時刻を取得
now_str = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
timed_msg = f"[{now_str}] {msg}"
# 2. コンソール(黒い画面)に出力
print(f">> {timed_msg}", flush=True)
# 3. Discordへの送信判定
webhook_url = discord_webhook_url
if not webhook_url:
return
# 💡 メッセージの内容に「エラー」や「致命的」が含まれているかチェック
is_error = "エラー" in msg or "致命的" in msg
if is_error:
# 🔴 エラー時の設定(赤枠の埋め込み形式)
payload = {
"embeds": [
{
"title": "⚠️ システムエラー発生",
"description": f"**発生時刻:** {now_str}\n\n**詳細:**\n`{msg}`",
"color": 15158332, # Discord独自のカラーコード(鮮やかな赤:#E74C3C)
}
]
}
else:
# 🟢 通常時の設定(普通のテキスト形式)
payload = {"content": f"【稼働ログ】 {timed_msg}"}
# 4. Discordへ送信を実行
try:
requests.post(webhook_url, json=payload, timeout=5)
except Exception as e_discord:
print(f"【Discord通知エラー】: {e_discord}", flush=True)
あとはエラーをキャッチする場所に
if cpu > 90:
log("CPU使用率エラー: 95%")
こんな感じでいれておけばいいと思います。
チャンネル毎に監視対象を変えたりなど応用できるので使いやすいですね。


