見出し画像

複数PCがonlineかどうかDiscordに通知を飛ばすBOT

同じネットワーク上のPCのがonline状態か調べるBOTを作りました。
監視間隔は5分
通知はターミナル、Discordに飛ばします
ターミナル上には5分間隔でonlineかofflineかが表示され
Discordには初回及び1時間間隔、offline検出時に通知されます

import subprocess
import requests
import time
import datetime
import logging

# ロギングの設定
logging.basicConfig(filename='error.log', level=logging.ERROR)

# PCとIPのリストを作成します
pcs = {
    "hogehoge01": "192.168.100.2",
    "hogehoge02": "192.168.100.3",
    "hogehoge03": "192.168.100.4",
}

# DiscordのウェブフックURL
webhook_url = "あなたのウェブフック"

# 各PCの状態を保存する辞書
pc_status = {}

# プログラム開始時の通知を送る関数
def send_startup_notification():
    embeds = []
    for pc, ip in pcs.items():
        message = f"{pc} monitoring started"
        color = 0xffff00  # 黄色
        embed = {
            "title": pc,
            "description": message,
            "color": color
        }
        embeds.append(embed)
    try:
        requests.post(webhook_url, json={"embeds": embeds})
    except Exception as e:
        logging.error(f"Error sending startup notification to Discord: {e}")

# プログラム開始時に通知を送る
send_startup_notification()

while True:  # 無限ループ
    # 各PCに対してpingコマンドを実行します
    for pc, ip in pcs.items():
        args = ["ping", "-c", "1", "-W", "1", ip]
        result = subprocess.run(args, stdout=subprocess.DEVNULL)

        # 戻り値を確認してオンライン・オフラインを判断します
        if result.returncode == 0:
            message = f"{pc} is online"
            color = 0x00ff00  # 緑色
            pc_status[pc] = True
        else:
            message = f"{pc} is offline"
            color = 0xff0000  # 赤色
            pc_status[pc] = False

        print(f"{datetime.datetime.now().strftime('%Y-%m-%d %H:%M')}: {message}")

        # Discordに通知を送ります(初回またはオフライン検出時、または毎時00分)
        now = datetime.datetime.now()
        if (now.minute == 0 and pc_status.get(pc+now.strftime("_%H_time"), 0) == 0) or not pc_status[pc] or pc_status.get(pc+now.strftime("_%H_time"), 0) == 0:
            embed = {
                "title": pc,
                "description": message,
                "color": color
            }
            try:
                requests.post(webhook_url, json={"embeds": [embed]})
                pc_status[pc+now.strftime("_%H_time")] = time.time()
            except Exception as e:
                logging.error(f"Error sending notification to Discord: {e}")

    time.sleep(300)  # 5分待機します

冒頭の以下の部分はご自分の環境に合わせて変更して下さい


# PCとIPのリストを作成します
pcs = {
    "hogehoge01": "192.168.100.2",
    "hogehoge02": "192.168.100.3",
    "hogehoge03": "192.168.100.4",
}

# DiscordのウェブフックURL
webhook_url = "あなたのウェブフック"

いいなと思ったら応援しよう!