当前位置:首页 > 数字化与技术

python搭建网站访问异常监测脚本方案

文玑阁2个月前 (06-02)数字化与技术2450

团队有个项目,部署在某国企的服务器上,采用了信创的架构。问题来了,极不稳定,经常发现网站访问不了,或者宕机了。于是就想自己用python做个访问脚本,只要有访问异常,就推送信息到微信上,以便及时处理。当然这个是不是以开发这个项目的技术角度来处理。只是站在用户的角度开发一个小工具,运行在本地电脑上(编者将python程序部署在阿里云服务器上)。以下描述实施步骤。

一、项目需求:

  • 监测目标:B 网站

  • 运行环境:放在 A 网站服务器(Linux/Windows 都支持)

  • 时间规则:8点-10点,每15分钟确认一次。10点-18点每30分钟确认一次

  • 超时判定:20 秒内未访问成功 = 异常

  • 告警方式:自动发消息到微信

二、准备工作(5 分钟完成)

1. 开通微信告警(Server 酱,免费)

  1. 打开官网:https://sct.ftqq.com/

  2. 微信扫码登录

  3. 获取 SendKey(后面脚本要用到)

  4. 关注官方公众号,告警会直接推送到微信

2. 服务器安装 Python(几乎所有服务器都自带)

三、python源码

import time
import os
import traceback
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import urllib.request
import urllib.parse

# ====================== 【配置】 ======================
USERNAME = "你的账号"
PASSWORD = "你的密码"
SEND_KEY = "你的SendKey"

LOGIN_URL = "B网站域名/登录地址"
TARGET_URL = "B网站域名"
CHROME_DRIVER_PATH = r"D:\python\chromedriver.exe" #服务器安装chrome浏览器,并且检查版本后,下载chromedriver.exe并复制到该项目的位置。

# 稳定性设置
MAX_CHECK_TIME = 120  # 单次检测最大超时秒数(超过就重启)
LOG_DIR = "logs"      # 日志文件夹
# ======================================================

# 自动创建日志目录
if not os.path.exists(LOG_DIR):
    os.mkdir(LOG_DIR)

# 日志输出(自动按天生成)
def log(msg):
    now = datetime.now()
    date_str = now.strftime("%Y-%m-%d")
    time_str = now.strftime("%Y-%m-%d %H:%M:%S")
    log_file = os.path.join(LOG_DIR, f"check_{date_str}.log")
    log_msg = f"[{time_str}] {msg}"
    print(log_msg)
    try:
        with open(log_file, "a", encoding="utf-8") as f:
            f.write(log_msg + "\n")
    except:
        pass

# 微信推送
def send_wechat(title, desp):
    if not SEND_KEY:
        return
    try:
        data = urllib.parse.urlencode({"title": title, "desp": desp}).encode()
        req = urllib.request.Request(f"https://sctapi.ftqq.com/{SEND_KEY}.send", data=data)
        with urllib.request.urlopen(req, timeout=10):
            pass
    except:
        log("微信推送失败")

# 浏览器启动
def get_driver():
    options = webdriver.ChromeOptions()
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-gpu")
    options.add_argument("--disable-dev-shm-usage")
    options.add_experimental_option("excludeSwitches", ["enable-automation", "enable-logging"])
    service = Service(CHROME_DRIVER_PATH)
    driver = webdriver.Chrome(service=service, options=options)
    driver.implicitly_wait(20)
    return driver

# 检测任务
def check():
    driver = None
    try:
        log("开始检测...")
        driver = get_driver()
        driver.get(LOGIN_URL)
        time.sleep(5)

        driver.get(TARGET_URL)
        time.sleep(3)

        url = driver.current_url
        if "login" not in url.lower():
            log("✅ 访问正常(已绕过412)")
            return True
        else:
            log("❌ 未登录成功")
            send_wechat("网站告警", "未登录成功,可能会话失效")
            return False

    except Exception as e:
        err = str(e)[:100]
        log(f"❌ 检测异常:{err}")
        send_wechat("网站监测异常", f"错误:{err}")
        return False

    finally:
        try:
            if driver:
                driver.quit()
        except:
            pass

