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

news2024/9/24 5:28:40

目录

一、需求描述

二、解析

三、实例代码


一、需求描述

监听自考网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('}') + 1
    json_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 MIMEText

def send_email(subject, content):
    # 网易邮箱的服务器配置
    smtp_server ='smtp.163.com'
    port = 25
    sender_email = 'sender_email@163.com'
    #这里密码要用开通SMTP服务提供的授权密码
    sender_password = 'password'
    
    recivce_email = 'recivce_email@qq.com'
    
    # 构建邮件内容
    message = MIMEText(content)
    message['Subject'] = subject
    message['From'] = sender_email
    message['To'] = recivce_email

    try:
        # 连接服务器并发送邮件
        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 MIMEText

def 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('}') + 1
    json_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 = 25
    sender_email = 'sender_email.com'
    #这里密码要用开通SMTP服务提供的授权密码
    sender_password = '授权密码'
    
    recivce_email = 'recivce_email@qq.com'
    
    # 构建邮件内容
    message = MIMEText(content)
    message['Subject'] = subject
    message['From'] = sender_email
    message['To'] = recivce_email

    try:
        # 连接服务器并发送邮件
        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.coloradmin.cn/o/1950256.html

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

相关文章

如何选择财税RPA解决方案

随着大数据、物联网、人工智能以及RPA等新兴技术的迅猛发展,每个企业都面临着巨大的行业和技术挑战。财务作为企业运营管理的核心,其数字化转型成为众多企业提升管理效能和实现高质量发展的先行路径。随着RPA技术应用在财务领域的不断深入,越…

WireShark 更改界面主题

背景 Windows 是黑色主题 安装 WireShark 后&#xff0c;WireShark 界面也是黑色主题 预期 想要将 WireShark 界面更改为白色主题 操作 启动 wireshark 时添加 -platform windows:darkmode0 参数 <Wireshark.exe 路径> -platform windows:darkmode0 例&#xff1a;…

基于PSO粒子群优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 粒子群优化算法&#xff08;PSO&#xff09; 4.2 分组卷积神经网络&#xff08;GroupCNN&#xff09; 4.3 PSO优化GroupCNN 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行…

数据结构篇4—递归实现二叉树基础结构

文章目录 前言&#x1f6a9;1、树&#xff1f;2、树的相关概念3、树的结构表示4、二叉树&#x1f680;、概念和结构&#x1f381;、特殊二叉树 5、二叉树常用性质6、二叉树的存储结构&#x1f9e9;、顺序存储结构&#x1f3a8;、链式存储结构 7、二叉树顺序结构的实现----堆8、…

前端开发知识(三)-javascript(对象)

一、JS对象 包括JS已经定义的对象&#xff0c;如&#xff0c;Array,Sting &#xff0c;DOM&#xff0c;BOM等&#xff0c;其中&#xff0c;JSON是用户自定义对象&#xff08;除对象外&#xff0c;还有文本&#xff09;&#xff0c;其他是JS定义 1.Array&#xff1a;数组 数…

React最新版本 18

截至当前时间&#xff08;2024年07月24日&#xff09;&#xff0c;React 的最新版本是 18.2.0。这个版本在 2022 年 3 月 29 日由 React 团队正式发布&#xff0c;主要着眼于解决 React 应用在性能、稳定性、开发体验等方面的问题。 React 18 是 React 的一个重要版本&#xf…

算法导论 总结索引 | 第五部分 第二十章:van Emde Boas树

1、一些支持优先队列操作的 数据结构,如第6章的二叉堆、第13章的红黑树 和 第19章的斐波那契堆。在这几种数据结构中, 不论是最好情况 还是 摊还情况, 至少有一项重要操作 只需要 O(n lgn) 时间 由于这些数据结构 都是基于关键字比较 决定的&#xff0c;因此, 8.1节中的下界 Ω…

【网络流】——初识(最大流)

网络流-最大流 基础信息引入一些概念基本性质 最大流定义 Ford–Fulkerson 增广Edmons−Karp算法Dinic 算法参考文献 基础信息 引入 假定现在有一个无限放水的自来水厂和一个无限收水的小区&#xff0c;他们之间有多条水管和一些节点构成。 每一条水管有三个属性&#xff1a…

sql_exporter通过sql收集业务数据并通过prometheus+grafana展示

下载并解压安装sql_exporter wget https://github.com/free/sql_exporter/releases/download/0.5/sql_exporter-0.5.linux-amd64.tar.gz #解压 tar xvf sql_exporter-0.5.linux-amd64.tar.gz -C /usr/local/修改主配置文件 cd /usr/local/ mv sql_exporter-0.5.linux-amd64 s…

