纪念健康打卡
疫情管控放开了,学校也终于取消健康打卡了,之前写的自动化健康打卡也用不到了,记录一下这个健康打卡引用中遇到的两个新问题
这里的代码是用selenium实现的,因为懒,不想再分析请求了
第一个问题:如何发送邮件
from email.mime.text import MIMEText #纯文本,HTML
from email.mime.image import MIMEImage #图片
from email.mime.multipart import MIMEMultipart #多种组合内容
# smtplib 用于邮件的发信动作
import smtplib
# email 用于构建邮件内容
from email.mime.text import MIMEText
# 构建邮件头
from email.header import Header
def sendMail(status):
# 发信方的信息:发信邮箱,QQ 邮箱授权码
# 发送方邮箱
from_addr = 'xxxxx@qq.com'
# 发送方的QQ邮箱授权码
password = 'asdfghjkl'
# 收信方邮箱
to_addr = 'yyyyyy@qq.com'
# 发信服务器
# QQ那边设置
smtp_server = 'smtp.qq.com'
# 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
msg = MIMEText('恭喜你今天的打卡完成啦!', 'plain', 'utf-8')
# 邮件头信息
msg['From'] = Header('打卡小助手') # 发送者
msg['To'] = Header('洛七') # 接收者
subject = '【健康打卡】'+status
msg['Subject'] = Header(subject, 'utf-8') # 邮件主题
try:
smtpobj = smtplib.SMTP_SSL(smtp_server)
# 建立连接--qq邮箱服务和端口号(可百度查询)
smtpobj.connect(smtp_server, 465)
# 登录--发送者账号和口令
smtpobj.login(from_addr, password)
# 发送邮件
smtpobj.sendmail(from_addr, to_addr, msg.as_string())
print("邮件发送成功")
except smtplib.SMTPException:
print()
print("无法发送邮件")
finally:
# 关闭服务器
smtpobj.quit()
这里会发现需要有一个QQ来发送,一个QQ来接收
(但是我没试过可不可以发送和接收是同一个QQ,也不一定要QQ邮箱,其他应该都可以)
QQ授权码和QQ密码不一样
第二个问题:需要点击的按钮在div中,需要拉动滚动条,selenium没有办法点击要怎么办?
# 找到指定的元素
# (我是在控制台试了好多次才找到的指定元素)
# 创建js语句,使用scrollTop去移动页面,这里因为是最下面,所以直接拉满了
# 执行js语句
# 移动页面!
js_dowmpage = 'document.querySelector(".preview-container > div > div > div.preview-page > #pdfDomContent").scrollTop = 10000 '
browser.execute_script(js_dowmpage)
完整代码如下:
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
from email.mime.text import MIMEText #纯文本,HTML
from email.mime.image import MIMEImage #图片
from email.mime.multipart import MIMEMultipart #多种组合内容
# smtplib 用于邮件的发信动作
import smtplib
# email 用于构建邮件内容
from email.mime.text import MIMEText
# 构建邮件头
from email.header import Header
import datetime
def sendMail(status):
# 发信方的信息:发信邮箱,QQ 邮箱授权码
from_addr = 'xxxxx@qq.com'
password = 'asdfghjkl'
# 收信方邮箱
to_addr = 'yyyyy@qq.com'
# 发信服务器
smtp_server = 'smtp.qq.com'
# 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
msg = MIMEText('恭喜你今天的打卡完成啦!', 'plain', 'utf-8')
# 邮件头信息
msg['From'] = Header('打卡小助手') # 发送者
msg['To'] = Header('洛七') # 接收者
subject = '【健康打卡】'+status
msg['Subject'] = Header(subject, 'utf-8') # 邮件主题
try:
smtpobj = smtplib.SMTP_SSL(smtp_server)
# 建立连接--qq邮箱服务和端口号(可百度查询)
smtpobj.connect(smtp_server, 465)
# 登录--发送者账号和口令
smtpobj.login(from_addr, password)
# 发送邮件
smtpobj.sendmail(from_addr, to_addr, msg.as_string())
print("邮件发送成功")
except smtplib.SMTPException:
print()
print("无法发送邮件")
finally:
# 关闭服务器
smtpobj.quit()
def check(username,password):
browser = webdriver.Firefox(executable_path =r"D:\geckodriver")
url = "https://xmuxg.xmu.edu.cn/app/214"
browser.maximize_window()
browser.get(url=url)
time.sleep(5)
btns = browser.find_elements_by_css_selector(" div.loginTab > div.buttonBox > button")
btns[2].click()
# username
browser.find_element_by_css_selector("input#username").send_keys(username)
# password
browser.find_element_by_css_selector("input#password").send_keys(password)
# 登录
time.sleep(1)
browser.find_element_by_css_selector("button.auth_login_btn[type='submit']").click()
time.sleep(3)
browser.get(url=url)
time.sleep(3)
browser.find_element_by_css_selector("div.tab[title='我的表单']").click()
time.sleep(3)
# 移动页面!
js_dowmpage = 'document.querySelector(".preview-container > div > div > div.preview-page > #pdfDomContent").scrollTop = 10000 '
browser.execute_script(js_dowmpage)
time.sleep(2)
selectedOption = browser.find_elements_by_css_selector(".v-select.btn-block.info-value.btn-group")[-2]
selectedOption.click()
time.sleep(3)
yes = browser.find_element_by_css_selector(".gm-scroll-view > li.dropdown-items")
time.sleep(2)
yes.click()
# 保存
savebtn = browser.find_element_by_css_selector(".form-save.position-absolute")
savebtn.click()
time.sleep(2)
# 确定保存
browser.switch_to.alert.accept()
time.sleep(2)
browser.refresh()
time.sleep(3)
browser.find_element_by_css_selector("div.tab[title='我的表单']").click()
time.sleep(3)
# 获取现在保存时间
timeI = browser.find_elements_by_css_selector("div.v-datepicker > .form-control > .btn-content")[-1]
print(timeI.text)
modify = timeI.text.split(" ")[0]
# 获取今天时间
today = time.strftime('%Y-%m-%d',time.localtime(time.time()))
if modify == today:
print("今日签到成功")
sendMail("签到成功")
browser.quit()
else:
print("签到失败")
time.sleep(10)
users = {
"学号":"统一认证密码"
}
while True:
print(time.strftime("%H:%M",time.localtime()))
if time.strftime("%H:%M",time.localtime()) == "09:05":
usernames = list(users.keys())
for username in usernames:
try:
check(username,users[username])
except:
sendMail("签到失败")
print("签到失败")
time.sleep(30)
else:
time.sleep(30)
最后就是挂在实验室电脑上,每天自动启动