HHU校园网自动连接监控系统(钉钉机器人版)操作说明书

HHU校园网自动连接监控系统(钉钉机器人版)操作说明书

HHU校园网自动连接监控系统(钉钉机器人版)操作说明书

马上就要放小长假了,由于在学校用的是工位的台式电脑,回家的时候如果想要工作只能通过笔记本电脑远程控制的方式完成任务。但是学校的台式机连接的是校园网。众所周知,校园网不是特别稳定,可能需要一天一连确保在线甚至更多次才能满足远程控制的需要。

于是我决定写一个支持每天定时定点连接并检查台式机是否连接到校园网的代码,解决这个问题。


一、项目概述

本代码是基于Python开发的校园网自动重连+钉钉通知监控工具 ,实现的核心功能包括:

✅ 定时检测网络状态,断网自动登录校园网

✅ 钉钉机器人实时推送警报(断网、登录失败、系统启停)

✅ 每日自动发送校园网连接状态日报

✅ 完整日志记录,方便排查问题

✅ 一键启动,支持后台静默运行、开机自启


二、前置准备工作

2.1 软件与环境准备

这里的软件安装就不多赘述了,大家自行下载安装即可,如有不会的可以咨询 【豆包AI】 辅助下载安装😁

所需软件/工具 要求 说明
Python 3.8+ 64位版本 官网下载:https://www.python.org/downloads/,**安装时必须勾选「Add Python to PATH」**
Microsoft Edge浏览器 最新稳定版 必须安装,用于Selenium自动化登录
Edge浏览器驱动(msedgedriver.exe) 与Edge版本完全匹配 下载地址:https://developer.microsoft.com/zh-cn/microsoft-edge/tools/webdriver/
钉钉PC/手机端 最新版 用于接收通知、配置机器人

2.2 依赖库安装

我是用pycharm软件作为python语言的编译器,依赖库从pycharm的终端处 进行安装。

执行以下命令安装所需Python库:

bash 复制代码
pip install schedule selenium requests

2.3 文件结构准备

建议创建统一的工作文件夹,例如 F:\school_net_connect\,结构如下:

复制代码
F:\school_net_connect\
├─ campus_net_auto.py       # 主程序代码(本文提供的Python脚本)
├─ edgedriver_win64\
│  └─ msedgedriver.exe      # Edge浏览器驱动
├─ 快速启动.bat              # 前台启动批处理
├─ 启动监控.bat              # 后台启动批处理
├─ network_status.log       # 运行日志(自动生成)
└─ daily_status.json        # 每日状态记录(自动生成)

三、钉钉机器人详细配置步骤

3.1 新建/选择群聊

打开钉钉,新建一个群聊(必须是你有管理权限的群,能够添加机器人)。

3.2 添加自定义机器人

推荐使用电脑端钉钉完成下面的步骤:

  1. 群聊右上角 → 「⚙齿轮图标」(群设置)→ 「智能群助手」
  2. 点击「添加机器人」→ 选择「自定义(通过webhook接入)」
  3. 点击「添加」,设置机器人信息:
    • 机器人名称:例如「视奸达人」
    • 机器人头像:可自定义
    • 安全设置:必须选择「加签」(代码已适配加签逻辑,安全性更高)
  4. 点击「完成」,系统会生成两个关键信息:
    • Webhook地址 :格式为 https://oapi.dingtalk.com/robot/send?access_token=xxx
    • 加签密钥(Secret) :格式为 SECxxx
  5. 复制并记录这两个信息,后续要填入Python代码的配置中。



四、Python主程序配置说明

下面是完整的python代码campus_net_auto.py,大家可以先复制到python编译器中。

需要大家自己修改的是配置部分(CONFIG字典),已经给大家放在了代码顶部。

python 复制代码
'''
校园网自动连接监控系统(钉钉机器人版)
作者:聪明可爱的赛宝儿
功能:定时检测网络状态,自动重连,钉钉机器人通知
'''

import schedule
import time
import json
from datetime import datetime
import hashlib
import hmac
import base64
import urllib.parse
import requests
import subprocess
import os
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
import sys

