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…

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() &&…

服务器数据恢复—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文件内容改成…

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

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

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;…

【全面介绍Python多线程】

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

Unity中有关Animation的一点笔记

也许更好的阅读体验 Animation Unity中Animation类并不是直接记载了和播放动画有关的信息&#xff0c;可以简单理解Animation为一个动画播放器&#xff0c;播放的具体内容就像卡带一样&#xff0c;当我们有了卡带后我们可以播放动画。 对应的则是编辑器中的组件 所以Anima…

【学术会议征稿】第十一届电气工程与自动化国际会议 (IFEEA 2024)

第十一届电气工程与自动化国际会议 &#xff08;IFEEA 2024&#xff09; 2024 11th International Forum on Electrical Engineering and Automation IFEEA论坛属一年一度的国际学术盛会。因其影响力及重要性&#xff0c;IFEEA论坛自创建筹办以来&#xff0c;便受到国内外高等…

网站打包封装成app,提高用户体验和商业价值

网站打包封装成app的优势 随着移动互联网的普及&#xff0c;用户对移动应用的需求越来越高。网站打包封装成app可以满足用户的需求&#xff0c;提高用户体验和商业价值。 我的朋友是一名电商平台的运营负责人&#xff0c;他曾经告诉我&#xff0c;他们的网站流量主要来自移动…

由bext安装“异常”引出的话题:windows上转义字符的工作原理

由bext安装“异常”引出的话题&#xff1a;Windows上转义字符的工作原理&#xff0c;与ai“闲扯”不经意学习知识点。 (笔记模板由python脚本于2024年07月25日 19:21:13创建&#xff0c;本篇笔记适合喜欢用ai学习的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff…

GitLab添加TortoiseGIT生成SSH Key

文章目录 前言一、PuTTYgen二、GitLab 前言 GitLab是一个用于托管代码仓库和项目管理的Web平台&#xff0c;公司搭建自己的gitlab来管理代码&#xff0c;我们在clone代码的时候可以选择http协议&#xff0c;也可以选择ssh协议来拉取代码。 SSH (Secure Shell)是一种通过网络进…

【脚本】清空指定文件夹内容

main执行一次&#xff0c;1.txt就会写入一些东西。 原来的想法是覆盖重写&#xff0c;结果却是接着往后面写&#xff0c;检查源代码有点费事&#xff0c;不如在每次程序执行前&#xff0c;先直接清空文件夹&#xff01; 部分代码&#xff1a; 修改路径就能用。 import os im…