python3+uiautomator2实现钉钉自动打卡并微信发送打卡截图

*python3+uiautomator2实现钉钉自动打卡

思路:首先开启钉钉中的极速打卡功能,然后利用python3+uiautomator2,在上下班时间启动钉钉apk即可。

使用说明:

  • 电脑必须有python3的环境,python3、python3、python3…重要的事情说三遍。。。
  • 手机安装微信,登录自己的微信小号
  • USB线连接手机,dos窗口运行,python -m uiautomator2 init
  • 运行成功的标志:手机中安装一个名称为ATX的apk,打开后点击“启动”
  • 在config.txt填写上班下班时间,微信号,打卡APP账户、密码信息,自动化脚本都自动读取
  • 一切准备好后,双击start_AutoClock.bat,执行自动化打卡

自动化脚本运行流程
1.定时判断是否到上下班时间
2.到预期时间后,执行启动apk,循环启动3次,确保执行了极速打卡
3.每次在dd界面等待30秒,给dd执行极速打卡功能
4.3次循环完成后,启动dd后,在打卡通知界面截图
5.在文件管理中找到截图,微信(自己的微信小号)分享打卡截图给微信好友(自己的微信大号)

config.txt文件,填写自己的信息
在这里插入图片描述

start_AutoClock.bat(windows下双击执行批处理)

@echo off 

python3 AutoClock.py

pause


AutoClock.py(自动化python脚本)

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/06/11 16:34
# @Author  : huangpeng
# @Site    :
# @File    : AutoClock.py
# @Software: PyCharm
import unittest
import time
import sys
import uiautomator2  as u2
import logging
logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)


d = u2.connect()
#d = u2.connect('192.168.1.239')


# 打开文本文件
fp = open('config.txt', 'r')
# 使用readlines读取
lines = fp.readlines()
config = {}
for line in lines:
    # 将读取的每行内容过滤掉换行符,如果不加这个条件,输入的内容中将会添加换行符\n
    line = line.strip('\n')
    ss = line.split('=')  # 将每行内容根据=分割
    config[ss[0]] = ss[1]
fp.close()




class Test(unittest.TestCase):
    def setUp(self):
        self.watcherson()
        print('d.watchers')
        print  ("----------SetUp -----\n")
    def tearDown(self):
        d.watchers.remove()
        print  ("-----------TearDown----\n")
    def watcherson(self):
        d.watcher(u'注意').when(text=u'你在此次选择后可以到“手机管理 - 权限管理”中修改此项设置').click(text=u'允许', className='android.widget.Button',resourceId='android:id/button1')
        d.watcher(u'无响应').when(text=u'关闭应用').click(text=u'关闭应用', className='android.widget.Button')
        d.watchers.run()
        pass
    def test_autoclockout(self):# 下班打卡
        logger.info("检查时间是否到下班时间")
        while True:
            time1 =config["下班起始时间"]  # 起始下班时间(启动ddapk时间)
            time2 =config["下班终止时间"] # 终止时间
            now1 = time.strftime("%H%M%S")#一定要在while循环中才会实时更新为当前时间
            if  int(time2)>int(now1)>int(time1): #定时执行app
                logger.info("到下班时间")
                self.test_autoclock()   #进入dd应用,进行极速打卡
                time.sleep(1)
                self.test_WeChatMsgsnd()  # 打开微信分享打卡截图
                break

    def test_autoclockin(self):# 上班打卡
        logger.info("检查时间是否到上班时间")
        while True:
            time1 = config["上班起始时间"]  # 起始下班时间(启动ddapk时间)
            time2 = config["上班终止时间"]  # 终止时间

            now1 = time.strftime("%H%M%S")  # 一定要在while循环中才会实时更新为当前时间
            if int(time2) > int(now1) > int(time1):  # 定时执行app
                logger.info("到上班时间")
                logger.info("进入dd")
                self.test_autoclock() #进入dd应用,进行极速打卡
                time.sleep(1)
                self.test_WeChatMsgsnd()#打开微信分享打卡截图
                break
    def test_WeChatMsgsnd(self):
        time.sleep(3)
        self.test_lock()
        time.sleep(1)
        logger.info("打开dd")
        d.app_start("com.alibaba.android.rimet")  # 打开dd
        time.sleep(5)
        logger.info("截图")
        d.screenshot("Screenshot.jpg")
        time.sleep(2)
        d.push("Screenshot.jpg", "/sdcard/0pics/")
        time.sleep(2)
        logger.info("退出dd")
        d.app_stop("com.alibaba.android.rimet")
        time.sleep(1)
        d.press("home")
        time.sleep(1)

        logger.info("打开文件管理器")
        d.app_start("com.qiku.android.filebrowser")
        time.sleep(2)
        while True:
            logger.info("检查是否在文件夹初始界面")
            if d(resourceId="com.qiku.android.filebrowser:id/storage_name").exists:

                logger.info("在文件夹初始界面,进入文件夹")
                d(resourceId="com.qiku.android.filebrowser:id/storage_arrows").click()
                time.sleep(1)
                logger.info("进入保存图片文件夹")
                d(resourceId="com.qiku.android.filebrowser:id/file_name").click()
                time.sleep(1)
                logger.info("长按图片")
                d.long_click(0.348, 0.219)
                time.sleep(1)
                logger.info("分享")
                d(text=u"分享").click()
                time.sleep(3)
                logger.info("选分享对象")
                d(text=u"发送给朋友").click()
                time.sleep(1)
                logger.info("选择朋友")
                d(resourceId="com.tencent.mm:id/b98").click()
                time.sleep(0.5)
                d(resourceId="com.tencent.mm:id/b98").clear_text()
                time.sleep(0.5)
                d(resourceId="com.tencent.mm:id/b98").set_text(config["自己微信大号名称"])
                time.sleep(0.5)
                d(resourceId="com.tencent.mm:id/qm").click()
                time.sleep(0.5)

                logger.info("点击发送")
                d(resourceId="com.tencent.mm:id/b00").click()
                time.sleep(7)

                d.press("home")
                logger.info("息屏")
                d.screen_off()  # 息屏

                break
            else:
                logger.info("不在文件夹初始界面,返回继续检查是否在初始界面")
                d.press("back")
                time.sleep(1)






    def test_autoclock(self): #进入dd应用,进行极速打卡
        logger.info("检查解手机屏幕锁")
        self.test_lock()  # 判断是否需要屏幕解锁
        while True:
            logger.info("判断是否在手机初始桌面")
            if d(text=u"拨号").exists():  # 判断是否在手机初始桌面
                logger.info("在手机初始桌面")
                time.sleep(1)
                logger.info("打开dd")
                d.app_start("com.alibaba.android.rimet")  # 打开dd
                time.sleep(3)
                logger.info("判断是否需要登录")
                if d(resourceId="com.alibaba.android.rimet:id/btn_next").exists():  # 判断是否需要登录
                    logger.info("需要登录")
                    self.test_login()  #执行登录dd账户
                    logger.info("登录成功")
                    logger.info("等待30秒极速打卡时间")
                    time.sleep(30)
                    logger.info("退出dd")
                    d.app_stop("com.alibaba.android.rimet")# 退出dd
                    time.sleep(2)
                    for count in list(range(1, 3)):
                        logger.info("进入dd,执行极速打卡")
                        d.app_start("com.alibaba.android.rimet")  # 打开dd
                        logger.info("等待30秒极速打卡时间")
                        time.sleep(30)
                        logger.info("退出dd")
                        d.app_stop("com.alibaba.android.rimet")  # 退出dd
                        time.sleep(1)
                    logger.info("息屏")
                    d.screen_off()  # 息屏

                else:
                    logger.info("不需要登录,执行极速打卡")
                    logger.info("等待30秒极速打卡时间")
                    time.sleep(30)
                    logger.info("退出dd")
                    d.app_stop("com.alibaba.android.rimet")  # 退出dd
                    time.sleep(2)
                    for count in list(range(1, 3)):
                        logger.info("进入dd,执行极速打卡")
                        d.app_start("com.alibaba.android.rimet")  # 打开dd
                        logger.info("等待30秒极速打卡时间")
                        time.sleep(30)
                        logger.info("退出dd")
                        d.app_stop("com.alibaba.android.rimet")  # 退出dd
                        time.sleep(1)
                    logger.info("息屏")
                    d.screen_off()  # 息屏
                break
            else:
                logger.info("不在手机初始桌面,返回继续检测是否在初始桌面")
                d.press("back")
                time.sleep(1)

    def test_login(self):       #登录dd账号

        logger.info("输入账号")
        time.sleep(1)
        d(resourceId="com.alibaba.android.rimet:id/et_phone_input").click()
        time.sleep(0.5)
        d(resourceId="com.alibaba.android.rimet:id/et_phone_input").clear_text()  # 这里是清除指定元素的内容  
        time.sleep(0.5)
        d(resourceId="com.alibaba.android.rimet:id/et_phone_input").set_text(config["钉钉账号"])  # 这里是在指定元素中输入dd账号
        time.sleep(0.5)

        logger.info("输入密码")
        d(resourceId="com.alibaba.android.rimet:id/et_pwd_login").click()
        d(resourceId="com.alibaba.android.rimet:id/et_pwd_login").clear_text()  # 这里是清除指定元素的内容  
        time.sleep(0.5)
        d(resourceId="com.alibaba.android.rimet:id/et_pwd_login").set_text(config["钉钉密码"])  # 这里是在指定元素中输入dd密码#
        time.sleep(0.5)

        logger.info("登录")
        d(resourceId="com.alibaba.android.rimet:id/btn_next").click()

    def test_lock(self):   #解锁手机屏幕
        d.screen_on()
        logger.info("判断手机是否在锁屏状态")
        if d(resourceId="com.android.systemui:id/notification_stack_scroller").exists():#判断手机是否在锁屏状态
            logger.info("锁屏状态,执行解锁")
            d.swipe_points([(0.485, 0.708), (0.481, 0.286)], 0.05)  # 滑动解锁界面
            time.sleep(1)
            logger.info("判断是否存在图案锁")
            if d(resourceId="com.android.systemui:id/lockPatternView").exists():  # 判断是否存在图案锁
                logger.info("存在,需要解图案锁")
                d.swipe_points([(0.777, 0.539), (0.509, 0.691), (0.777, 0.694), (0.512, 0.853), ], 0.05)  # 解九宫图案锁(需要修改自己的图案锁坐标)
                time.sleep(1)
            else:
                logger.info("不存在,滑动解锁成功")
        else:
            logger.info("手机未锁屏不用解锁")



if __name__ == '__main__':
    Test=Test()
    Test.test_autoclockout()
    Test.test_autoclockin()



备注:

  1. AutoClock.py是使用360 N5手机适配,其他手机可能需要轻微的修改
  2. 可以支持解图案锁,但要根据实际手机情况修改图案坐标位置,也可以不设置图案锁
  3. 需开启钉钉极速打卡功能,开启极速打卡、开启极速打卡、开启极速打卡……
  4. 将AutoClock.py、start_AutoClock.ba和config.txt放在同一个目录下
    在这里插入图片描述

执行过程log
在这里插入图片描述

发布了58 篇原创文章 · 获赞 18 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42846555/article/details/91430881