# ============ 配置部分 ============
CONFIG = {
    # 校园网配置(必须修改)
    "username": "你的校园网网站HHU学号/账号",	  # 替换为自己的账号,例如201301010001
    "password": "你的校园网密码",               # 替换为自己的密码
    "url": "http://10.96.0.155",               # 校园网登录页地址(学校变更需修改)

    # Edge驱动路径(必须修改为你存放msedgedriver.exe软件的实际路径)
    "edge_driver_path": "某盘:/msedgedriver.exe",

    # 钉钉机器人配置(必须修改为你自己的)
    "dingtalk": {
        "webhook": "https://oapi.dingtalk.com/robot/send?access_token=你的access_token",
        "secret": "SEC你的加签密钥"  # 开启加签就填,没开启留空
    },

    # 检测设置(可按需调整)
    "check_times": ["08:00", "12:00", "16:00", "20:00"],  # 每日固定检测时间
    "report_time": "22:00",  # 每日日报发送时间
    "check_interval": 60,  # 网络检查间隔(分钟)

    # 日志设置(无需修改)
    "log_file": "network_status.log",
    "status_file": "daily_status.json"
}


# ============ 日志系统 ============
class NetworkLogger:
    def __init__(self):
        self.log_file = CONFIG["log_file"]
        self.status_file = CONFIG["status_file"]
        self.load_today_status()

    def load_today_status(self):
        """加载今天的状态"""
        try:
            with open(self.status_file, "r", encoding="utf-8") as f:
                data = json.load(f)
                today = datetime.now().strftime("%Y-%m-%d")

                if data.get("date") == today:
                    self.today_status = data
                else:
                    self.today_status = self._create_new_status()
        except (FileNotFoundError, json.JSONDecodeError):
            self.today_status = self._create_new_status()

    def _create_new_status(self):
        """创建新的状态记录"""
        return {
            "date": datetime.now().strftime("%Y-%m-%d"),
            "total_checks": 0,
            "successful_logins": 0,
            "already_logged_in": 0,
            "failed_attempts": 0,
            "connection_errors": 0,
            "last_status": "未知",
            "check_times": [],
            "last_success_time": None
        }

    def save_today_status(self):
        """保存今天的状态"""
        try:
            with open(self.status_file, "w", encoding="utf-8") as f:
                json.dump(self.today_status, f, indent=2, ensure_ascii=False)
        except Exception as e:
            print(f"保存状态失败: {e}")

    def log_check(self, status, details=""):
        """记录一次检测"""
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        log_entry = f"[{timestamp}] {status} - {details}"

        # 写入日志文件
        try:
            with open(self.log_file, "a", encoding="utf-8") as f:
                f.write(log_entry + "\n")
        except Exception as e:
            print(f"写入日志失败: {e}")

        # 更新今日状态
        self.today_status["total_checks"] += 1
        self.today_status["last_status"] = status

        if "成功" in status or "登录成功" in status:
            self.today_status["successful_logins"] += 1
            self.today_status["last_success_time"] = timestamp
        elif "已登录" in status or "无需重新连接" in status:
            self.today_status["already_logged_in"] += 1
        elif "失败" in status:
            self.today_status["failed_attempts"] += 1
        elif "异常" in status or "错误" in status:
            self.today_status["connection_errors"] += 1

        self.today_status["check_times"].append(f"{timestamp}: {status}")

        # 只保留最近20次记录
        if len(self.today_status["check_times"]) > 20:
            self.today_status["check_times"] = self.today_status["check_times"][-20:]

        self.save_today_status()

        print(log_entry)
        return log_entry


# ============ 网络检查器 ============
class NetworkChecker:
    @staticmethod
    def check_internet_connection():
        """检查互联网连接"""
        try:
            result = subprocess.run(
                ['ping', '-n', '2', 'baidu.com'],
                capture_output=True,
                text=True,
                timeout=5
            )
            return "TTL" in result.stdout or "TTL" in result.stderr
        except subprocess.TimeoutExpired:
            return False
        except Exception:
            return False

    @staticmethod
    def check_campus_network():
        """检查校园网连接"""
        try:
            result = subprocess.run(
                ['ping', '-n', '2', '10.96.0.155'],
                capture_output=True,
                text=True,
                timeout=5
            )
            return "TTL" in result.stdout or "TTL" in result.stderr
        except subprocess.TimeoutExpired:
            return False
        except Exception:
            return False


# ============ 钉钉机器人通知系统 ============
class DingTalkReporter:
    def __init__(self, config):
        self.config = config["dingtalk"]
        self.webhook = self.config["webhook"]
        self.secret = self.config.get("secret", "")

    def _generate_signature(self):
        """生成加签签名"""
        if not self.secret:
            return ""

        timestamp = str(round(time.time() * 1000))
        secret_enc = self.secret.encode('utf-8')
        string_to_sign = f'{timestamp}\n{self.secret}'.encode('utf-8')
        hmac_code = hmac.new(secret_enc, string_to_sign, digestmod=hashlib.sha256).digest()
        sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
        return f"&timestamp={timestamp}&sign={sign}"

    def send_message(self, title, text, msg_type="text"):
        """发送钉钉消息"""
        try:
            # 构建完整的webhook URL
            signature = self._generate_signature()
            webhook_url = f"{self.webhook}{signature}" if self.secret else self.webhook

            if msg_type == "text":
                data = {
                    "msgtype": "text",
                    "text": {
                        "content": f"{title}\n\n{text}"
                    }
                }
            elif msg_type == "markdown":
                data = {
                    "msgtype": "markdown",
                    "markdown": {
                        "title": title,
                        "text": text
                    }
                }

            headers = {'Content-Type': 'application/json'}
            response = requests.post(
                webhook_url,
                json=data,
                headers=headers,
                timeout=10
            )

            if response.status_code == 200:
                result = response.json()
                if result.get("errcode") == 0:
                    return True, "消息发送成功"
                else:
                    return False, f"钉钉返回错误: {result.get('errmsg')}"
            else:
                return False, f"HTTP错误: {response.status_code}"

        except requests.exceptions.RequestException as e:
            return False, f"网络连接错误: {str(e)}"
        except Exception as e:
            return False, f"发送消息失败: {str(e)}"

    def send_daily_report(self, daily_status):
        """发送每日报告"""
        try:
            # 计算成功率
            total = daily_status['total_checks']
            successful = daily_status['successful_logins'] + daily_status['already_logged_in']
            success_rate = (successful / total * 100) if total > 0 else 0

            # 构建markdown格式的消息
            title = f"📊 校园网状态日报 - {daily_status['date']}"

            markdown_text = f"""
### 📅 校园网连接状态日报

**📅 报告日期**:{daily_status['date']}  
**⏰ 生成时间**:{datetime.now().strftime('%H:%M:%S')}  
**💻 主机名称**:{os.environ.get('COMPUTERNAME', '未知')}  

---

### 📈 今日统计概览

| 指标 | 数值 | 说明 |
|:---|:---|:---|
| 🔍 总检测次数 | {daily_status['total_checks']} | 今日执行的总检测次数 |
| ✅ 成功登录次数 | {daily_status['successful_logins']} | 从断网状态重新登录的次数 |
| 📱 已登录状态次数 | {daily_status['already_logged_in']} | 检测时已处于登录状态的次数 |
| ❌ 失败尝试次数 | {daily_status['failed_attempts']} | 登录失败的次数 |
| ⚠️ 连接错误次数 | {daily_status.get('connection_errors', 0)} | 网络连接错误的次数 |
| 🎯 **成功率** | **{success_rate:.1f}%** | (成功+已登录) / 总检测次数 |

---

### 📝 最后检测状态
- **状态**:{daily_status['last_status']}
- **最后成功时间**:{daily_status.get('last_success_time', '暂无')}

---

### ⏰ 最近检测记录(最近5次)
{daily_status['check_times'][-5] if len(daily_status['check_times']) >= 5 else daily_status['check_times'][-1] if daily_status['check_times'] else "暂无记录"}

---

### 💡 系统建议
{self._get_suggestions(daily_status, success_rate)}

---
*🤖 此消息由校园网自动监控系统发送*  
*⏰ 下次报告时间:明日 {CONFIG["report_time"]}*
            """

            return self.send_message(title, markdown_text, msg_type="markdown")

        except Exception as e:
            return False, f"生成报告失败: {str(e)}"

    def send_alert(self, alert_type, message):
        """发送警报消息"""
        emoji = {
            "success": "✅",
            "warning": "⚠️",
            "error": "❌",
            "info": "ℹ️"
        }.get(alert_type, "📌")

        title = f"{emoji} 校园网监控警报"
        text = f"""
**警报类型**:{alert_type}
**发生时间**:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
**详细内容**:{message}

请及时检查校园网连接状态。
"""
        return self.send_message(title, text, msg_type="markdown")

    def _get_suggestions(self, daily_status, success_rate):
        """根据状态给出建议"""
        if daily_status["total_checks"] == 0:
            return "今日尚未进行检测,请检查监控系统是否正常运行。"
        elif success_rate < 50:
            return "⚠️ **警告:成功率较低!**\n建议检查:\n1. 校园网账号密码是否正确\n2. Edge浏览器驱动是否匹配\n3. 网络连接是否稳定"
        elif daily_status["failed_attempts"] > 3:
            return "⚠️ **注意:失败次数较多**\n可能是校园网页面有更新,需要检查脚本中的元素定位。"
        elif daily_status.get("connection_errors", 0) > 2:
            return "⚠️ **注意:网络连接不稳定**\n请检查电脑的网络连接或路由器状态。"
        else:
            return "✅ **系统运行良好!**\n校园网连接稳定,无需人工干预。"


# ============ 校园网连接器 ============
class CampusNetworkConnector:
    def __init__(self, config):
        self.config = config
        self.logger = NetworkLogger()

    def connect_to_campus_network(self):
        """连接校园网"""
        try:
            service = Service(executable_path=self.config["edge_driver_path"])
            edge_options = Options()
            edge_options.add_argument('--headless')
            edge_options.add_argument('--disable-gpu')
            edge_options.add_argument('--log-level=3')
            edge_options.add_argument('--disable-dev-shm-usage')
            edge_options.add_argument('--no-sandbox')

            driver = webdriver.Edge(service=service, options=edge_options)
            driver.set_window_size(1920, 1080)

            driver.get(self.config["url"])
            driver.implicitly_wait(10)

            try:
                driver.find_element(By.XPATH, "//*[@id='toLogOut']")
                driver.quit()
                return "已登录", "校园网已连接,无需重新登录"
            except NoSuchElementException:
                username_input = driver.find_element(By.XPATH, "//*[@id='username']")
                password_input = driver.find_element(By.XPATH, "//*[@id='pwd']")
                select_service = driver.find_element(By.XPATH, "//*[@id='selectDisname']")
                services = driver.find_element(By.XPATH, "//*[@id='_service_3']")  # 默认选择联通
                login_button = driver.find_element(By.XPATH, "//*[@id='loginLink_div']")

                username_input.send_keys(self.config["username"])
                driver.find_element(By.XPATH, "//*[@id='pwd_tip']").click()
                password_input.send_keys(self.config["password"])
                select_service.click()
                services.click()
                login_button.click()

                time.sleep(3)

                try:
                    driver.find_element(By.XPATH, "//*[@id='toLogOut']")
                    result = "登录成功", "校园网连接成功"
                except:
                    result = "登录状态不确定", "点击了登录但无法确认结果"

                driver.quit()
                return result

        except Exception as e:
            error_msg = str(e)
            if "session not created" in error_msg or "driver" in error_msg.lower():
                return "驱动错误", f"Edge驱动问题: {error_msg[:100]}"
            elif "timeout" in error_msg.lower():
                return "连接超时", "访问校园网页面超时"
            elif "element" in error_msg.lower():
                return "页面元素错误", "找不到登录元素,页面可能已更改"
            else:
                return "连接异常", f"错误: {error_msg[:100]}"


# ============ 主执行函数 ============
def perform_network_check():
    """执行一次完整的网络检测"""
    print("\n" + "=" * 50)
    print(f"开始执行网络检测 - {datetime.now().strftime('%H:%M:%S')}")
    print("=" * 50)

    logger = NetworkLogger()
    connector = CampusNetworkConnector(CONFIG)
    checker = NetworkChecker()

    # 1. 检查网络连通性
    print("1. 检查网络连接状态...")
    has_internet = checker.check_internet_connection()
    has_campus = checker.check_campus_network()

    if has_internet:
        print("   ✅ 互联网连接正常")
        logger.log_check("互联网连接正常", "无需登录操作")
        return "已连接互联网"

    if not has_campus:
        print("   ❌ 校园网不可达,可能网络断开")
        logger.log_check("网络连接失败", "校园网登录页面无法访问")

        # 发送警报
        reporter = DingTalkReporter(CONFIG)
        reporter.send_alert("error", "校园网登录页面无法访问,请检查网络连接")
        return "网络连接失败"

    # 2. 校园网登录
    print("2. 尝试登录校园网...")
    status, details = connector.connect_to_campus_network()
    logger.log_check(status, details)

    # 3. 如果登录失败,发送警报
    if "失败" in status or "错误" in status or "异常" in status:
        reporter = DingTalkReporter(CONFIG)
        reporter.send_alert("warning", f"校园网登录失败: {details}")

    # 4. 验证登录结果
    if "成功" in status or "已登录" in status:
        print("3. ✅ 验证通过")
    else:
        print(f"3. ❌ 登录失败: {details}")

    return status


def send_daily_report():
    """发送每日报告"""
    print("\n" + "=" * 50)
    print(f"开始发送每日报告 - {datetime.now().strftime('%H:%M:%S')}")
    print("=" * 50)

    logger = NetworkLogger()
    reporter = DingTalkReporter(CONFIG)

    success, message = reporter.send_daily_report(logger.today_status)

    if success:
        logger.log_check("报告发送成功", "已发送到钉钉群")
        print(f"✅ {message}")

        # 重置今日状态
        logger.today_status = logger._create_new_status()
        logger.save_today_status()
    else:
        logger.log_check("报告发送失败", message)
        print(f"❌ {message}")

    return success


# ============ 定时调度 ============
def setup_schedule():
    """设置定时任务"""

    schedule.clear()

    # 设置固定时间点的检测任务
    for check_time in CONFIG["check_times"]:
        schedule.every().day.at(check_time).do(perform_network_check)
        print(f"✅ 已设置检测任务: 每天 {check_time}")

    # 设置报告任务
    schedule.every().day.at(CONFIG["report_time"]).do(send_daily_report)
    print(f"✅ 已设置报告任务: 每天 {CONFIG['report_time']}")

    # 设置定期检查任务
    schedule.every(CONFIG["check_interval"]).minutes.do(perform_network_check)
    print(f"✅ 已设置定期检查: 每{CONFIG['check_interval']}分钟")


def run_scheduler():
    """运行调度器"""
    print("\n" + "=" * 50)
    print("🚀 校园网自动监控系统启动(钉钉机器人版)")
    print(f"📅 启动时间: {datetime.now()}")
    print("=" * 50)

    # 发送启动通知
    reporter = DingTalkReporter(CONFIG)
    success, message = reporter.send_alert("info",
                                           f"校园网监控系统已启动\n主机: {os.environ.get('COMPUTERNAME', '未知')}\n时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")

    if success:
        print("✅ 启动通知已发送到钉钉")
    else:
        print(f"⚠️ 启动通知发送失败: {message}")

    # 立即执行一次初始检测
    print("\n执行初始检测...")
    perform_network_check()

    # 设置定时任务
    setup_schedule()

    print("\n📋 当前定时任务列表:")
    for job in schedule.jobs:
        print(f"   • {job}")

    print("\n🔄 监控系统运行中... (按 Ctrl+C 停止)")
    print("=" * 50)

    # 主循环
    try:
        while True:
            schedule.run_pending()
            time.sleep(1)
    except KeyboardInterrupt:
        print("\n\n👋 监控系统正在停止...")

        # 发送停止通知
        reporter = DingTalkReporter(CONFIG)
        reporter.send_alert("info", f"校园网监控系统已停止\n时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")

        print("监控系统已停止")
        sys.exit(0)


