关于ZJ某理工大学python自动打卡

@TOC

!!!此文章仅供技术参考,疫情防控人人有责,请务必认真打卡!!!

此脚本基于Chromedriver(或者Firefox driver)以及selenium库

chrome driver安装方法

下载chromedriver
在下载chromedriver之前,我们先看一下我们的chrome浏览器的版本,一会下载对应的版本chromedriver;
在chrome浏览器点击设置,点击关于chrome,可以看到对应的版本:

关于Google Chrome
chrome版本

所有chromedriver均可在下面链接中下载到:

http://chromedriver.storage.googleapis.com/index.html
直接下载就可以,解压下来是exe文件,解压下来后,将这个exe文件放在你的python的安装目录下,然后配置环境变量,将路径加入到Path中去,这里不会可以自己搜索。
之后在命令行界面中通过chromedriver命令可查看ChromeDriver是否正常安装。若正常,则会出现如下类似输出:

1
2
3
4
Starting ChromeDriver 89.0.4389.23 (61b08ee2c50024bab004e48d2b1b083cdbdac579-refs/branch-heads/4389@{#294}) on port 9515
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.

Selenium安装方法

仅一句pip install selenium即可。

签到代码解析以及常见错误解析

由于Selenium就是直接运行浏览器在进行操作,所以不必伪装头文件了。

对浏览器进行初始化

1
2
3
4
5
6
7
8
#这里对浏览器进行设置,防止在后面find函数报错
WIDTH = 600 # 宽度
HEIGHT = 840 # 高度
PIXEL_RATIO = 3.0 # 分辨率

mobileEmulation = {"deviceMetrics": {"width": WIDTH, "height": HEIGHT, "pixelRatio": PIXEL_RATIO}}
options = webdriver.ChromeOptions()
options.add_experimental_option('mobileEmulation', mobileEmulation)

这里的宽度、高度、分辨率视情况而定。

模拟浏览器进行访问

1
2
3
# 模拟浏览器进行访问
browser = webdriver.Chrome(chrome_options=options)
browser.get("*********") #为所访问网址

进行签到

1
2
browser.find_element_by_xpath("//*[@placeholder='用户名']").send_keys(uid)
browser.find_element_by_xpath("//*[@placeholder='密码']").send_keys(pwd)

这里传入的是定义好的uid和pwd
其中的Xpath是你所在页面的所需要输入值的Xpath(因网站而异),获取方式如下:

Xpath获取方式
为了防止网站是懒加载,所以可以在页面跳转或者进入窗体等通过设置time.sleep(2)来阻塞两秒等待加载(有的学校可能服务器是土豆服务器需要加载时间长一些)

邮件通知

通过以下代码可以获取签到完后的反馈信息用于邮件通知或者报错通知用于修复bug。

1
success_text = browser.find_element_by_xpath("//*[@class='fh tac bw f16-0 pl2 b0']").text

通过以下代码可以发送邮件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def sendmail(subject, content):
email_user = '********' # 发送者账号
email_pwd = '***********' # 发送者密码
maillist ='*****************' # 接收者账号
me = email_user

msg = MIMEText(content, 'html', 'utf-8') # 邮件内容,三个参数:第一个为文本内容,第二个 html 设置文本格式,第三个 utf-8 设置编码
msg['Subject'] = subject # 邮件主题
msg['From'] = me # 发送者账号
msg['To'] = maillist # 接收者账号列表(列表没实现)

smtp = smtplib.SMTP("smtp.qq.com",587) # 如上变量定义的,是qq邮箱,注意这里必须使用587端口,AL云的话
smtp.login(email_user, email_pwd) # 发送者的邮箱账号,密码
smtp.sendmail(me, maillist, msg.as_string()) # 参数分别是发送者,接收者,第三个不知道
smtp.quit() # 发送完毕后退出smtp
print ('email send success.')

以上subject表示发送主题,content表示发送内容。

同时整体的结构使用try和except,其中发生错误时,可以用traceback来返回错误信息(这里感谢粟师傅的帮助)

1
2
3
4
5
6
7

try:
#这里为打卡代码
except:
print('签到失败')
sendmail('签到失败','签到失败\n'+traceback.format_exc())

SMTP服务需要在邮箱内开启,这个可以自行进行查找这里就不赘述了。

1
2
3
4
5
6
7
8
#coding:utf-8
import time
import email
import smtplib
import traceback
from email.mime.text import MIMEText
from selenium import webdriver

常见错误

出现元素找不到

  1. 绝大部分是Xpath路径出错,建议仔细查找。
  2. 如果在页面上只有可视的部分进行了操作,不可视的地方出现“元素找不到”,在确认Xpath路径绝对正确的情况下,也许是浏览器初始化设置出问题了,尽量让所有的内容在一页上。
  3. 可能是页面上有窗体什么的,如果页面中有嵌套iframe,直接定位iframe中的元素定位不到,考虑是iframe的原因。应该先定位到iframe,然后再去定位元素。
  4. 还有很多突发情况,建议多参考博客。

出现在自己的PC上可以运行但是放到服务器上,出现错误

  1. 这个视错误而定,如果是主题出错,说明坏境没有安装好
  2. 如果只是邮件发送不出去,建议查看服务器是否被占用了邮件发送的端口,阿里云等有时候会占用服务器的一部分端口,这时候换个端口即可。
  3. 还有很多突发情况,建议多参考博客。

源代码已经放在Github上,欢迎来击剑。

如有雷同,纯属巧合,如有错误,请大佬指出,晚辈一定改正

参考:https://blog.csdn.net/li827437709/article/details/108033990感谢博主


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!