今天写一个Python:智能监控与自动网页弹出哨兵脚本。
一个高可用、动态配置的轮询监控脚本。它的核心任务是持续检查特定 ID网页内容,一旦检测到包含“设定的关键字”的内容,立即自动打开浏览器跳转到详情页查看。
单位的内网主页是一个标准的前台 JS 调用后台 Json 的结构,查看 api 的URL返回数据判断,脚本主要轮询检查新发布的页面有没有包含设定的关键字,有关键字就直接把对应网页保存进日志并自动打开网页查看。
🚀 核心工作流程
1. 🛠️ 初始化与环境准备
- 日志系统双写:配置日志同时输出到控制台和
monitor_log.txt文件,确保运行轨迹可追溯。 - 加载配置文件:读取
config.ini获取关键参数:base_url:API 根地址。current_id:当前监控的起始 ID。keywords:触发报警的关键字列表。interval_seconds:默认等待时间(用于异常情况)。
- 安全校验:若配置文件缺失,程序直接报错退出,防止盲目运行。
2. 🔄 主循环监控 (无限轮询)
程序进入 while True 循环,按以下顺序执行:
A. 🔄 动态重载配置
- 机制:每次循环开始时重新读取
config.ini。 - 目的:支持热更新。用户可以在程序运行时修改关键字或调整 ID,无需重启程序即可生效。
B. 🌐 发起网络请求
- 构建 URL:拼接目标接口
.../detail/by/id/{current_id}。 - 发送请求:使用
requests.get发起访问,设置 10秒超时 防止网络卡死。
C. 🛡️ 双层状态过滤 (容错核心)
程序对响应结果进行严格的两级判断,只有全部通过才视为“成功”:
| 层级 | 判断条件 | 判定结果 | 后续决策 |
|---|---|---|---|
| 第一层 | HTTP 状态码是否为 200? |
❌ 否 | 失败:ID 不变,长间隔等待 |
| 第二层 | 业务码 code 是否为 500 且含 “未知异常”? |
❌ 是 | 失败:ID 不变,长间隔等待 |
| 最终 | 以上均通过 | ✅ 成功 | 进入数据处理流程 |
D. 🔍 数据解析与智能兼容
这是代码的核心修复点,专门处理 API 返回数据结构不一致的问题:
- 获取
data字段。 - 类型判断:
- 如果是 字典 (Dict) → 直接提取
fl。 - 如果是 列表 (List) → 取第一个元素
[0]再提取fl。
- 如果是 字典 (Dict) → 直接提取
- 结果:无论接口返回哪种格式,都能准确拿到
fl值(如 2, 3, 4…)。
E. ⚡ 关键字匹配与动作触发
- 全文扫描:将返回的 JSON 转为字符串,遍历检查是否包含配置的
keywords。 - 命中逻辑:
- 🚨 记录警报:在日志中高亮显示命中的关键字。
- 🔗 构造链接:生成目标 URL
http://www.hhs.zj/html/page/detail_{fl}.html?id={id}。 - 🌍 自动打开:调用
open_url_smart函数,尝试三种方式(os.startfile,webbrowser,subprocess)强制拉起默认浏览器打开该页面。
- 未命中:仅记录普通日志,静默处理。
F. 💾 状态持久化与休眠策略
根据本次循环的结果,决定下一步动作:
✅ 成功路径 (请求正常 + 业务正常):
- ID 递增:
current_id = current_id + 1。 - 保存进度:立即写入
config.ini,防止断电重复消费。 - 快速休眠:等待 5秒 (
FAST_INTERVAL),迅速检查下一条。
- ID 递增:
❌ 失败路径 (网络错误 / 业务异常):
- ID 保持不变:下次循环重试同一个 ID,确保不漏数据。
- 慢速休眠:等待 默认长间隔 (如 30秒),避免对故障服务器造成压力。
⏱️ 精确计时:
- 计算
睡眠时长 = 设定间隔 - 本次耗时。 - 确保整体循环频率稳定,不受网络波动影响过大。
- 计算
💡 逻辑特点总结
- 鲁棒性强:双重错误检查机制,区分“网络故障”和“业务异常”,并在异常时自动降频保护。
- 数据兼容:完美解决 API 返回结构变动(列表 vs 字典)导致的解析失败问题。
- 实时热更:支持运行时修改配置,运维灵活。
- 断点续传:每次成功后立即保存 ID,意外关闭后重启可从断点继续,不重不漏。
- 多模态报警:通过多种底层方法尝试打开浏览器,最大化保证报警动作执行成功。