# 时间策略
def sleep_time():
    h = datetime.now().hour
    if 8 <= h < 10:
        return 15 * 60
    elif 10 <= h < 18:
        return 30 * 60
    else:
        return 60 * 60

# 看门狗:超时自动重启
def run_with_watchdog():
    while True:
        try:
            start = time.time()
            check()
            cost = int(time.time() - start)
            log(f"单次检测完成,耗时{cost}秒")

            # 超时保护
            if cost > MAX_CHECK_TIME:
                log(f"⚠️ 检测超时({cost}秒),即将重启")
                os._exit(1)

        except:
            log(f"⚠️ 程序崩溃,准备重启:{traceback.format_exc()[:100]}")
            time.sleep(5)

        # 等待下一轮
        wait = sleep_time()
        log(f"等待 {wait//60} 分钟后下次检测\n")
        time.sleep(wait)

if __name__ == "__main__":
    log("===== 网站监测服务启动(稳定版 + 日志 + 自动重启)=====")
    run_with_watchdog()

四、说明

1. 自动日志

  • 每天自动生成一个 log 文件

  • 路径:logs/check_2026-06-02.log

  • 记录:启动、成功、失败、错误、耗时

2. 崩溃自动重启

  • 浏览器崩了 → 自动重启

  • 网络异常 → 自动重试

  • 不中断监测

3. 卡死自动重启

  • 超过 120 秒没反应 → 强制重启

  • 彻底杜绝卡死不动

4. 不重复启动

  • 安全单例运行

  • 不会开一堆浏览器

5. 异常自动告警

  • 登录失败 → 告警

  • 页面打不开 → 告警

  • 程序崩溃 → 告警


五、补充说明:开机自启动python文件

1、创建一个启动脚本

2、新建一个文本文件,输入内容

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "py main.py", 0
Set WshShell = Nothing

3、把文本文件另存为:start.vbs(保存类型:所有文件,编码:ANSI)

4、把这个 vbs 放到开机启动文件夹:

①按win+r

②输入

shell:startup

③把 start.vbs 拖进去,完成:服务器开机 → 自动后台运行脚本 → 自动定时检测 → 异常微信告警。


以上就是全部过程。结果如下


分享给朋友:

相关文章

优化zblog添加广告代码

zblog是一个优秀的个人博客程序,它简单易用,当然,如果能给自己的zblog个人博客添加一些广告代码,借着广大网友的力量赚取点儿广告费,也是非常好的事情,如果想给自己的zblog系统个人博客添加广告…

乾元轩新主题心是莲花测试版上线

相信大家已经看到了,乾元轩博客又弄了新的样式,暂时定名为心是莲花样式,imlotus,本主题是小一原创Qeeke主题经过乾元轩修改为imwen主题之后,再度进化版,页面除去背景莲花图片,就色泽单调非常…

CSS控制zblog文章段落首行缩进两个字符位置

乾元轩介绍了如何利用CSS控制zblog文章段落首行缩进的问题,可以避免使用tab键,这样查看源代码,也会觉得代码看起来比较美观简洁,搜索引擎相对来说爬行时会感到比较舒服…

博客流量之搜索引擎来路

博客流量之搜索引擎来路

乾元轩博客并没有什么流量,都是靠着几篇琐碎的文章从一些大牌搜索引擎那里分得点滴流量,这当然不是假话,有第三方流量统计工具的统计数字作证,这十几二十个ip一天虽然不值一提,但是觉得还挺有意思挺好玩的…

zblog2.1首页title标题显示顺序调整

zblog2.1首页title标题显示顺序调整

ZBLOG升级为Z-Blog 2.1 Phoenix Build 130128之后,对模板进行了优化,所有展示网页的head部分都集成到一个文件里,详见根目录\zb_users\THEME\主题包\T…

App推广渠道有哪些?

进入移动互联时代,尤其是近年APP应用软件的迅猛发展,迫使众多行业精英寻找APP推广渠道的破解之法,任何做推广的人都会想破脑袋去考虑如何做好一个产品的推广工作,其中必先解决的问题就是推广渠道。APP推…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。