Python小工具——监听某网站的数据变化并进行邮件通知

目录

一、需求描述

二、解析

三、实例代码


一、需求描述

监听自考网2024年广东省6月份的毕业生学历注册进度,这是网址:https://www.chsi.com.cn/xlcx/count_zk.jsp,

如上图所示,我们想知道这个红色的空格啥时候被填满,就是已注册状态。

每天都打开看一眼可能会忘记,所以想写个脚本跑着去监听,发生改变就发个消息或者邮件提醒我。

二、解析

看了下网页请求链接,找到了数据请求的接口:

https://xjxl2.chsi.com.cn/public/zkprogress.mvc?type=2021&callback=jQuery21107199905304849694_1721886437073&_=1721891974000

从这个Get 请求看到返回的数据如下图:

那就可以通过请求接口,拿到数据之后去解析JSON中的内容,找到ssmc="广东",再获取"cnts"数组中有几个"Yes", 数了一下,广东2024年6月份是第七个"Yes", 那就让"Yes" 的个数为7或者大于等于7就给我们发通知。

用Python代码来实现:

def check_webpage_change(url):response = requests.get(url)# 找到左括号和右括号来提取有效的 JSON 部分start_index = response.text.find('{')end_index = response.text.rfind('}') + 1json_data = response.text[start_index:end_index]data = json.loads(json_data)  # 解析 JSON 数据# 现在您可以处理解析后的数据for item in data['object']:province = item['ssmc']if province == "广东":cnts = item['cnts']count = cnts.count("Yes")# 当yes 的个数为7表示已上传,发邮件通知if count >= 7:print("""*****************************\n***********已上传***************\n*****************************\n""")send_email("本科学历通知!!!", "=====广东省6月份已上传=====")exit()

由于拿到的数据包含在 "jQuery211028906734726660055_1721900048006({})" 中,所以需要多一步切割下数据,转成JSON数据在进行解析。

然后就是来实现发送消息,查了下微信和QQ提醒两种方式,

1、微信提醒:

  • 微信公众平台接口通常需要企业认证,个人较难使用。
  • 可以考虑使用第三方库如itchat(可能存在稳定性和合规性问题)。

2、 QQ 提醒:

  • 可以使用 QQ 邮箱发送邮件来实现提醒。

那就选择通过发送邮件的方式来实现。

Python代码实现:

#发送文件
import smtplib
from email.mime.text import MIMETextdef send_email(subject, content):# 网易邮箱的服务器配置smtp_server ='smtp.163.com'port = 25sender_email = 'sender_email@163.com'#这里密码要用开通SMTP服务提供的授权密码sender_password = 'password'recivce_email = 'recivce_email@qq.com'# 构建邮件内容message = MIMEText(content)message['Subject'] = subjectmessage['From'] = sender_emailmessage['To'] = recivce_emailtry:# 连接服务器并发送邮件server = smtplib.SMTP(smtp_server, port)server.starttls()  # 如果服务器需要 TLS 加密,使用此命令server.login(sender_email, sender_password)server.sendmail(sender_email, recivce_email, message.as_string())server.quit()print("邮件发送成功")except Exception as e:print("邮件发送失败", e)

需要注意的是,发送邮箱需要开启SMTP服务,然后使用授权密码来进行登录。

以下是网易邮箱(包括 163、126 等)开启客户端(SMTP)授权的一般步骤:

  1. 登录网易邮箱网页版,例如 163 邮箱可登录https://mail.163.com/
  2. 点击上方的“设置”选项。
  3. 在设置列表中,选择“POP3/SMTP/IMAP”。
  4. 在客户端协议界面,选择“SMTP”服务并点击“开启”(如果之前未绑定手机号,可能需要先在密保平台中完成手机号绑定)。
  5. 在新弹出的弹窗中,可以选择扫码发送短信,或者点击下方“手动发送短信”(如果发送 5 分钟后系统依旧提示未收到短信,请联系移动运营商核实短信发送情况)。
  6. 点击“我已发送”后,如果系统检测到用户成功发送短信,便会提示客户端授权码(自动生成一串 16 位字母组合的唯一随机授权密码)

三、实例代码

下面是完整的代码:

import json
import time
#请求的
import requests
#发送文件
import smtplib
from email.mime.text import MIMETextdef start():print("************ 开始检测上传状态:************ \n")while True:milliseconds_since_epoch = int(time.time() * 1000)url="https://xjxl2.chsi.com.cn/public/zkprogress.mvc?type=2021&callback=jQuery21107199905304849694_1721886437073&_="+str(milliseconds_since_epoch)print("请求链接>"+url)check_webpage_change(url)time.sleep(6*60*60)  # 每隔 6个小时检查一次def check_webpage_change(url):response = requests.get(url)# 找到左括号和右括号来提取有效的 JSON 部分start_index = response.text.find('{')end_index = response.text.rfind('}') + 1json_data = response.text[start_index:end_index]data = json.loads(json_data)  # 解析 JSON 数据# 现在您可以处理解析后的数据for item in data['object']:province = item['ssmc']if province == "广东":cnts = item['cnts']count = cnts.count("Yes")# 当yes 的个数为7表示已上传,发邮件通知if count >= 7:print("""*****************************\n***********已上传***************\n*****************************\n""")send_email("本科学历通知!!!", "=====广东省6月份已上传=====")exit()def send_email(subject, content):# 网易邮箱的服务器配置smtp_server ='smtp.163.com'port = 25sender_email = 'sender_email.com'#这里密码要用开通SMTP服务提供的授权密码sender_password = '授权密码'recivce_email = 'recivce_email@qq.com'# 构建邮件内容message = MIMEText(content)message['Subject'] = subjectmessage['From'] = sender_emailmessage['To'] = recivce_emailtry:# 连接服务器并发送邮件server = smtplib.SMTP(smtp_server, port)server.starttls()  # 如果服务器需要 TLS 加密,使用此命令server.login(sender_email, sender_password)server.sendmail(sender_email, recivce_email, message.as_string())server.quit()print("邮件发送成功")except Exception as e:print("邮件发送失败", e)start()

生命不息,学习不止,若有不正确的地方,欢迎指正。

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

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

相关文章

【yolov8】|小目标优化|:增加CA机制 运行成功

🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀 你好,我是@努力的小巴掌 之前用baseline跑了yolov8。 为了提升性能,我们需要对yolov8进行优化。 本次的优化,我们从增加注意力机制开始…

无人机组装与操作实训课程详解

一、课程名称与目标 课程名称:无人机组装与操作实训课程 课程目标:本课程旨在培养学员对无人机组装技术的深入理解和实际操作能力,使学员能够独立完成无人机的组装、调试和日常维护工作,并具备一定的无人机操作能力和安全意识。…

Web开发:使用数据库工具Navicat技巧合集

1.EXCEL批量导入数据 打开Navicat准备导入数据,点击导入 选择excel 字段名行应该写0(下图错误) 下一步,表已经用语法建好了,因此不用打勾 配置好字段,下一步,点击开始即可。 2.数据表从一个服…

【HarmonyOS】HarmonyOS NEXT学习日记:七、页面与组件的生命周期

【HarmonyOS】HarmonyOS NEXT学习日记:七、页面与组件的生命周期 页面和组件 组件:用Component装饰的代码称为自定义组件页面:Entry装饰的组件即页面的根节点 组件生命周期 aboutToAppear:在创建自定义组件的新实例后&#xf…

WPF---Prism视图传参

Prism视图传参方式。 实际应用场景 点击tabitem中的列表数据,同步更新到ListStatic Region对应的界面。目前用两种方式实现了传参数据同步。 第一,事件聚合器(EventAggregator) 1. 定义事件 创建一个事件类,用于传…

手持式气象检测设备:便携科技,气象探测

一、手持式气象检测设备:小巧身躯,大能量 手持式气象检测设备,顾名思义,是一种可以手持操作的气象监测工具。它集成了温度、湿度、气压、风速风向等多种传感器,能够实时获取气象数据,并通过显示屏或手机APP…

springboot 使用jSerialComm 读取串口数据

依赖&#xff1a; <dependency> <groupId>com.fazecast</groupId> <artifactId>jSerialComm</artifactId> <version>${jSerialComm}</version> </dependency> 代码&#xff1a; private ByteArrayOutputStream byteArrayOutp…

