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

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

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

团队有个项目,部署在某国企的服务器上,采用了信创的架构。问题来了,极不稳定,经常发现网站访问不了,或者宕机了。于是就想自己用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 拖进去,完成:服务器开机 → 自动后台运行脚本 → 自动定时检测 → 异常微信告警。


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


分享给朋友:

相关文章

乾元轩博客上了google搜索结果页面

乾元轩博客新域名imwen.com自开通以来,已经有些时日了,每天都关注百度、谷歌、搜搜、搜狗等各大搜索引擎是否收录了本站,遗憾的是,所谓的本土搜索引擎诸如百度、搜搜、搜狗都还没有收录本站,或者说是还…

自定义CSS字间距行间距宽度大小

有些时候发现网站的字间距或者行间距太密或者太松,想要调整一下,最好的办法就是用CSS控制,那么,如何利用CSS控制字间距或者行间距的宽度大小呢,乾元轩提供的方法如下…

zblog验证码加字母后无法显示不全

zblog1.8版中,把验证码修改为数字0-9,再加26个小字母,发现后台登录不了了,不要担心,经过乾元轩个人博客网站的亲身体验,找到一种简单的解决方案了,方法很简单,只需要几步就可以让zblog模板…

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

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

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

网络推广是SEO,还是SEM?以APP推广为例

因为手机站展示内容有限,而且有些SEO技术问题不能实现,所以,依靠SEM拼杀,是较好的选择了。特别是,app一般都是在手机端使用的,用手机站找APP的用户更多,如何把自己的APP产品更大面的展示在手机…

用户一般在哪里下载APP

手机应用软件,不管是手游类,还是其他应用软件,就算做得再完美,没有合理的渠道推广给用户,没有用户量,就不是最好的app应用软件。那么,反过来,以用户的角度而言,一般会在哪里下载他用户需要的app呢?这…

发表评论

访客

看不清,换一张

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