海山数据库(He3DB)技术解析:海山Redis定时任务与持久化管控设计

文章目录 引言一、背景介绍二、具体实现1、多副本容灾功能2、主备切换后任务断点续做功能3、持久化管控编排功能 三、总结作者 引言 云Redis数据库服务是目前广泛应用的模式&#xff0c;其数据持久化方案是现在研究的热点内容&#xff0c;数据持久化操作主要由参数设置自动触发…

AI学习记录 - 激活函数的作用

试验&#xff0c;通过在线性公式加入激活函数&#xff0c;可以拟合复杂的情况&#xff08;使用js实现&#xff09; 结论:1、线性函数的叠加&#xff0c;无论叠加多少次&#xff0c;都是线性的 如下图 示例代码 线性代码&#xff0c;使用ykxb的方式&#xff0c;叠加10个函数…

AnimationCurve动画曲线 简单使用

资料 AnimationCurve AnimationCurve 表示一条曲线。可在曲线上添加关键帧&#xff0c;编辑曲线。 水平轴表示时间&#xff0c;竖直轴表示曲线的高度 获取曲线高度方法&#xff0c;AnimationCurve.Evaluate 示例 循环移动Cube,Cube沿着曲线移动 using UnityEngine; publ…

正则表达式与文本处理

目录 一、正则表达式 1、正则表达式定义 1.1正则表达式的概念及作用 1.2、正则表达式的工具 1.3、正则表达式的组成 2、基础正则表达式 3、扩展正则表达式 4、元字符操作 4.1、查找特定字符 4.2、利用中括号“[]”来查找集合字符 4.3、查找行首“^”与行尾字符“$”…

火山引擎边缘智能平台,让AI走进企业现场

如何让大模型更好地与生产进行融合&#xff0c;让AI生产力为企业降本增效&#xff0c;是每个企业都在关注的问题。但设备异构、隐私安全、传输延迟等困难&#xff0c;让大模型走进企业现场变得步履维艰。这种情况&#xff0c;就需要借助边缘智能来应对这些挑战。 什么是边缘智能…

二维数组前缀和

二维数组前缀和&#xff08;Leetcode304&#xff09; 想法(参考题解)&#xff1a; 如上图&#xff0c;在矩阵中根据给定的方框围成的范围&#xff0c;确定范围内元素之和。题目&#xff1a;二维区域和检索 - 矩阵不可变。思路就是使用前缀和&#xff0c;前缀和表示的是面积&am…

Linux 安装 GDB (无Root 权限)

引入 在Linux系统中&#xff0c;如果你需要在集群或者远程操作没有root权限的机子&#xff0c;安装GDB&#xff08;GNU调试器&#xff09;可能会有些限制&#xff0c;因为通常安装新软件或更新系统文件需要管理员权限。下面我们介绍可以在没有root权限的情况下安装GDB&#xf…

微信小程序获取蓝牙并实现内容打印

通过微信小程序如何实现获取蓝牙打印机并实现打印能力&#xff0c;之前做过一个测试Dome&#xff0c;能够获取附近的蓝牙打印机设备并实现打印,今天开放出来供大家参考。 wxml <!--右下角搜索--> <view class"ly-cass-box"><view class"ly-cas…

【Python第三方库】PyQt5安装与应用

文章目录 引言安装PYQT5基于Pyqt5的简单桌面应用常用的方法与属性QtDesigner工具使用与集成窗口类型QWidget和QMainWindow区别 UI文件加载方式直接加载UI文件的方式显示窗口转化py文件进行显示窗口 PyQt5中常用的操作信号与槽的设置绑定页面跳转 引言 PyQt5是一个流行的Python…

Java——多线程(2/9):线程创建方式三Callable,Thread的常用方法(如何创建、代码实例、API及优缺点)

目录 方式三&#xff1a;实现Callable接口 前言 如何创建 代码实例 API及优缺点 Thread的常用方法 代码演示 方式三&#xff1a;实现Callable接口 前言 前两种线程创建方式都存在的一个问题 假如线程执行完毕后有一些数据需要返回&#xff0c;他们重写的run方法均不能…

算法与算法分析

目录 一.前言 二.算法的特性和要求 三.分析算法--时间效率 四. 分析算法--空间效率 一.前言 算法就是对特定问题求解方法和步骤的一种描述&#xff0c;它是指令的有限序列。其中&#xff0c;每个指令表示一个或多个操作。总而言之&#xff0c;我们数据结构就是通过算法实现操…