您的位置:首页 > 编程语言 > Python开发

基于selenium与itchat模块的自动打卡签到签出python代码示例

2018-09-11 09:48 841 查看
版权声明:辛苦原创,请勿盗取。 https://blog.csdn.net/shuryuu/article/details/82620602

项目介绍:

这个脚本在我刚来上班的时候就想写,明明每天都要滴卡上下班,为什么还要搞个网页每天签入签出呢,一不小心忘了还要扣工资,这不合理,必须得治,基于刚来的时候只会写java,写起来太费时间了,而且我java写的不咋地,也就放弃了,后来自学了python,直到前几天,我接触到了selenium模块,好用的一批,对于大数据量的网页操作来说还是爬虫框架比较好用,但对于公司这种签到签出网页,对于反爬虫策略可是做的足足的,所以我选择利用最简单的方法,实现目标即可,本来我还写了一个发送命令行,可以实现微信操作电脑cmd的,我觉得没啥用,而且让我的小脚本变得太臃肿,然后删掉了,需要的话,可以联系我发源码。

主要采用了selenium与itchat模块,itchat是利用微信与电脑进行交互的好东西,具体的可以自己搜一下,反正我的思路就是利用微信控制电脑。接下来让我们直接上代码,亲测可用,如有问题请联系,免费帮忙搞定。

[code]#-*- coding: UTF-8 -*-
#2018/09/05
#longzhu
import os
from PIL import Image
from selenium import webdriver
import time
import itchat

@itchat.msg_register('Text')
def text_reply(msg):
global flag
message = msg['Text']
fromName = msg['FromUserName']
toName = msg['ToUserName']

if toName == "filehelper":
itchat.send(sendMsg, fromName)
if message == "打卡":
global driver
chromedriver = "D:\Python27\chromedriver"
os.environ["webdriver.chrome.driver"] = chromedriver
driver = webdriver.Chrome(chromedriver)  # 打开chrome浏览器
login("longzhu", "123456")#请将此处换成你的账号密码,需要手动输入的话请回复代打卡
daka()
try:
yanzhengma()
itchat.send("可以获取验证码", "filehelper")
except:
driver.find_element_by_name("check").click()
itchat.send("打卡成功", "filehelper")
time.sleep(2)
driver.save_screenshot('D:\yzm\yzm.png')
send('D:\yzm\yzm.png')
if message == "验证码":
send('D:\yzm\yzm1.jpeg')
if message == "再次获取验证码":
yanzhengma()
itchat.send("获取成功", "filehelper")
send('D:\yzm\yzm1.jpeg')
if message == "代打卡":
itchat.send("请输入账号密码如:longzhu,123456,备注理由", "filehelper")
if len(message) > 10:
message.split(',')
bz = message[2]
login(message[0],message[1])
daka()
beizhu(bz)
if driver.find_element_by_id('image'):
yanzhengma()
itchat.send("可以获取验证码", "filehelper")
else:
driver.find_element_by_name("check").click()
itchat.send("打卡成功", "filehelper")
time.sleep(2)
driver.save_screenshot('D:\yzm\yzm.png')
send('D:\yzm\yzm.png')
if len(message) == 4:
shuru(message)
time.sleep(3)
driver.save_screenshot('D:\yzm\yzm.png')
send('D:\yzm\yzm.png')
if message == "结果":
driver.save_screenshot('D:\yzm\yzm.png')
send('D:\yzm\yzm.png')

#登录打卡网址
def login(uname, pwd):
driver.get("http://om.xxxxx.com/attendances/check_out/6111421")
time.sleep(1)
driver.maximize_window()  # 将浏览器最大化
time.sleep(2)
if driver.find_element_by_id("username"):
for i in uname:
driver.find_element_by_id("username").send_keys(i)
time.sleep(0.2)
time.sleep(1)
if driver.find_element_by_id("password_input"):
for j in pwd:
driver.find_element_by_id("password_input").send_keys(j)
time.sleep(0.2)
time.sleep(1)
if driver.find_element_by_id("login_button"):
driver.find_element_by_id("login_button").click()
time.sleep(3)

