问题提出
又到了一年一度的三八国际妇女劳动节,作为单位部门里面唯三的男同志依旧坚守岗位,剩下的女同志全部去参加活动了。
结合之前食堂改造刷卡机一直没有着落,寻思着每天上班都能按时到,但是因为早餐的问题不得不先去行政楼打卡再去食堂或者找别人帮忙网页签到。
所以用大家都不在的时间研究了一下自动签退的脚本。
问题梳理
最早的想法是利用按键精灵,网页打开后模拟按键进行操作,很早的时候就已经测试过,似乎不太可行,对于Click操作可能有点问题,因此被抛弃了。
后来的想法是做一个自动运行的油猴脚本,但是不能定时启动,这种事情无人值守才有意义不是?
Google了一下解决方案,大部分都是利用Python+selenium实现,因为是第一次接触Python,之前虽然有听过大名,但是一直没有实际需求去接触这块,所以网上扒了点代码适配了一下签到网页,实现了多人签到。
解决思路
基本的解决思路是:
设置电脑自动开机→Win自带的计划任务→执行Pyhthon脚本签到.
好在单位电脑BIOS可以设置定时开机,不用一直开着了。
Python解决思路:
利用selenium,打开签到网页,读取json文件后模拟登陆、签到、退出等一系列操作,实现多人签到。
准备工作
Python环境安装
直接去Python下载页面下载对应版本安装即可,记得在安装时就勾选配置环境变量。
Python下载地址
selenium安装
由于是离线环境,因此需要将selenium包下载后放到本地文件进行安装。
selenium下载地址
解压后放置到Python的安装目录的\Lib\site-packages中,进入setup.py文件的文件夹内,空白处按住Shift+鼠标右键,选择在此处打开命令窗口,输入命令:python setup.py install。
配置ChromeDriver
下载Chrome版本对应的ChromeDriver并置于Python安装目录的Scripts文件夹中。
ChromeDriver国内镜像
代码实现
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 57 58 59 60 61
| import time import json from selenium import webdriver from selenium.webdriver.common.keys import Keys username=[] passwd=[] driver = webdriver.Chrome() driver.get("http://203.128.0.140:9090/lemis/")
f = open("info.json",encoding='utf-8') setting = json.load(f) useraccount = setting['useraccount']
for i in range(len(useraccount)): username=useraccount[i]['username'] passwd=useraccount[i]['passwd'] try: time.sleep(2) now_handle = driver.current_window_handle driver.switch_to_window(now_handle) driver.find_element_by_name("bsc011").clear() time.sleep(1) driver.find_element_by_name("bsc011").send_keys(username) driver.find_element_by_name("bsc013").send_keys(passwd) driver.find_element_by_id("hhh").click() time.sleep(2)
if int(time.strftime("%H",time.localtime())) < 9: driver.find_element_by_id("registration").click() print(username+"签到成功") time.sleep(2) else: driver.find_element_by_id("signout").click() print(username+"签退成功") time.sleep(2)
driver.find_element_by_id("0").click() time.sleep(2)
driver.find_element_by_xpath("//*[@class='mini-layout-region-body']/div[2]/ul[2]/li[1]/a").click() time.sleep(2) driver.switch_to_alert().accept() time.sleep(2) print(username+"登出成功") except: print(username+"签退失败") driver.quit
|
后续
因为内外网分离,所以无法在执行完后获取结果。后续可以利用内外网文件交换系统,在执行完后将Log文件上传,以便于人在外面时了解执行情况。并且在脚本中增加自动关机命令,在签退完成后自动关机。