学校的自动打卡
发布日期:2021-05-07 10:48:28 浏览次数:12 分类:技术文章

本文共 4828 字,大约阅读时间需要 16 分钟。

学校每天都要让我们去打卡,虽然时间很短,但还是要手动操作,我自己写了个程序,来代替手动打卡。

信息门户登录

首先,要在进行登录。进行信息搜集,先找到登录框的用户名和密码的所在处,发现可以用id来进行定位

在这里插入图片描述
然后再查找登录按钮的所在处,也是可以用id定位
在这里插入图片描述
所以可以先定位,然后用send_keys()函数将账号和密码输入进去,click()函数实现点击。如果账号或密码输入错误,会显示认证信息无效,可以用一个if循环实现

username_btn = bro.find_element_by_id('username')password_btn = bro.find_element_by_id('password')username_btn.send_keys('xxxxxxxxx')password_btn.send_keys('xxxxxx')login_btn = bro.find_element_by_id('passbutton')login_btn.click()if '认证信息无效' in bro.page_source:    print('登录失败,账号密码可能错误')else:    print('登录成功')

这个网站登陆后会有一个bug,显示访问页面出错,应对的操作是需要返回一下

if '重新登录' in bro.page_source:    bro.back()

进入打卡页面

接下来是点击打卡,进入打卡页面,可以看到,点健康信息打卡下面的星星也是能进去的,所以在标签定位时可以选择星星,然后利用class标签进去

在这里插入图片描述
在这里插入图片描述

clock_in_btn = bro.find_element_by_class_name('stars')clock_in_btn.click()print('已进入打卡页面')

因为打卡界面是一个新的句柄,并不是在当前句柄页,所以要进行句柄的切换。先获取当前浏览器的所有句柄,然后选择打卡页面的句柄。

sleep(3)n = bro.window_handles  # 获取当前浏览器所有窗口句柄# print('当前句柄:', n)bro.switch_to.window(n[-1])  # 切换到打卡窗口的句柄

取消弹窗

进去后,如果当日打过卡,会有一个弹窗,问你当日已打过卡,是否需要继续打卡。这里可以选择点击x将窗口关闭。定位的话可以选用xpath

在这里插入图片描述

# 如果当日提交过,选择关闭按钮if '当日已经' in bro.page_source:	close_btn = bro.find_element_by_class_name('layui-layer-btn0')    close_btn.click()

数据填写及提交

在这个打卡中,绝大部分的信息是已经填写好的,只差一个昨晚体温和今晨体温,我们可以全部填36.7,在开发者工具中查看,发现可以用id定位

在这里插入图片描述
在这里插入图片描述

# 体温数值填入tw = bro.find_element_by_id('input_tw')tw.send_keys('36.7')zwtw = bro.find_element_by_id('input_zwtw')zwtw.send_keys('36.7')print('温度已填写')

最后就是点击提交按钮了,这里我一开始是用的class标签定位,发现一直不成功,后面改用xpath就成功了,也不知道啥原因。

在这里插入图片描述

# 提交submit_btn = bro.find_element_by_xpath('/html/body/div[1]/div/div/div/div[2]/div/div/button[1]')submit_btn.click()print('打卡成功')

完整代码

from selenium import webdriverfrom time import sleepfrom lxml import etreeif __name__ == '__main__':    bro = webdriver.Chrome('./chromedriver.exe')    bro.get('http://ids2.just.edu.cn/cas/login?service=http%3A%2F%2Fmy.just.edu.cn%2F')    print('信息门户加载完成')    username_btn = bro.find_element_by_id('username')    password_btn = bro.find_element_by_id('password')    username_btn.send_keys('xxxxxxxx')    password_btn.send_keys('xxxxx')    login_btn = bro.find_element_by_id('passbutton')    login_btn.click()    if '认证信息无效' in bro.page_source:        print('登录失败,账号密码可能错误')    else:        print('登录成功')    # 信息门户的bug,要返回上一页    bro.back()    # 开始点击打卡    daka_btn = bro.find_element_by_class_name('stars')    daka_btn.click()    print('已进入打卡页面')    # 将旧url更新到打卡的url    sleep(3)    n = bro.window_handles  # 获取当前浏览器所有窗口句柄    # print('当前句柄:', n)    bro.switch_to.window(n[-1]) # 切换到打卡窗口的句柄    # 如果当日提交过,选择关闭按钮    if '当日已经' in bro.page_source:        close_btn = bro.find_element_by_class_name('layui-layer-btn0')        close_btn.click()    # 体温数值填入    tw = bro.find_element_by_id('input_tw')    tw.send_keys('36.7')    zwtw = bro.find_element_by_id('input_zwtw')    zwtw.send_keys('36.7')    print('温度已填写')    # 提交    submit_btn = bro.find_element_by_xpath('/html/body/div[1]/div/div/div/div[2]/div/div/button[1]')    submit_btn.click()    print('打卡成功')    sleep(3)    bro.quit()

函数实现打卡

使用这个代码可能会帮很多人打卡,可以选择将上面的打卡代码封装为一个函数,这样就可以实现多人打卡,并且,在打卡的时候看不看弹出的浏览器内容也不是那么的重要,可以选择将浏览器弹窗隐藏。

from selenium import webdriverfrom time import sleepfrom lxml import etreefrom selenium.webdriver.chrome.options import Optionsdef clock_in(uname, passwd):    # 实现无可视化操作    chrome_options = Options()    chrome_options.add_argument('--headless')    chrome_options.add_argument('--disable-gpu')    bro = webdriver.Chrome(executable_path='./chromedriver.exe', options=chrome_options)    bro.get('http://ids2.just.edu.cn/cas/login?service=http%3A%2F%2Fmy.just.edu.cn%2F')    print('信息门户加载完成')    username_btn = bro.find_element_by_id('username')    password_btn = bro.find_element_by_id('password')    username_btn.send_keys(uname)    password_btn.send_keys(passwd)    login_btn = bro.find_element_by_id('passbutton')    login_btn.click()    if '认证信息无效' in bro.page_source:        print('登录失败,账号或密码可能错误')    else:        print('登录成功')    # 信息门户的bug,要返回上一页    if '重新登录' in bro.page_source:        bro.back()    # 开始点击打卡    clock_in_btn = bro.find_element_by_class_name('stars')    clock_in_btn.click()    print('已进入打卡页面')    # 将旧url更新到打卡的url    sleep(3)    n = bro.window_handles  # 获取当前浏览器所有窗口句柄    # print('当前句柄:', n)    bro.switch_to.window(n[-1])  # 切换到打卡窗口的句柄    # 如果当日提交过,选择关闭按钮    if '当天已经' in bro.page_source:        close_btn = bro.find_element_by_class_name('layui-layer-btn0')        close_btn.click()    # 体温数值填入    tw = bro.find_element_by_id('input_tw')    tw.send_keys('36.7')    zwtw = bro.find_element_by_id('input_zwtw')    zwtw.send_keys('36.7')    print('温度已填写')    # 提交    submit_btn = bro.find_element_by_xpath('/html/body/div[1]/div/div/div/div[2]/div/div/button[1]')    submit_btn.click()    print('打卡成功')if __name__ == '__main__':    username = input('请输入学号:')    password = input('请输入密码:')    clock_in(username, password)

最终的效果图

在这里插入图片描述
可以选择把代码放在服务器上,创建一个定时任务,每天定时打卡,这样连运行程序都省去了。

上一篇:python入门——运算符
下一篇:python入门——数据类型

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年04月07日 02时58分12秒