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