掉线监测-tezos rpc不能用,改为残疾网页监测

自从有了编程伴侣,备忘的需求变得更低了,明显不担心记不住语法需要记录的情景。然而还是保持习惯,就当写日记吧,记录一下自己时不时在瞎捣腾啥。

tm,好人谁记日记。

 就是监控灰色各自前紧挨着出现了多少红色格子。一共查灰色格子前12个格子,如果红色格子大于了8个,就得上去服务器看一眼。脚本写完用个定时程序隔1小时查查,足够了。

说起来,为了这个自己的项目,写了好几个监控,但是程序本身的log都防不住,出现的问题是专门跑项目的go程序之类的,日志里面居然不报错,但是明明就是漏了。

以下python脚本底层是在折腾爬虫针对动态页面的svg加载后元素变化的抓取,以及smtp邮件发送。放个雏形,这个不能线上用,不然false alarm太多。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import re
import time
import osimport smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.image import MIMEImage# ===== 配置区 =====
SMTP_SERVER = "smtp.sohu.com"  # 邮箱服务商SMTP地址
PORT = 465                     # 端口号(SSL用465,TLS用587)
SENDER_EMAIL = "wawa@sohu.com"  # 发件邮箱
SENDER_PASSWORD = "123"  # 邮箱授权码(非登录密码)
RECIPIENT_EMAIL = "567@yahoo.com"  # 收件邮箱
# ==================def send_email(subject, content, is_html=False, attachments=None, images=None):"""发送邮件核心函数"""try:# 1. 创建邮件容器msg = MIMEMultipart()msg["From"] = SENDER_EMAILmsg["To"] = RECIPIENT_EMAILmsg["Subject"] = subject# 2. 添加邮件正文content_type = "html" if is_html else "plain"msg.attach(MIMEText(content, content_type, "utf-8"))# 3. 添加附件(可选)if attachments:for file_path in attachments:with open(file_path, "rb") as file:part = MIMEApplication(file.read())part.add_header("Content-Disposition", f"attachment; filename={file_path.split('/')[-1]}")msg.attach(part)# 4. 添加图片(可选)if images:for img_path, cid in images.items():  # cid用于HTML中引用with open(img_path, "rb") as img_file:img = MIMEImage(img_file.read())img.add_header("Content-ID", f"<{cid}>")msg.attach(img)# 5. 连接SMTP服务器并发送with smtplib.SMTP_SSL(SMTP_SERVER, PORT) as server:  # SSL连接server.login(SENDER_EMAIL, SENDER_PASSWORD)server.sendmail(SENDER_EMAIL, RECIPIENT_EMAIL, msg.as_string())print("✅ 邮件发送成功")except Exception as e:print(f"❌ 邮件发送失败: {str(e)}")def fetch_dynamic_rect_ids_with_gecko():# 配置Firefox无头模式firefox_options = Options()firefox_options.add_argument("--headless")  # 无界面运行firefox_options.set_preference("dom.webnotifications.enabled", False)  # 禁用通知弹窗# 设置geckodriver路径(需提前下载并配置)# 下载地址:https://github.com/mozilla/geckodriver/releases# gecko_path = os.path.join(os.getcwd(), "geckodriver")  # Linux/macOSgecko_path = "/usr/local/bin/geckodriver"# gecko_path = r"C:\path\to\geckodriver.exe"  # Windows路径示例try:# 初始化geckodriver服务service = Service(executable_path=gecko_path)driver = webdriver.Firefox(service=service, options=firefox_options)driver.get("https://niyaojiankongde.wangzhan")time.sleep(12)driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  # 滚动到底部,用来欺骗服务器,是人在动# 或模拟点击:driver.find_element(By.CSS_SELECTOR, "#trigger_button").click()# 显式等待SVG内容渲染(关键步骤)wait = WebDriverWait(driver,18)rects = wait.until(EC.presence_of_all_elements_located((By.XPATH,"//*[local-name()='svg']//*[local-name()='rect']")))#WebDriverWait(driver, 15).until(#    EC.presence_of_all_elements_located((By.TAG_NAME, "rect")) # 此处疑似无效#    #EC.visibility_of_element_located((By.TAG_NAME,"rect")) # 此处疑似无效#    #EC.element_to_be_clickable((By.TAG_NAME,"rect"))#)#rects = driver.find_elements(By.TAG_NAME, "rect")driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  # 滚动到底部,用来欺骗服务器,是人在动time.sleep(1)signal_mail = Falsefirst_grey_id = "null"match_red_ids = []pattern_grey = re.compile(r'fill:\s*rgb\(\s*100\s*,\s*\d+\s*,\s*\d+\s*\)')  # 匹配r=100的RGB样式,这是灰色pattern_red =  re.compile(r'fill:\s*rgb\(\s*176\s*,\s*\d+\s*,\s*\d+\s*\)')  # 匹配r=176的RGB样式,这是红色特征for rect in rects:style = rect.get_attribute("style")rect_id = rect.get_attribute("id")if style and pattern_grey.search(style) and rect_id and first_grey_id == "null":first_grey_id = rect_idif style and pattern_red.search(style) and rect_id:match_red_ids.append(rect_id)# 进入第一个灰色方格,和它之前12个格子的颜色判断。if first_grey_id != "null":red_id_count_just_before_grey = 0grey_id_num = first_grey_id.split("_")grey_id_father = int(grey_id_num[1])grey_id_son = int(grey_id_num[2])for i in range [1:12]:possible_red_id = "null"k = grey_id_son - iif k >= 0:possible_red_id = "id_" + str(grey_id_father) + "_" + str(k)elif k < 0 and grey_id_father > 0:possible_red_id = "id_" + str(grey_id_father - 1) + "_" + str(k+34)  #目前那个svg的小格子群图像,一共有33排。else:continueif possbile_red_id != "null" and possible_red_id in match_red_ids:red_id_count_just_before_grey = red_id_count_just_before_grey + 1if red_id_count_just_before_grey > 7:signal_mail = Trueelse:passreturn signal_mailexcept Exception as e:send_email(subject="破访问失败了",content="你这程序写的不行",)return []finally:if 'driver' in locals():driver.quit()  # 确保资源释放if __name__ == "__main__":#print("🔥 启动Geckodriver动态解析...")#start_time = time.time()signal_sending = fetch_dynamic_rect_ids_with_gecko()if signal_sending:# 写个邮件发送程序,纯文本即可。send_email(subject="xx出现了8个红点",content="xx出现了8个红点",)#print(f"\n✅ 发现 {len(result_ids)} 个匹配元素:")#for idx, rect_id in enumerate(result_ids[:10], 1):#    print(f"{idx}. {rect_id}")#if len(result_ids) > 10:#    print(f"(仅显示前10条,共{len(result_ids)}条)")#print(f"\n⏱️ 总耗时: {time.time()-start_time:.2f}秒")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88937.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark Expression codegen

Expression codegen src/main/scala/org/apache/spark/sql/catalyst/expressions/Expression.scala def genCode(ctx: CodegenContext): ExprCode = {ctx.subExprEliminationExprs.get(ExpressionEquals(

Axios方法完成图书管理页面完整版

一、目的 需要实现的功能有包括&#xff1a; 从服务器发送请求&#xff0c;获取图书列表并渲染添加新图书编辑现有图书信息删除图书以上每一步都实现与服务器存储数据同步更改 二、基础配置 引入Axios库&#xff1a; <script src"https://cdn.jsdelivr.net/npm/ax…

SQLlite下载以及简单使用

SQLite Download Page cd D:\WK\2025\StudentManagerSystem\sqlite D: entManagerSystem\sqlite>sqlite3.exe 所建库的名字.db 一&#xff1a;命令 <1>打开某个数据库文件中 sqlite3 test.db<2>查看所有的命令介绍(英文) .help<3>退出当前数据库系统 .qu…

函数柯里化详解

一、函数柯里化&#xff1a; 是一种高阶函数技术&#xff0c;它将一个多参数函数转换为一系列单参数函数的链式调用。 核心概念 定义&#xff1a;将一个函数 f(a, b, c) 转换为 f(a)(b)© 的形式 **本质&#xff1a;**通过闭包保存参数&#xff0c;实现分步传参 关键特征&a…

C++11:constexpr 编译期性质

C11&#xff1a;constexpr & 编译期性质常量表达式 constexpr变量IiteralType函数自定义字面量参数匹配与重载规则静态断言常量表达式 constexpr const expression常量表达式&#xff0c;是C11引入的新特性&#xff0c;用于将表达式提前到编译期进行计算&#xff0c;从而减…

【每天一个知识点】多模态信息(Multimodal Information)

常用的多模态信息&#xff08;Multimodal Information&#xff09;指的是来源于多种感知通道/数据类型的内容&#xff0c;这些信息可以被整合处理&#xff0c;以提升理解、推理与生成能力。在人工智能和大模型系统中&#xff0c;典型的多模态信息主要包括以下几类&#xff1a;✅…

iOS 抓包工具精选对比:不同调试需求下的工具适配策略

iOS 抓包痛点始终存在&#xff1a;问题不是“抓不抓”&#xff0c;而是“怎么抓” 很多开发者都遇到过这样的情况&#xff1a; “接口没有返回&#xff0c;连日志都没打出来”“模拟器正常&#xff0c;真机无法请求”“加了 HTTPS 双向认证&#xff0c;抓不到了”“明明设置了 …

图像修复:深度学习实现老照片划痕修复+老照片上色

第一步&#xff1a;介绍 1&#xff09;GLCIC-PyTorch是一个基于PyTorch的开源项目&#xff0c;它实现了“全局和局部一致性图像修复”方法。该方法由Iizuka等人提出&#xff0c;主要用于图像修复任务&#xff0c;能够有效地恢复图像中被遮挡或损坏的部分。项目使用Python编程语…

css 边框颜色渐变

border-image: linear-gradient(90deg, rgba(207, 194, 195, 1), rgba(189, 189, 189, 0.2),rgba(207, 194, 195, 1)) 1;

本地 LLM API Python 项目分步指南

分步过程 需要Python 3.9 或更高版本。 安装 Ollama 并在本地下载 LLM 根据您的操作系统&#xff0c;您可以从其网站下载一个或另一个版本的 Ollama 。下载并启动后&#xff0c;打开终端并输入以下命令&#xff1a; ollama run llama3此命令将在本地拉取&#xff08;下载&…

日本的所得税计算方式

✅ 【1】所得税的计算步骤&#xff08;概要&#xff09; 日本的所得税大致按照以下顺序来计算&#xff1a; 1️⃣ 统计收入&#xff08;销售额、工资等&#xff09; 2️⃣ 扣除必要经费等&#xff0c;得到「所得金額」 3️⃣ 扣除各类「所得控除」&#xff08;所得扣除&#xf…

【langchain4j篇01】:5分钟上手langchain4j 1.1.0(SpringBoot整合使用)

目录 一、环境准备 二、创建项目、导入依赖 三、配置 application.yml 四、注入Bean&#xff0c;开箱即用 五、日志观察 一、环境准备 首先和快速上手 Spring AI 框架一样的前置条件&#xff1a;先申请一个 apikey &#xff0c;此部分步骤参考&#xff1a;【SpringAI篇01…

js运算符

运算符 jarringslee*赋值运算符 - / 对变量进行赋值的运算符&#xff0c;用于简化代码。左边是容器&#xff0c;右边是值一元运算符正号 符号- 赋予数据正值、负值自增 自减– 前置和后置&#xff1a;i和i&#xff1a;一般情况下习惯使用后置i&#xff0c;两者在单独…

next.js 登录认证:使用 github 账号授权登录。

1. 起因&#xff0c; 目的: 一直是这个报错。2. 最终效果&#xff0c; 解决问题&#xff0c;能成功登录、体验地址&#xff1a;https://next-js-gist-app.vercel.app/代码地址&#xff1a; https://github.com/buxuele/next-js-gist-app3. 过程: 根本原因: github 的设置&…

深入理解设计模式:原型模式(Prototype Pattern)

在软件开发中&#xff0c;对象的创建是一个永恒的话题。当我们需要创建大量相似对象&#xff0c;或者对象创建成本较高时&#xff0c;传统的new操作符可能不是最佳选择。原型模式&#xff08;Prototype Pattern&#xff09;为我们提供了一种优雅的解决方案——通过克隆现有对象…

Rocky Linux 9 源码包安装php8

Rocky Linux 9 源码包安装php8大家好&#xff0c;我是星哥&#xff01;今天咱们不聊yum一键安装的“快餐式”部署&#xff0c;来点儿硬核的——源码编译安装PHP 8.3。为什么要折腾源码&#xff1f;因为它能让你深度定制PHP功能、启用最新特性&#xff0c;还能避开系统默认源的版…

Django母婴商城项目实践(四)

4、路由规划与设计 1、概述 介绍 路由称为 URL(Uniform Resource Locator,统一资源定位符),也称为 URLconf,对互联网上得到的资源位置和访问方式的一种简洁表示,是互联网上标准梓源的地址。互联网上的每个文件都有一个唯一的路由,用于指出网站文件的路由位置,也可以理…

论文阅读:arxiv 2025 A Survey of Large Language Model Agents for Question Answering

https://arxiv.org/pdf/2503.19213 https://www.doubao.com/chat/12038636966213122 A Survey of Large Language Model Agents for Question Answering 文章目录速览论文翻译面向问答的大型语言模型代理综述摘要一、引言速览 这篇文档主要是对基于大型语言模型&#xff08;…

ONNX 是什么

ONNX 是什么&#xff1f; ONNX&#xff0c;全称 Open Neural Network Exchange&#xff0c;是微软和 Facebook&#xff08;现在的 Meta&#xff09;联合发起的一个开放的神经网络模型交换格式。简单理解&#xff1a;ONNX 是一个通用的「AI 模型存档格式」。用 PyTorch、TensorF…

【Python3】掌握DRF核心装饰器:提升API开发效率

在 Django REST Framework (DRF) 中&#xff0c;装饰器&#xff08;Decorators&#xff09;通常用于视图函数或类视图&#xff0c;以控制访问权限、请求方法、认证等行为。以下是 DRF 中常用的装饰器及其功能说明&#xff1a; 1. api_view 用途: 用于基于函数的视图&#xff0c…