# ============ 主程序入口 ============
if __name__ == "__main__":
    # 检查配置文件中的必要信息
    if CONFIG["username"] == "你的学号" or CONFIG["password"] == "你的密码":
        print("⚠️ 警告:请先修改配置文件中的账号密码!")
        print("修改 CONFIG 字典中的 username 和 password")
        input("按回车键退出...")
        sys.exit(1)

    if CONFIG["dingtalk"]["webhook"] == "https://oapi.dingtalk.com/robot/send?access_token=你的access_token":
        print("⚠️ 警告:请先配置钉钉机器人!")
        print("需要配置钉钉机器人的 webhook 地址")
        print("获取方法:")
        print("1. 打开钉钉 → 群聊 → 群设置 → 智能群助手 → 添加机器人")
        print("2. 选择'自定义'机器人,设置名称")
        print("3. 安全设置选择'加签',复制webhook和secret")
        input("按回车键退出...")
        sys.exit(1)

    # 检查Edge驱动是否存在
    if not os.path.exists(CONFIG["edge_driver_path"]):
        print(f"❌ 错误:找不到Edge驱动")
        print(f"请确认路径正确: {CONFIG['edge_driver_path']}")
        input("按回车键退出...")
        sys.exit(1)

    # 运行监控系统
    run_scheduler()

4.1 关键配置注意事项

  1. 路径格式 :Windows路径中,Python用 /\\ 表示路径分隔符,禁止用单个 \(会被识别为转义字符)

  2. 运营商适配 :代码默认选择联通(_service_3),若你的运营商是电信/移动,需修改CampusNetworkConnector类中services的XPATH,替换为对应运营商的元素id

    复制代码
    选择运营商数字(由于主包是在金坛办的校园卡,所以会有常州的后缀):
    _service_0:校园网(Campus NET)
    _service_1:中国移动(CMCC NET)
    _service_2:中国电信-常州(CTCC NET-CZ)
    _service_3:中国联通-常州(CUCC NET-CZ)  
  1. 网关适配NetworkChecker类中默认ping校园网网关10.96.0.155,若学校网关变更,需同步修改

五、批处理文件(.bat)说明与代码还原

还给大家提供的两个批处理文件是一键启动脚本,用于简化启动流程,无需手动输入命令。以下是两个文件的作用、还原代码和使用说明:

5.1 「快速启动.bat」

作用

前台启动主程序 ,弹出命令行窗口,实时显示程序运行日志、检测结果,适合调试、手动启动、查看运行状态

还原代码(可重新创建该文件)
bat 复制代码
@echo off
chcp 65001 > nul
title 校园网自动连接监控系统(前台运行)
echo ==============================================
echo       校园网自动连接监控系统(前台启动)
echo ==============================================
echo.
echo 正在启动系统,请稍候...
echo.
cd /d "某盘:\school_net_connect"  # 替换为你自己的文件夹路径
python campus_net_auto.py
echo.
echo 系统已停止运行,按任意键关闭窗口...
pause > nul
使用说明
  • 双击运行,会弹出CMD窗口,实时打印系统日志(如启动通知、检测结果、日报发送)
  • Ctrl+C 可停止系统,会自动发送停止通知到钉钉
  • 适合调试、临时启动,不适合长期挂机

5.2 「启动监控.bat」

作用

后台静默启动主程序 ,不显示任何窗口,程序在后台运行,适合长期挂机、开机自启,不影响日常使用。

还原代码(可重新创建该文件)
bat 复制代码
@echo off
chcp 65001 > nul
cd /d "某盘:\school_net_connect"  # 替换为你自己的文件夹路径
start "" pythonw.exe campus_net_auto.py
exit
使用说明
  • 双击运行,无任何窗口弹出,程序在后台运行
  • 停止方法:打开任务管理器 → 「详细信息」→ 找到 pythonw.exe 进程 → 结束任务
  • 适合长期挂机、开机自启,不打扰日常使用

六、完整部署与启动流程

6.1 首次部署步骤

  1. 完成「前置准备」:安装Python、Edge、驱动,安装依赖库
  2. 完成「钉钉机器人配置」,获取Webhook和Secret
  3. 修改Python代码的CONFIG配置,修正缩进错误
  4. 创建/确认两个批处理文件,路径与代码一致
  5. 测试运行:
    • 双击「快速启动.bat」,查看CMD窗口是否正常启动
    • 检查钉钉是否收到「系统启动」通知
    • 手动断开校园网,测试是否自动重连、发送通知
  6. 测试通过后,可设置开机自启:
    • Win+R,输入 shell:startup,打开开机启动文件夹
    • 将「启动监控.bat」的快捷方式拖入该文件夹,开机自动后台运行

6.2 日常启动

  • 临时使用/调试:双击「快速启动.bat」
  • 长期挂机:双击「启动监控.bat」,或开机自动启动

七、日志与通知说明

7.1 日志文件

  • network_status.log:记录所有检测、登录、通知的详细日志,可排查问题
  • daily_status.json:记录当日的检测统计、状态,用于生成每日日报

7.2 钉钉通知类型

  1. 系统启停通知:系统启动/停止时发送
  2. 实时警报:断网、登录失败、网络异常时发送
  3. 每日日报:每日22:00自动发送,包含当日检测统计、成功率、优化建议

八、常见问题排查

8.1 启动报错:找不到Edge驱动

  • 原因:驱动路径错误、驱动版本与Edge不匹配
  • 解决:
    1. 检查CONFIG中的edge_driver_path是否正确
    2. 打开Edge浏览器 → 「设置」→「关于Microsoft Edge」,查看版本
    3. 下载对应版本的msedgedriver.exe,替换旧文件

8.2 钉钉收不到通知

  • 原因:Webhook/Secret错误、加签未开启、网络问题
  • 解决:
    1. 检查CONFIG中的webhooksecret是否完全复制
    2. 确认钉钉机器人开启了「加签」安全设置
    3. 测试网络是否能访问https://oapi.dingtalk.com

8.3 校园网登录失败

  • 原因:账号密码错误、登录页更新、XPATH失效
  • 解决:
    1. 手动登录校园网,确认账号密码正确
    2. 检查校园网登录页是否更新,若更新需修改代码中Selenium的XPATH定位
    3. 查看日志文件network_status.log,定位具体错误

8.4 后台运行无法停止

  • 解决:打开任务管理器 → 「详细信息」→ 找到pythonw.exe进程 → 结束任务

8.5 中文乱码

  • 解决:批处理中已添加chcp 65001,代码中所有文件读写均用utf-8编码,不会出现乱码

九、维护与升级

  1. Edge浏览器更新:每次Edge更新后,需同步更新msedgedriver.exe,否则会报错
  2. 校园网登录页更新:若学校更换登录页,需修改代码中Selenium的元素定位(XPATH)
  3. 钉钉机器人更换 :若更换机器人,需更新CONFIG中的webhooksecret
  4. 日志清理 :定期清理network_status.log,避免文件过大

配置完毕之后即可在钉钉群中接收消息啦

相关推荐
kobesdu7 小时前
【ROS2实战笔记-12】rosshow:终端里的盲文可视化与无头机器人的现场调试
笔记·机器人·ros·移动机器人
workflower8 小时前
具身智能行业应用-生活服务业
大数据·人工智能·机器人·动态规划·生活
xwz小王子9 小时前
Science Robotics 让机器人学会“削果皮”:一种曲面物体操作任务转移的新方法
人工智能·机器人
xiaoduo AI9 小时前
客服机器人非工作时间能休眠?智能Agent开放平台定时唤醒,无人值守省资源?
大数据·人工智能·机器人
code_pgf13 小时前
Octo 算法详解-开源通用机器人策略模型技术报告
算法·机器人·开源
经济元宇宙14 小时前
全场景 AI 智能交互 专业级语音机器人推荐什么?
人工智能·机器人·语音识别
EriccoShaanxi16 小时前
高性能MEMS陀螺仪:精准导航,引领未来科技新风尚
科技·机器人·无人机
IT观测16 小时前
电话机器人服务商选型指南:核心维度与实操解析
人工智能·机器人·语音识别
Jump 不二16 小时前
揭秘腾讯 Ima 知识库架构:从开源 WeKnora 看 RAG + 知识图谱落地实践
人工智能·语言模型·架构·机器人·开源·知识图谱
Deepoch18 小时前
Deepoc 具身模型开发板在果蔬采摘机器人自主作业中的技术研究
机器人·开发板·采摘机器人·具身模型·deepoc