目录
一、需求描述
二、解析
三、实例代码
一、需求描述
监听自考网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)授权的一般步骤:
- 登录网易邮箱网页版,例如 163 邮箱可登录https://mail.163.com/
- 点击上方的“设置”选项。
- 在设置列表中,选择“POP3/SMTP/IMAP”。
- 在客户端协议界面,选择“SMTP”服务并点击“开启”(如果之前未绑定手机号,可能需要先在密保平台中完成手机号绑定)。
- 在新弹出的弹窗中,可以选择扫码发送短信,或者点击下方“手动发送短信”(如果发送 5 分钟后系统依旧提示未收到短信,请联系移动运营商核实短信发送情况)。
- 点击“我已发送”后,如果系统检测到用户成功发送短信,便会提示客户端授权码(自动生成一串 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()
生命不息,学习不止,若有不正确的地方,欢迎指正。