複数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 = "あなたのウェブフック"