Python中如何实现持续监测IP状态,并通过Server酱在微信推送上线/下线提醒
Python中如何实现持续监测IP状态,并通过Server酱在微信推送上线/下线提醒
我来帮你实现一个持续监测IP状态并通过Server酱推送微信提醒的脚本。
import requests
import time
import socket
from datetime import datetime
import threading
class IPMonitor:
def __init__(self, target_ip, serverchan_key, check_interval=60):
"""
初始化IP监控器
Args:
target_ip: 要监控的IP地址
serverchan_key: Server酱的SCKEY
check_interval: 检查间隔(秒),默认60秒
"""
self.target_ip = target_ip
self.serverchan_key = serverchan_key
self.check_interval = check_interval
self.last_status = None
self.running = False
def check_ip_status(self):
"""检查IP是否在线(通过ping和端口扫描)"""
try:
# 方法1: 尝试ping(ICMP)
socket.setdefaulttimeout(3)
socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((self.target_ip, 80))
return True
except:
try:
# 方法2: 尝试常见端口
for port in [22, 80, 443, 3389]:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2)
result = sock.connect_ex((self.target_ip, port))
sock.close()
if result == 0:
return True
except:
pass
return False
def send_wechat_notification(self, title, message):
"""通过Server酱发送微信通知"""
if not self.serverchan_key:
print("未配置Server酱KEY,跳过推送")
return
url = f"https://sctapi.ftqq.com/{self.serverchan_key}.send"
data = {
"title": title,
"desp": message
}
try:
response = requests.post(url, data=data)
if response.status_code == 200:
print(f"微信通知发送成功: {title}")
else:
print(f"微信通知发送失败: {response.text}")
except Exception as e:
print(f"发送通知时出错: {e}")
def monitor_loop(self):
"""监控主循环"""
print(f"开始监控IP: {self.target_ip}")
print(f"检查间隔: {self.check_interval}秒")
while self.running:
current_status = self.check_ip_status()
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
if self.last_status is None:
# 第一次检查,只记录状态
status_text = "在线" if current_status else "离线"
print(f"[{current_time}] 初始状态: {status_text}")
elif current_status != self.last_status:
# 状态发生变化,发送通知
if current_status:
title = f"✅ {self.target_ip} 已上线"
message = f"IP地址: {self.target_ip}\n上线时间: {current_time}\n状态: 在线"
else:
title = f"❌ {self.target_ip} 已离线"
message = f"IP地址: {self.target_ip}\n离线时间: {current_time}\n状态: 离线"
self.send_wechat_notification(title, message)
print(f"[{current_time}] 状态变化: {'在线' if current_status else '离线'}")
self.last_status = current_status
time.sleep(self.check_interval)
def start(self):
"""启动监控"""
self.running = True
self.monitor_thread = threading.Thread(target=self.monitor_loop)
self.monitor_thread.daemon = True
self.monitor_thread.start()
print("监控已启动,按Ctrl+C停止...")
def stop(self):
"""停止监控"""
self.running = False
if hasattr(self, 'monitor_thread'):
self.monitor_thread.join(timeout=5)
print("监控已停止")
# 使用示例
if __name__ == "__main__":
# 配置参数
TARGET_IP = "192.168.1.1" # 要监控的IP地址
SERVERCHAN_KEY = "你的Server酱SCKEY" # 从Server酱官网获取
# 创建监控器实例
monitor = IPMonitor(
target_ip=TARGET_IP,
serverchan_key=SERVERCHAN_KEY,
check_interval=30 # 每30秒检查一次
)
try:
# 启动监控
monitor.start()
# 保持主线程运行
while True:
time.sleep(1)
except KeyboardInterrupt:
# 捕获Ctrl+C,优雅停止
monitor.stop()
代码说明:
-
IP状态检测:通过socket连接尝试检测IP是否在线,先尝试80端口,如果失败再尝试常见端口(22, 80, 443, 3389)
-
Server酱集成:使用Server酱的API发送微信通知,需要先在Server酱官网注册获取SCKEY
-
状态变化检测:只在实际状态发生变化时才发送通知,避免重复推送
-
多线程监控:使用单独的线程进行监控,不影响主程序运行
使用方法:
- 安装依赖:
pip install requests - 注册Server酱获取SCKEY
- 修改代码中的
TARGET_IP和SERVERCHAN_KEY - 运行脚本:
python ip_monitor.py
总结建议: 这个脚本可以部署在服务器上作为后台服务运行,确保网络设备状态实时监控。
能,不难
easy.具体需求说下。
‘’‘python
#pip install requests
import subprocess, platform
import requests
import time
def ping(host):
“”"
Returns True if host responds to a ping request
“”"
import subprocess, platform
# Ping parameters as function of OS
ping_str = “-n 1” if platform.system().lower()==“windows” else “-c 1”
args = "ping " + " " + ping_str + " " + host
need_sh = False if platform.system().lower()==“windows” else True
# Ping
return subprocess.call(args, shell=need_sh) == 0
on_state = 1
off_state = 1
def watch(host):
global on_state, off_state
while True:
get_ping = ping(host)
if get_ping:
##如果检测到在线,且离线状态为真(off_state>0),发送上线信号,并将离线状态重置为假(=0 )
if off_state > 0:
off_state = 0
requests.get(“https://sc.ftqq.com/[SCKEY(登入后可见)].send?text=服务器上线!”)
else:
on_state += 1
else:
##如果检测到连续离线五次,且在线状态为真(off_state>0),发送离线信号,并将在线状态重置为假(=0 )
if on_state > 0 and off_state >= 5:
on_state = 0
requests.get(“https://sc.ftqq.com/[SCKEY(登入后可见)].send?text=服务器离线!”)
else:
off_state += 1
time.sleep(1)
watch(‘www.baidu.com’)
’’’
https://gist.github.com/wdc63/869c104ac43841f20b25a40b4dd3b7d9
不会插代码,晕死,拿去试试,随便写了,没有试运行过
很简单
8 年以前写过一个 Android app 就是做这个事儿的,好久没维护了

