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('}') + 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()

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

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值