1. 数据库设计
- 使用MySQL数据库,数据库名student_info,表名user
- 表中共username,password,email,name四列,其中email默认为个人邮箱
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
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):
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(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)
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()
sql = "select * from user"
cursor.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 = 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))