疫情管控放开了,学校也终于取消健康打卡了,之前写的自动化健康打卡也用不到了,记录一下这个健康打卡引用中遇到的两个新问题

这里的代码是用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)

最后就是挂在实验室电脑上,每天自动启动