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

版权声明:转载请联系350267226,辛苦原创,请勿盗取。 https://blog.csdn.net/shuryuu/article/details/82620602

项目介绍:

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

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

#-*- 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,工资也不给加,早晚我是要跳槽的,哼)

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

猜你喜欢

转载自blog.csdn.net/shuryuu/article/details/82620602