Leetcode—240. 搜索二维矩阵 II【中等】

2024每日刷题&#xff08;149&#xff09; Leetcode—240. 搜索二维矩阵 II 实现代码 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int r 0;int c matrix[0].size() - 1;while(r < matrix.size() &&…

C++20之设计模式:观察者模式

观察者模式 观察者属性观察者Observer\<T>Observable<T> 连接观察者和被观察者依赖问题取消订阅和线程安全 可重入通过 Boost.Signals2 来实现 Observer总结 观察者 观察者模式是一种流行且必需的模式&#xff0c;QT的信号槽机制本质上就是观察者模式。 属性观察…

android get请求多个参数拼接工具

Android 多个参数拼接到请求地址中的小工具&#xff1a; public static String buildUrlWithParameters(String baseUrl, List<AssetGenesisBean> assetBeans) {StringBuilder urlBuilder new StringBuilder(baseUrl);if (assetBeans ! null && !assetBeans.isE…

服务器数据恢复—raid信息丢失导致RAID无法被识别的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 某单位机房搬迁&#xff0c;将所有服务器和存储搬迁到新机房并重新连接线路&#xff0c;启动所有机器发现其中有一台服务器无法识别RAID&#xff0c;提示未做初始化操作。 发生故障的这台服务器安装LINUX操作系统&#xff0c;配置了NF…

vue3创建vite项目

一、创建vue3 vite项目&#xff1a; 命令行创建&#xff1a;npm create vitelatest vue3-tdly-demo -- --template vue (1)先进入项目文件夹&#xff0c;cd vue3-tdly-demo (2)之后执行&#xff0c; npm install (3)最后运行&#xff0c;npm run dev 将main.js文件内容改成…

React hook 之 useState

在组件的顶部定义状态变量&#xff0c;并传入初始值&#xff0c;确保当这些状态变量的值发生变化时&#xff0c;页面会重新渲染。 const [something,setSomething] useState(initialState); useState 返回一个由两个值组成的数组&#xff1a;1、当前的 state&#xff0c;在首次…

【leetcode】两数相加【中等】(C++递归解法)

总体来说&#xff0c;链表类问题往往是蛮适合用递归的方式求解的 要写出有效的递归&#xff0c;关键是要考虑清楚&#xff1a; 0. return的条件 1. 每步递归的操作&#xff0c;以及何时调用下一步递归 2. 鲁棒性&#xff08;头&#xff0c;尾结点等特殊情况是否依旧成立&am…

Windows 中配置 Python 3.11 环境安装教程

Python 是一门强大且广泛应用的编程语言。最新的 Python 3.11 提供了更多的功能和优化&#xff0c;本文将详细介绍如何在 Windows 中配置 Python 3.11 环境&#xff0c;并通过具体案例帮助您快速上手。 一、下载并安装 Python 3.11 1. 下载 Python 3.11 安装包 前往 Python …

Golang学习笔记20240725,Go语言基础语法

第一个Go程序 package mainimport "fmt"func main() {fmt.Println("hello world") }运行方式1&#xff1a; go run main.go运行方式2&#xff1a; go build .\hello_go.exe运行方式3&#xff1a;goland右键运行 字符串拼接 使用加号可以对字符串进行…

Codeforces Round 874 (Div. 3)(A~D题)

A. Musical Puzzle 思路: 用最少的长度为2的字符串按一定规则拼出s。规则是&#xff1a;前一个字符串的尾与后一个字符串的首相同。统计s中长度为2的不同字符串数量。 代码: #include<bits/stdc.h> #include <unordered_map> using namespace std; #define N 20…

【python】PyQt5中QPushButton的用法详细解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

混淆后的代码报错如何定位问题

混淆后的代码报错定位问题可以通过以下步骤进行&#xff0c;主要依赖于ProGuard&#xff08;或R8&#xff09;生成的映射文件&#xff08;mapping file&#xff09;来将混淆后的代码还原成原始代码&#xff0c;以便调试和解决问题。 1. 启用混淆映射文件生成 确保在ProGuard配…

【全面介绍Python多线程】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🦇目录 1. 🦇前言2. 🦇threading 模块的基本用法3. 🦇Thre…