# MonitorSite
**Repository Path**: kocher2/MonitorSite
## Basic Information
- **Project Name**: MonitorSite
- **Description**: 监视网页变换并生产对应报告。
- **Primary Language**: C#
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-04-22
- **Last Updated**: 2026-05-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# MonitorSite
# MonitorSite - 网站内容变更监控工具
[](https://choosealicense.com/licenses/mit/)
[](https://dotnet.microsoft.com/)
MonitorSite 是一个用 C# 编写的轻量级网站监控工具,专门用于定时监控政府、企业等网站的公告页面,检测内容变更并生成可视化报告。特别针对招聘公告、通知公告等表格数据的变更监控进行了优化。
## ✨ 主要功能
- 🔍 **智能监控** - 支持自定义策略提取网页中的表格或列表内容
- ⏰ **定时任务** - 每天 10:00 和 16:00 自动检查,18:00 自动保存报告
- 📊 **可视化报告** - 自动生成美观的 HTML 报告和 CSV 数据文件
- 🔔 **变更高亮** - 新增内容红色标记,招聘类公告橙色高亮闪烁
- 🖥️ **交互式控制台** - 支持手动触发监控、查看状态、生成报告等操作
- 💾 **数据持久化** - 自动保存监控历史,重启程序不丢失数据
- 🔌 **策略模式** - 轻松扩展,支持不同网站结构的定制解析
## 📸 界面预览

生成的 HTML 报告会高亮显示新增内容,招聘类公告会以橙色背景和闪烁动画突出显示。
## 🚀 快速开始
### 环境要求
- [.NET 8.0 SDK](https://dotnet.microsoft.com/download/dotnet/8.0) 或更高版本
- Windows / Linux / macOS
### 安装与运行
1. **克隆项目**
```bash
git clone https://gitee.com/kocher2/MonitorSite.git
cd MonitorSite
2、还原依赖包
dotnet restore
### 配置监控网站
编辑项目根目录下的 website.txt 文件,每行一个要监控的网址:
text
https://www.example.com/notice/
https://www.example.com/recruitment/
运行程序
bash
dotnet run
使用说明
程序启动后,在控制台输入对应数字即可执行操作:
命令 功能
1 立即对所有配置的网站执行一次监控检查
2 根据当前监控数据生成 HTML 和 CSV 报告文件
3 快速查看各网站的监控状态摘要
4 以表格形式展示所有公告的详细信息
5 查看历史变更记录
6 手动保存监控数据到 JSON 文件
7 清空控制台屏幕
0 安全退出程序
📁 输出文件说明
程序运行后会在项目目录下生成以下文件:
文件/目录 说明
monitor_data.json 监控数据持久化文件,包含所有历史记录
reports/report_*.html 按时间命名的 HTML 报告
reports/report_latest.html 最新的 HTML 报告(覆盖保存)
reports/report_*.csv 按时间命名的 CSV 数据文件
reports/report_latest.csv 最新的 CSV 数据文件
change_reports/change_report_*.txt 每日变更摘要文本文件
### 🔧 扩展新网站
方法一:使用通用策略(适合简单页面)
如果目标网站的通知公告使用标准的 HTML
标签,只需在 website.txt 中添加网址即可。系统会使用通用提取逻辑。
方法二:自定义策略(适合复杂页面)
如果网站使用 /- 列表、动态加载或其他特殊结构,需要编写自定义策略类。
步骤 1:创建策略类
在 Strategies 文件夹下新建一个类,实现 ITableExtractionStrategy 接口:
csharp
```
using HtmlAgilityPack;
using MonitorSite.Strategies;
namespace MonitorSite.Strategies;
///
/// 示例:某某网站公告策略
///
public class MyWebsiteStrategy : ITableExtractionStrategy
{
public string GetTargetTableName() => "通知公告";
public List ExtractTableContent(HtmlDocument doc, string baseUrl)
{
var items = new List();
// 示例:提取
中的公告
var newsList = doc.DocumentNode.SelectSingleNode("//ul[contains(@class, 'news-list')]");
if (newsList != null)
{
var liNodes = newsList.SelectNodes(".//li");
if (liNodes != null)
{
foreach (var li in liNodes)
{
var titleNode = li.SelectSingleNode(".//a");
var dateNode = li.SelectSingleNode(".//span");
if (titleNode != null)
{
items.Add(new AnnouncementItem
{
Title = titleNode.InnerText.Trim(),
Date = dateNode?.InnerText.Trim() ?? "",
Url = ConvertToAbsoluteUrl(titleNode.GetAttributeValue("href", ""), baseUrl)
});
}
}
}
}
return items;
}
private string ConvertToAbsoluteUrl(string relativeUrl, string baseUrl)
{
// 辅助方法:将相对路径转为绝对路径
if (string.IsNullOrEmpty(relativeUrl)) return "";
if (relativeUrl.StartsWith("http")) return relativeUrl;
var baseUri = new Uri(baseUrl);
if (relativeUrl.StartsWith("/"))
return $"{baseUri.Scheme}://{baseUri.Host}{relativeUrl}";
var basePath = baseUri.AbsoluteUri;
if (!basePath.EndsWith("/"))
basePath = basePath.Substring(0, basePath.LastIndexOf('/') + 1);
return new Uri(new Uri(basePath), relativeUrl).ToString();
}
}
```
步骤 2:注册策略
打开 WebObserver.cs,在构造函数中的 _strategies 字典里添加域名与策略的映射:
csharp
_strategies = new Dictionary
{
["example.com"] = new MyWebsiteStrategy(), // 新增的策略
["huiyang.gov.cn"] = new NoticeBoardStrategy(),
["dayawan.gov.cn"] = new DayawanNoticeStrategy(),
["huidong.gov.cn"] = new RecruitmentNoticeStrategy(),
["huizhou.gov.cn"] = new InstitutionRecruitmentStrategy()
};
步骤 3:添加网址
在 website.txt 中添加目标网址:
text
https://www.example.com/notice/
完成以上步骤后,重启程序即可监控新网站。
策略开发技巧
使用浏览器开发者工具(F12)分析目标网页结构
优先选择稳定的 CSS 类名或 ID 作为选择器
如果网站内容通过 JavaScript 动态加载,参考 DayawanNoticeStrategy 的实现
AnnouncementItem 类包含 Title、Date、Url 三个属性,请尽量完整提取
###📋 配置说明
监控时间修改
在 MonitoringService.cs 中修改定时器设置:
csharp
// 早上监控时间(当前为 10:00)
_morningTimer = SetScheduleTimer(10, 0, "早上10点监控");
// 下午监控时间(当前为 16:00)
_afternoonTimer = SetScheduleTimer(16, 0, "下午4点监控");
// 报告保存时间(当前为 18:00)
_eveningSaveTimer = SetScheduleTimer(18, 0, "下午6点保存");
请求头配置
如需修改 HTTP 请求头,编辑 WebObserver.cs 构造函数中的 _httpClient.DefaultRequestHeaders 部分。
###🛠️ 技术栈
.NET 8.0 - 跨平台开发框架
HtmlAgilityPack - HTML 解析库
Newtonsoft.Json - JSON 序列化/反序列化
### 📄 开源协议
本项目采用 MIT 许可证 开源。
Copyright (c) 2026 MonitorSite Contributors
### 🤝 贡献指南
欢迎提交 Issue 和 Pull Request!
##Fork 本项目
创建您的特性分支 (git checkout -b feature/AmazingFeature)
提交您的更改 (git commit -m 'Add some AmazingFeature')
推送到分支 (git push origin feature/AmazingFeature)
打开一个 Pull Request
### 📧 联系方式
项目主页:https://gitee.com/kocher2/MonitorSite
问题反馈:Issues
##发布日期:2026-4-22