Discordを使って無料で常駐Pythonを監視をさせる

Pythonの常駐プログラムを監視したい

尚且つ

  • 監視サーバの為にサーバ用意するのはちょっと…
  • お金も払いたくない
  • 簡単がいい
  • スマホでも確認できて通知が来れば最高

何かいい方法ないかなって、考えた結果
DiscordにWebhookが用意されているのでそれ使ってやってみました。

そもそもDiscordとは?

Discord
テキスト・音声・ビデオ通話を利用できる無料のコミュニケーションツールです。

最近ではSteamやゲームアプリの公式もここでチャンネルを作ってユーザが最新情報をチェックしたり、ユーザ同士の交流の場として使われています。
私自身も「ゲームの攻略掲示板」くらいの感覚しか無かったので今回のような使い方ができるのには驚いております。

監視までの流れ

①Pythonがエラーをキャッチ
②DiscordのWebhookにエラーをPOST
③Discordがキャッチしてチャンネルにメッセージを投稿
④スマホにDicordのアプリを入れておいて、通知を受け取る

以上!

完成するとこんな感じ
完成だ

手順

Discordのアカウントを作っておく

特に難しい事はないので割愛します。

サーバ開設

チャンネル

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

画面

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

チャンネル開設

チャンネル2

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

チャンネル3

チャンネルの種類とチャンネル名を入力して作成してください。

WebhookのURLを取得する

webhook

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

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%")

こんな感じでいれておけばいいと思います。

チャンネル毎に監視対象を変えたりなど応用できるので使いやすいですね。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール