ZiGma

【Python】建立自动签到签退工作流

字数统计: 981阅读时长: 4 min
2019/03/09 Share

问题提出

又到了一年一度的三八国际妇女劳动节,作为单位部门里面唯三的男同志依旧坚守岗位,剩下的女同志全部去参加活动了。

结合之前食堂改造刷卡机一直没有着落,寻思着每天上班都能按时到,但是因为早餐的问题不得不先去行政楼打卡再去食堂或者找别人帮忙网页签到。

所以用大家都不在的时间研究了一下自动签退的脚本。

问题梳理

最早的想法是利用按键精灵,网页打开后模拟按键进行操作,很早的时候就已经测试过,似乎不太可行,对于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
# -*- coding: utf-8 -*-
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/")
#driver.maximize_window() #将窗口最大化

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文件上传,以便于人在外面时了解执行情况。并且在脚本中增加自动关机命令,在签退完成后自动关机。

CATALOG
  1. 1. 问题提出
  2. 2. 问题梳理
  3. 3. 解决思路
  4. 4. 准备工作
    1. 4.0.1. Python环境安装
    2. 4.0.2. selenium安装
    3. 4.0.3. 配置ChromeDriver
  • 5. 代码实现
  • 6. 后续