*python3+uiautomator2实现钉钉自动打卡
思路:首先开启钉钉中的极速打卡功能,然后利用python3+uiautomator2,在上下班时间启动钉钉apk即可。
使用说明:
自动化脚本运行流程
1.定时判断是否到上下班时间
2.到预期时间后,执行启动apk,循环启动3次,确保执行了极速打卡
3.每次在dd界面等待30秒,给dd执行极速打卡功能
4.3次循环完成后,启动dd后,在打卡通知界面截图
5.在文件管理中找到截图,微信(自己的微信小号)分享打卡截图给微信好友(自己的微信大号)
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()
备注: