起因是在阮行止大佬的博客看到一篇文章: https://ruanx.net/selenium/
但是Python和Selenium我都不会啊,而且哈工大和忽忽悠的系统差别较大。
于是发挥优良传统: 抄代码! 在CSDN上找到一篇文章:
https://blog.csdn.net/wjl_zyl_1314/article/details/107036245
这篇文章也是代码的主要来源。
开搞之前
自动打卡需要几步? > + 自动登录 > + 自动填写信息 > + 自动提交
> + 信息反馈
自动登录
正常情况下我们看到的打卡界面链接是这样的:
http://form.hhu.edu.cn/pdc/form/list
在InPrivate窗口中打开就见到了真面目:
http://ids.hhu.edu.cn/amserver/UI/Login?goto=http://form.hhu.edu.cn/pdc/form/list
之所以不从信息门户开始纯粹是因为懒(又多了好几步跳转)
接下来就是自动填写用户信息了, 把元素id替换一下就好了。
自动填写信息
忽忽悠的健康打卡页面在缺省时用的是上次填写的信息,
所以就没有写这部分。
自动提交
同理, 重点在确定元素, 这里不得不吐槽提交按钮的阴间设计, id, name,
class, Xpath试了一圈都不起作用, 最后用class_name成功定位。
信息反馈
照抄代码没什么好讲的。
吐槽
忽忽悠的服务器最近一直抽风, 预设的时间不一定够网页加载完,
结果就是连续三天看不到熟悉的邮件, 这也是用了一个月又更新的原因。
原来的方法是直接暴力设置几秒的延迟, 结果这几天服务器抽风,
设置的延迟不够。
百度之后学到了新的方法, 设置了最大半个小时的等待时长, 详见这篇文章:
https://www.cnblogs.com/Lixinhang/p/10875147.html
~~半个小时你能卡我, 你能卡死我? 你今天要是半个小时都不让我打卡,
我骚钾肥当场, 把这个电脑屏幕吃掉! ~~
完整代码
这里对敏感信息做了模糊处理, 请根据实际情况自行替换。
点我查看完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import Byimport timedriver = webdriver.Firefox() url = 'http://ids.hhu.edu.cn/amserver/UI/Login?goto=http://form.hhu.edu.cn:80/pdc/form/list' driver.get(url) driver.maximize_window() username = driver.find_element_by_id('IDToken1' ) stu_number = '***' username.send_keys(stu_number) stu_password = '***' password = driver.find_element_by_id('IDToken2' ) password.send_keys(stu_password) sign_inBtn = WebDriverWait(driver, 1800 ).until(EC.presence_of_element_located((By.XPATH, "//*[contains(@onclick, 'defaultSubmit()')]" ))) sign_inBtn.click() goto = WebDriverWait(driver, 1800 ).until(EC.presence_of_element_located((By.CLASS_NAME, "datav-flex-box" ))) goto.click() submit = WebDriverWait(driver, 1800 ).until(EC.presence_of_element_located((By.ID, "saveBtn" ))) submit.click() time.sleep(5 ) driver.close() import smtplibfrom email.mime.text import MIMETextfrom email.header import Headerfrom_addr = '@qq.com' password = '***' to_addr = '@qq.com' smtp_server = 'smtp.qq.com' msg = MIMEText('今日疫情填报已完成' , 'plain' , 'utf-8' ) msg['From' ] = Header(from_addr) msg['To' ] = Header(to_addr) msg['Subject' ] = Header('每日疫情填报情况' ) server = smtplib.SMTP_SSL(smtp_server) server.connect(smtp_server, 465 ) server.login(from_addr, password) server.sendmail(from_addr, to_addr, msg.as_string()) server.quit()