python3 + uiautomator2 achieve automatic punch and staple punch micro-channel transmission screenshot

* Python3 + uiautomator2 staple achieve automatic punch

Ideas: First, open a nail punch speed of function, and then use python3 + uiautomator2, you can start nailing apk on working hours.

Instructions for use:

  • Computer must have python3 environment, python3, python3, python3 ... important things to say three times. . .
  • Phone install micro letter, log in to your micro letter trumpet
  • USB cable to connect phone, dos window operation, python -m uiautomator2 init
  • Successful run flag: a name for your phone to install apk ATX, click the "Start" to open
  • Config.txt from work to fill in time, the micro-signals, punch APP account, password information, automation scripts are automatically read
  • Everything is ready, double-click start_AutoClock.bat, perform automated punch

Process automation scripts run
1 determines whether or not the timing to commute time
2 to the desired time, the execution start APK, 3 times a cycle start, the speed to ensure the implementation punch
3. Each interface dd wait 30 seconds to perform speed punch dd function
after the completion of 4.3 cycles, after starting dd, notification interface screenshots punch
5. find screen in the file manager, the micro-channel (micro-channel own trumpet) to share the theme punch micro-letter friends (their large micro-channel)

config.txt file, fill in their information
Here Insert Picture Description

start_AutoClock.bat (double-click on the windows to perform batch)

@echo off 

python3 AutoClock.py

pause


AutoClock.py (automation python script)

# !/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()



Remarks:

  1. AutoClock.py using 360 N5 phone adapter, other phones may require slight modifications
  2. Pattern lock solution can support, but to modify the pattern coordinate position according to the actual cell phone cases, you may not set a pattern lock
  3. Need to open a nail punch speed function, turn speed punch, punch open the speed, turn speed punch ......
  4. The AutoClock.py , start_AutoClock.ba and config.txt in the same directory
    Here Insert Picture Description

Execution log
Here Insert Picture Description

Published 58 original articles · won praise 18 · views 20000 +

Guess you like

Origin blog.csdn.net/qq_42846555/article/details/91430881