def beizhu(bz):
if bz == None:
return
if driver.find_element_by_id("sub_check_out_remark"):
for j in bz:
driver.find_element_by_id("sub_check_out_remark").send_keys(j)
time.sleep(0.2)
time.sleep(1)

#点击签出按钮
def daka():
try:
driver.find_element_by_id("checkout_btn").click() # 网页中查找签出按钮
except:
driver.find_element_by_id("checkin_btn").click() # 点击签入按钮
time.sleep(5)

#获取验证码图片
def yanzhengma():
if os.path.exists('D:\yzm\yzm.png'):
os.remove('D:\yzm\yzm.png')
if os.path.exists('D:\yzm\yzm1.jpeg'):
os.remove('D:\yzm\yzm1.jpeg')
driver.save_screenshot('D:\yzm\yzm.png')  # 截取当前网页,该网页有我们需要的验证码
imgelement = driver.find_element_by_id('image')  # 定位验证码
location = imgelement.location  # 获取验证码x,y轴坐标
size = imgelement.size  # 获取验证码的长宽
rangle = (int(location['x']), int(location['y']), int(location['x'] + size['width']),
int(location['y'] + size['height']))  # 写成我们需要截取的位置坐标
i = Image.open("D:\yzm\yzm.png")  # 打开截图
frame4 = i.crop(rangle)  # 使用Image的crop函数,从截图中再次截取我们需要的区域
frame4.convert('RGB').save('D:\yzm\yzm1.jpeg')#成功获取到验证码图片

#读取验证码
def get_file_content(file):
with open(file, 'rb') as fp:
return fp.read()

#验证码识别
def send(image_path):
try:
itchat.send_image(image_path, 'filehelper')
print("send success")
except:
print("fail")

#刷新验证码
def shuaxinyzm():
if driver.find_element_by_id("image"):
driver.find_element_by_id("image").click()

#输入验证码
def shuru(yzm):
if driver.find_element_by_id("code_input"):
if len(yzm)==1:
driver.find_element_by_id("code_input").send_keys(yzm)
else:
for i in yzm:
driver.find_element_by_id("code_input").send_keys(i)
time.sleep(0.2)
if driver.find_element_by_name("check"):
driver.find_element_by_name("check").click()
print("打卡成功")

if __name__ == '__main__':
sendMsg = u"{消息助手}:暂时无法回复"
usageMsg = u"使用方法:\n1.开启打卡脚本:打卡\n" \
u"2.发送验证码:验证码\n3.重新获取验证码:再次获取验证码\n" \
u"4.帮同事打卡:代打卡\n5.输入验证码:直接回复四位验证码\n" \
u"6.查看打卡是否成功:结果\n"
itchat.auto_login()
itchat.send(usageMsg, "filehelper")
global_var_list = []
itchat.run()

本脚本开启之后,网页版微信会一直在线,需要打卡的时候,在你的文件传输助手界面发送打卡两个字就会开启脚本,在正式使用之前,可以先尝试着操作一遍,以免出错,每次你回复之后,脚本都会给你一个信息反馈,在给出反馈之后,你再进行下一步的处理,因为避免被公司it查到,所以脚本用了很多time.sleep进行进程挂起的操作,所以需要等到电脑端反馈消息之后再进行操作,如果没有验证码的话,直接回复打卡就能搞定,有验证码的话,请按照提示操作。代码量不知不觉有点大,反正乱七八糟的,能用就行,毕竟是写着玩的,基本用不到,像我那么按时上下班的五星好员工,怎么会需要这种东西呢?(小声bb,工资也不给加,早晚我是要跳槽的,哼)

注:本脚本适用于腾讯外包签到签出打卡页面,实测可用,如有问题,可与博主联系。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: