基于Selenium的疫情防控-自动打卡签到脚本(优化)

1. 数据库设计

  • 使用MySQL数据库,数据库名student_info,表名user
  • 表中共username,password,email,name四列,其中email默认为个人邮箱
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `username` int(0) NOT NULL,
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '',
  `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '[email protected]',
  PRIMARY KEY (`username`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

2. 导入各个模块

  • 工具说明:使用 Python + Selenium + yagmail+ pymysql + ChromeDriver
    实现自动登陆疫情打卡页面并签到
import datetime
import yagmail
import pymysql
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait

3. url + XPath + nowTime

url = "http://jxgl.cuit.edu.cn/jkdk"
NewTask_XPath = "/html/body/div[2]/table/tbody[2]/tr[2]/td[2]/a"
Address_XPath = "//*[@id='wjTA']/tbody/tr[6]/td[2]/div/select[2]"
Work_XPath = "//*[@id='wjTA']/tbody/tr[6]/td[2]/div/select[3]"
Health_XPath = "//*[@id='wjTA']/tbody/tr[6]/td[2]/div/select[4]"
Life_XPath = "//*[@id='wjTA']/tbody/tr[6]/td[2]/div/select[5]"
Family_XPath = "//*[@id='wjTA']/tbody/tr[6]/td[2]/div/select[6]"
Submit_XPath = "/html/body/form/div[1]/table/tbody/tr/td[1]/input"
nowTime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

4. 发送提示邮件

def do_sendMail(MailBox, content):
    yag = yagmail.SMTP("[email protected]", "GVVEZOBIJCRVNQWO", 'smtp.126.com')
    yag.send(MailBox, "打卡提醒", content)

5. 模拟登录

def do_login(userName, password):
    # driver.maximize_window() 将窗口最大化
    # 找到登录框 输入账号密码
    WebDriverWait(driver, 10, 0.2)
    driver.find_element_by_id('txtId').send_keys(userName)
    driver.find_element_by_id('txtMM').send_keys(password)
    # 模拟点击登录
    driver.find_element_by_id('IbtnEnter').click()
    WebDriverWait(driver, 10, 0.2)

6. 模拟打卡

def do_sign():
    driver.find_element_by_xpath(NewTask_XPath).click()  # 打开最新打卡任务
    WebDriverWait(driver, 10, 0.2)
    # 定位select框 进行选择
    Select(driver.find_element_by_xpath(Address_XPath)).select_by_index(1)
    Select(driver.find_element_by_xpath(Work_XPath)).select_by_index(4)
    Select(driver.find_element_by_xpath(Health_XPath)).select_by_index(1)
    Select(driver.find_element_by_xpath(Life_XPath)).select_by_index(1)
    Select(driver.find_element_by_xpath(Family_XPath)).select_by_index(1)
    # 提交打卡 处理Alert弹出框
    driver.find_element_by_xpath(Submit_XPath).click()
    driver.switch_to.alert.accept()

7. if name == ‘main’:

try:
    db = pymysql.connect(host='', user='root', password='', database='student_info')  # 打开数据库连接
    cursor = db.cursor()  # 使用cursor方法获取操作游标
    sql = "select * from user"  # sql查询语句
    cursor.execute(sql)  # 使用 execute 方法执行SQL语句
    results = cursor.fetchall()
    db.close()  # 关闭连接; 关闭后无法再进行操作,除非再次创建连接
except Exception as e:
    do_sendMail("{}\n数据库查询失败,任务终止\n错误信息: {}".format(nowTime, e))
for row in results:
	print(row[3], end="-->")
    try:
        # 模拟浏览器打开网站 因为在同一浏览器窗口无法进行退出操作
        # 重新driver.get(url)也不行 所以暂时只能循环重启Chrome了
        driver = webdriver.Chrome()
        driver.get(url)
        WebDriverWait(driver, 10, 0.2)
        # 打卡并发送邮件
        do_login(row[0], row[1])
        do_sign()
        do_sendMail(row[2], "{}\n{}打卡成功".format(nowTime, row[3]))
        driver.quit()
        print("{}打卡成功".format(row[3]))
    except Exception as e:
    	driver.quit()
        do_sendMail(row[2], "{}\n{}打卡失败,任务终止\n错误信息: {}".format(nowTime, row[3], e))

你可能感兴趣的:(Python)