本程序demo针对校际凡科平台编写
日志输出模块:
logger = logging.getLogger("myLogger")
logger.setLevel(logging.INFO)
filer_handler = logging.FileHandler("program_log.txt", encoding="utf-8", mode="a")
formatter = logging.Formatter("%(asctime)s - %(name)s-%(levelname)s %(message)s")
console_handler = logging.StreamHandler()
filer_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
logger.addHandler(filer_handler)
logger.addHandler(console_handler)
请求网页:
def get_html_review(url: str) -> (int, bytes):
# 定义请求的头部信息
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'cookie': '【更改为你的Cookie】',
'priority': 'u=0, i',
'sec-ch-ua': '"Chromium";v="124", "Microsoft Edge";v="124", "Not-A.Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'
}
session = requests.session()
session.trust_env = False
# 发送请求
response = session.get(url, headers=headers)
stat_code = response.status_code
if response.text.find('/login') != -1:
stat_code = 203
return stat_code, response.content
发送邮件:
def send_email(data: str):
# 设置发件人邮箱信息
sender_email = "【更改为你的邮箱】" # 例如: 8888888@qq.com
sender_password = "【更改为你的smtp密码】" # zxcvnmdfjdklfjdlsfd
port = "587"
server_address = "smtp.qq.com"
# 设置收件人邮箱信息
receiver_email = "【通知接收的邮箱】" # 例如: 8888889@qq.com
# now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
# 创建邮件对象
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = receiver_email
msg['Subject'] = f"[稿件最新消息]"
# 添加邮件内容
body = MIMEText(data, 'plain')
msg.attach(body)
# 发送邮件
with smtplib.SMTP(server_address, port) as smtp:
smtp.ehlo()
smtp.starttls()
smtp.login(sender_email, sender_password)
smtp.send_message(msg)
print('发送成功!')
解析Html:
def xpath_html(resp_text: bytes):
html_tree = etree.HTML(resp_text)
expert0 = '//*[@id="div_expert_0"]/div/a/text()'
expert1 = '//*[@id="div_expert_1"]/div/a/text()'
try:
e1_ = html_tree.xpath(expert0)[0]
except Exception as ex:
e1_ = "expert0有最新的审稿结果"
print(resp_text)
try:
e2_ = html_tree.xpath(expert1)[0]
except Exception as ex:
e2_ = "expert1有最新的审稿结果"
return e1_, e2_
完整代码:
import time
import requests
from lxml import etree
import schedule
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import logging
e1 = "专家一未评阅完毕"
e2 = "专家二未评阅完毕"
logger = logging.getLogger("myLogger")
logger.setLevel(logging.INFO)
filer_handler = logging.FileHandler("program_log.txt", encoding="utf-8", mode="a")
formatter = logging.Formatter("%(asctime)s - %(name)s-%(levelname)s %(message)s")
console_handler = logging.StreamHandler()
filer_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
logger.addHandler(filer_handler)
logger.addHandler(console_handler)
def get_html_review(url: str) -> (int, bytes):
# 定义请求的头部信息
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'cookie': '【更改为你的Cookie】',
'priority': 'u=0, i',
'sec-ch-ua': '"Chromium";v="124", "Microsoft Edge";v="124", "Not-A.Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'
}
session = requests.session()
session.trust_env = False
# 发送请求
response = session.get(url, headers=headers)
stat_code = response.status_code
if response.text.find('/login') != -1:
stat_code = 203
return stat_code, response.content
def xpath_html(resp_text: bytes):
html_tree = etree.HTML(resp_text)
expert0 = '//*[@id="div_expert_0"]/div/a/text()'
expert1 = '//*[@id="div_expert_1"]/div/a/text()'
try:
e1_ = html_tree.xpath(expert0)[0]
except Exception as ex:
e1_ = "expert0有最新的审稿结果"
print(resp_text)
try:
e2_ = html_tree.xpath(expert1)[0]
except Exception as ex:
e2_ = "expert1有最新的审稿结果"
return e1_, e2_
def send_email(data: str):
# 设置发件人邮箱信息
sender_email = "【更改为你的邮箱】" # 例如: 8888888@qq.com
sender_password = "【更改为你的smtp密码】" # zxcvnmdfjdklfjdlsfd
port = "587"
server_address = "smtp.qq.com"
# 设置收件人邮箱信息
receiver_email = "【通知接收的邮箱】" # 例如: 8888889@qq.com
# now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
# 创建邮件对象
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = receiver_email
msg['Subject'] = f"[稿件最新消息]"
# 添加邮件内容
body = MIMEText(data, 'plain')
msg.attach(body)
# 发送邮件
with smtplib.SMTP(server_address, port) as smtp:
smtp.ehlo()
smtp.starttls()
smtp.login(sender_email, sender_password)
smtp.send_message(msg)
print('发送成功!')
def main(school_code: int=11845):
global e1, e2
url = f'https://{school_code}.lwglxt.com/student/viewdoc_right?docid=39424&showdoc=2'
stat_code, html_content = get_html_review(url=url)
logger.info(f"请求成功,状态码: {stat_code}")
if stat_code == 200:
# 打印响应内容
e1_, e2_ = xpath_html(html_content)
if e1_ != e1:
logger.info("您有最新的审稿结果来自【专家一】")
e1 = e1_
send_email(e1)
elif e2_ != e2:
logger.info("您有最新的审稿结果来自【专家二】")
e2 = e2_
send_email(e2)
else:
logger.info("暂无审稿结果更新")
result = e1 + "," + e2
logger.info(result)
# send_email(result)
elif stat_code == 203:
un_login_info = "登录失效,需要重新登录获取Cookie"
logger.info(un_login_info)
send_email(un_login_info)
else:
logger.error('请求异常')
logger.info("========================================")
if __name__ == '__main__':
# sch_code = int(input('请输入学校代码:'))
sch_code = 11845
# main(school_code=sch_code)
logger.info("======[通知程序启动]======")
# 20分钟更新一次
schedule.every(20).minutes.do(main, sch_code)
while True:
schedule.run_pending()
time.sleep(1)