1、python3基于uiautomator2实现钉钉自动打卡python3基于uiautomator实现钉钉自动打卡1、思路首先开启钉钉中的极速打卡功能,然后利用python3+uiautomator2,在上下班时间启动钉钉apk即可。2、使用说明电脑必须有python3的环境,python3、python3、python3重要的事情说三遍。手机安装微信,登录自己的微信小号USB线连接手机,dos窗口运行,python -m uiautomator2 init运行成功的标志:手机中安装一个名称为ATX的apk,打开后点击“启动”在config.txt填写上班下班时间,微信号,打卡APP账户、密码
2、信息,自动化脚本都自动读取一切准备好后,双击start_AutoClock.bat,执行自动化打卡3、自动化脚本运行流程1.定时判断是否到上下班时间2.到预期时间后,执行启动apk,循环启动3次,确保执行了极速打卡3.每次在dd界面等待30秒,给dd执行极速打卡功能4.3次循环完成后,启动dd后,在打卡通知界面截图5. 在文件管理中找到截图,微信(自己的微信小号)分享打卡截图给微信好友(自己的微信大号)3.1 config.txt文件,填写自己的信息start_AutoClock.bat(windows下双击执行批处理)# !/usr/bin/env python# -*- coding: u
3、tf-8 -*-# Time : 2019/06/11 16:34# Author : huangpeng# Site :# File : AutoClock.py# Software: PyCharmimport unittestimport timeimport sysimport uiautomator2 as u2import logginglogging.basicConfig(level = logging.INFO,format = %(asctime)s - %(name)s - %(levelname)s - %(message)s)logger = logging.getL
4、ogger(_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(=) # 将每行内容根据=分割 configss0 = ss1fp.close()class Test(unittest.TestC
5、ase): 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.wa
6、tcher(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
7、(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 = ti
8、me.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) logg
9、er.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(打开文件
10、管理器) 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(进入保存图片文件
11、夹) 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).
12、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)
13、 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(): # 判断是否在手机初始桌面 log
14、ger.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秒极速打卡时间) tim
15、e.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.sl
16、eep(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
17、.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=co
18、m.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(输入密码)
19、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(resour
20、ceId=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.
21、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()3.2 备注:AutoClock.py是使用360 N5手机适配,其他手机可能需要轻微的修改可以支持解图案锁,但要根据实际手机情况修改图案坐标位置,也可以不设置图案锁需开启钉钉极速打卡功能,开启极速打卡、开启极速打卡、开启极速打卡将AutoClock.py、start_AutoClock.ba和config.txt放在同一个目录下
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2