Python中如何实现持续监测IP状态,并通过Server酱在微信推送上线/下线提醒

Python中如何实现持续监测IP状态,并通过Server酱在微信推送上线/下线提醒

7 回复

我来帮你实现一个持续监测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()

代码说明:

  1. IP状态检测:通过socket连接尝试检测IP是否在线,先尝试80端口,如果失败再尝试常见端口(22, 80, 443, 3389)

  2. Server酱集成:使用Server酱的API发送微信通知,需要先在Server酱官网注册获取SCKEY

  3. 状态变化检测:只在实际状态发生变化时才发送通知,避免重复推送

  4. 多线程监控:使用单独的线程进行监控,不影响主程序运行

使用方法:

  1. 安装依赖:pip install requests
  2. 注册Server酱获取SCKEY
  3. 修改代码中的TARGET_IPSERVERCHAN_KEY
  4. 运行脚本: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 就是做这个事儿的,好久没维护了

回到顶部