2021-08-18 哈工大自动每日上报(本部)
因为最近哈工大的每日上报界面有所改动,并且要求至少连续14天上报,就想着搞一个脚本,每天定时上报。以下内容皆为笔者亲自实践证明过的,若有不足错误之处,还望指正。
免责声明
一切责任由使用者自行承担。
感谢以下的两篇文章,为我提供了最主要的代码来源:
写在前面
实现的功能:
- edge会自动登录统一身份认证,并且会点开“每日上报”,点击“获取地理位置”,点击“我已认真阅读”,并且自动提交。提交之后的页面会自动截图,保存在当前代码的.py文件同一位置下的image文件夹里面。如下所示:图中笔者把这个代码命名为DailtReport.py
并且会将截图以邮件的形式发送给接收者邮箱(代码当中的receiver变量)当中
2.电脑每日定点执行这个代码,具体操作见“五 每日定点执行代码”
一:配置完整的python运行环境
笔者在此之前就已经在vscode配置好了完整的python环境,如果之前完全没有配置过的,可参考:
python安装与vscode环境配置
vscode当中好用的python插件,可参考:装上这 10个vscode插件,python才真的是无敌的存在!
二:下载浏览器驱动
注:chrome driver同理可下载,具体教程可参考:chromedriver下载与安装方法
在这里只叙述edge driver的下载配置。
首先查询电脑上的edge的版本
笔者的版本如上所示,然后进入下方的官网
edge driver官网:edge driver官网
找到自己的版本点击下载,笔者下载的版本如下图红框中的x64
下载之后保存到edge同一安装路径下。
三:下载selenium库
win+r输入cmd打开终端,或者打开文件管理器在空白处shift+鼠标右键打开powershell均可。输入:
pip install selenium
如果安装成功,输入:
pip show selenium
即可看到相关信息
四:关于代码
注意:
1.在运行之前需要改动的部分在注释当中标出,望注意!
2.关于邮箱密码password_email:
qq邮箱-设置:
点击“账户”:
下拉至如下图所示,点击IMAP/SMTP处的“开启”(因为笔者之前点过了,所以图中是关闭):
之后按照弹窗提示发送信息,即可开启:
之后就会生成验证码填入password_email即可。
代码如下
from selenium import webdriver
import time
import smtplib
from selenium.webdriver.common.keys import Keys
from pathlib import Path
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.header import Header
# 需要改动的部分如下-----------------------------
stu_number = ['1190200001'] # 学号(用来统一身份认证登录)
stu_password = ['xxxxxx'] # 密码(用来统一身份认证登录)
stu_name = 'xxxxxx' # 保存的截图名称会用到,不必须
sender = 'xxxxx7@qq.com' # 发送者邮箱
receiver = 'xxxx@qq.com' # 接受者邮箱
password_email = 'xxxxxx' # 邮箱密码见“四 关于代码”注意部分所述
# 输入webdriver放置的路径
driver_url = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedgedriver.exe"
driver = webdriver.Edge(executable_path=driver_url)
# 需要改动的部分如上-----------------------------
# 访问网址
url_login = "https://ids.hit.edu.cn/authserver/login?service=https%3A%2F%2Fxg.hit.edu.cn%2Fzhxy-xgzs%2Fcommon%2FcasLogin%3Fparams%3DL3hnX21vYmlsZS94c0hvbWU%3D"
driver.get(url_login)
# 最大化窗口
driver.maximize_window()
# 学号定位
username = driver.find_element_by_id('username')
# 输入学号
for i in range(len(stu_number)):
username.send_keys(stu_number[i])
# 点击记住密码
driver.find_element_by_class_name('icheckbox_square-green').click()
# 密码定位
password = driver.find_element_by_id('password')
# 输入密码
for i in range(len(stu_password)):
password.send_keys(stu_password[i])
password.send_keys(Keys.ENTER) # 密码输入完毕,键入enter表示确认
time.sleep(1)
# 点击每日上报
dailyReport = driver.find_element_by_partial_link_text('每日上报').click()
time.sleep(1)
# 点击获取地理位置
driver.find_element_by_id('dtjwd').click()
time.sleep(3)
# 我已仔细阅读并同意
driver.find_element_by_xpath('//*[@id="mrsb"]/div[63]/label').click()
time.sleep(1)
# 点击提交
driver.find_element_by_xpath(
"//div[@class = 'report_bottom']/span[text()='提交信息']").click()
# 截图存放在当前py文件所处位置下的image文件夹下面
fileName = u'.\\image'
# 获取当前时间
current_time = time.strftime(stu_name + "-20%y-%m-%d-%H-%M-%S",
time.localtime(time.time()))
# 截图名称
picture_location = fileName + '\\' + current_time + '.png'
# 如果image文件夹存在不做处理,否则新建image文件夹
if Path(fileName).is_dir():
pass
else:
Path(fileName).mkdir()
# 浏览器截图拍照,并且保存为事先设置好的png
driver.save_screenshot(picture_location)
# 关闭浏览器
driver.quit()
# 邮件服务器
# mixed -- 混合型 alternative--文本混合 related--多媒体元素
message = MIMEMultipart('related')
# 邮件头信息
message['From'] = Header(sender)
message['To'] = Header(receiver)
message['Subject'] = Header('今日每日上报截图', 'utf-8')
# 开启发信服务,这里使用的是加密传输
# 正文-图片 通过html格式来放图片,可通过cid 编号实现上传多个图片
email_body = '''
<p>今日疫情已经上报,无需回复</p>
<p>\n\t上报截图如下:</p>
<p><img src='cid:image1'></p>
'''
message.attach(MIMEText(email_body, 'html', 'utf-8'))
# 获取图片
file = open(picture_location, 'rb')
img = MIMEImage(file.read())
file.close()
img.add_header('Content-ID', '<image1>')
# 添加图片
message.attach(img)
# 选择用qq SMTP/IMAP发送
smtp_server = 'smtp.qq.com'
server = smtplib.SMTP_SSL(smtp_server)
# 465为SMTP端口号(绝大多数)
server.connect(smtp_server, 465)
# 用验证码登录qq邮箱
server.login(sender, password_email)
# 发送邮件
server.sendmail(sender, receiver, message.as_string())
# 关闭服务器
server.quit()
五:每日定点执行代码
1.把.py打包成.exe
win+r输入cmd打开终端,或者打开文件管理器在空白处shift+鼠标右键打开powershell均可
输入:
pip3 install pyinstaller
待安装成功之后,即可输入:(笔者把这个代码存为DailyReport.py)
pyinstaller -F DailyReport.py
完成之后,.exe就会在同一路径下的dist文件夹当中:
之后:
2. 此电脑-右键:管理-任务计划程序-任务计划程序库(左键单击选中)
3.在右侧单击创建任务
接下来配置成如图所示:
注意填写自己看得懂的名称,自由发挥即可。
4.在触发器-新建菜单下创建新任务,任务的高级设置中可以设定重复次数
每日开始的时间自由发挥
4.在操作一栏新建,选择程序所在的路径
注意这里应该选择的是.exe路径
5.最后“条件”和“设置”建议修改成如下所示: