Python控制手机实现抖音极速版快手极速版自动刷金币

一、安装Python需要的包

https://blog.csdn.net/FG24151110876/article/details/103867863

二、给手机安装ATX控制软件

pip install uiautomator2

https://blog.csdn.net/FG24151110876/article/details/103868335

三、代码

3.1、基于图片识别,通过代码对手机进行截图,裁切要识别的位置

3.2、程序每20分钟进行一次抖音宝箱广告,然后随机重新启动抖音极速版或快手极速版APP继续刷视频

 

# -*- coding: utf-8 -*-
"""
Created on Tue Feb 23 16:58:44 2021

@author: 
抖音极速版邀请码:872481738
快手极速版邀请码:767 160 108
"""

import uiautomator2 as u2
import time
import random
import re
import os
from datetime import datetime
import aircv as ac # pip install aircv
# No module named 'cv2'    pip install opencv-python


class 智能手机():
    '''
    智能手机类
    '''
    def __init__(self,ip):
        '''初始化'''
        
        # ip='192.168.3.145'
        # d = u2.connect(ip)
        self.ip=ip
        self.task_frequency=60*20 #任务频率,20分钟
        self.average_sleep=8 # 滑动手机间隔等待平均时间(秒) 
        self.i=0 # 初始化循环次数
        self.flag_sign=1# 签到标签
        self.ad_time=45 # 广告时长
        self.temp_ad_time=45 #识图临时广告
        self.abnormal_time=0 #异常消耗时间
        
    def 接收参数(self):
        '''接收程序参数'''
        try:
            self.next_time=60*eval(input('\n请输入距离下一次任务还有多少分钟?\n:'))
            self.日志('已成功接收参数设置!','距离下一次任务:','{}分钟'.format(self.next_time/60))
        except BaseException as e:
            self.日志('输入无效!','错误信息:',str(e))
            self.next_time=60*20
            self.日志('已将参数进行默认设置','距离下一次任务:','20分钟')
        finally:
            pass
    
        try:
            self.app_lalel=(input('\n请输入APP随机切换频率:')).upper()
            if re.match("^[DK]+$", self.app_lalel, re.I ):
                self.日志('已成功接收参数设置!','APP随机切换频率:',self.除重计数(self.app_lalel))
            else:
                self.app_lalel='DKK'
                self.日志('输入无效!','已将参数进行默认设置,APP随机切换频率:',self.除重计数(self.app_lalel))
                
        except BaseException as e:
            self.日志('输入无效!','错误信息:',str(e))
            self.app_lalel='DKK' #APP切换随机比例
            self.日志('已将参数进行默认设置','APP随机切换频率:',self.除重计数(self.app_lalel))
        finally:
            pass
        self.initial_time=time.time() # 计时器,用于判断本次循环时间的多少
        
    def 除重计数(self,app_label):
        '''
        比例的统计
        '''
        app_labels={}
        for app in app_label:
            app_labels[app]=app_labels.get(app,0)+1
        return str(app_labels)
        
        
    def 运行(self):
        
        self.日志('程序已开始运行!')
        self.接收参数()#接收参数
        self.启动抖音极速版()
        while True:
            try:
                self.执行()
            except BaseException as e:
                self.日志('运行错误!','错误信息:',str(e))
        
        
        
    def 执行(self):
        '''执行'''
        if self.next_time-(int(time.time()-self.initial_time))<=self.average_sleep:
            hh=int(time.strftime('%H'))
            mm=int(time.strftime('%M'))
            if hh==0 and mm<=20:
                self.启动抖音极速版()
            else:
                self.重启抖音极速版() # 调用重启抖音方法
            self.开始任务() # 调用打开任务界面并检查是否有签到任务
            self.限时任务赚金币()
            self.开宝箱赚金币() # 调用宝箱任务和宝箱广告浏览
            self.重置任务() # 返回视频或重新启动APP

        
        else:
            self.参数重置()#判断根据时间是否执行参数重置
            try:
                self.滑动屏幕()
                self.日志('第{}次{}滑动成功!'.format(self.i,self.获取名称()),'','')
            except BaseException as e:
                self.日志('第{}次{}滑动失败!'.format(self.i,self.获取名称()),'错误信息:',str(e))
            finally:
                # 初始化下一次任务时长-已用时长=初始化下一次任务时长-((当前时间-初始化时间))
                next_time=round(((self.next_time-(time.time()-self.initial_time))/60),2)
                self.日志('距离下一次任务还有:',next_time,'分钟')
        
        
        
        
    def 参数重置(self):
        '''强制重置参数初始化'''
        set_hh=23
        set_mm=59
        hh=int(time.strftime('%H'))
        mm=int(time.strftime('%M'))
        if hh>=set_hh and mm>=set_mm:
            self.重启抖音极速版()
            self.flag_sign=1
            self.app_lalel='DKK'
            self.next_time=3
            self.initial_time = time.time()
            
            self.日志('当天即将结束,参数已重置!\n',
                     '随机切换频率已恢复:{}'.format(self.calculator(self.app_lalel))
                     )
            self.暂停(60)
        else :
            self.i+=1
        
        
        
    def 日志(self,log_operation='',log_dimension='',log_target=''):
        log_time=time.strftime('%Y-%m-%d %H:%M:%S')#时间
        print('{} {}{}{}'.format(log_time,log_operation,log_dimension,log_target))
        '''日志:时间|操作|维度|指标'''
        
    
    def 启动抖音极速版(self):
        '''启动抖音极速版'''
        d = u2.connect(self.ip)
        # d.app_current()# 当前应用
        if d.app_current()['package']=='com.ss.android.ugc.aweme.lite':
            print(True)
            self.日志('抖音极速版正在运行中,无需启动!')
        else:
            d.app_stop("com.kuaishou.nebula")#停止快手极速版
            d.app_start("com.ss.android.ugc.aweme.lite")#启动抖音
            self.日志('正在启动抖音极速版!')
            
    def 重启抖音极速版(self):
        '''重启抖音极速版'''
        d = u2.connect(self.ip)
        try:
            d.app_stop("com.kuaishou.nebula")#停止快手极速版
            d.app_stop("com.ss.android.ugc.aweme.lite")#停止抖音极速版
            d.app_start("com.ss.android.ugc.aweme.lite")#启动抖音
        except BaseException as e:
            self.日志('抖音极速版重启异常!','错误信息:',str(e))
        finally:
            self.暂停(10)
            self.日志('抖音极速版重启等待结束!')

            
    def 启动快手极速版(self):
        '''启动快手极速版'''
        d = u2.connect(self.ip)
        if d.app_current()['package']=='com.kuaishou.nebula':
            print(True)
            self.日志('快手极速版正在运行中,无需启动!')
        else:
            d.app_stop("com.ss.android.ugc.aweme.lite")#停止抖音极速版
            d.app_start("com.kuaishou.nebula")#启动快手极速版
            self.日志('正在启动快手极速版!')
            
    def 重启快手极速版(self):
        '''重启快手极速版'''
        d = u2.connect(self.ip)
        self.日志('正在重启快手极速版!')
        try:
            d.app_stop("com.kuaishou.nebula")#停止快手极速版
            d.app_stop("com.ss.android.ugc.aweme.lite")#停止抖音极速版
            d.app_start("com.kuaishou.nebula")#启动快手极速版
        except BaseException as e:
            self.日志('快手极速版重启异常!','错误信息:',str(e))
        finally:
            self.暂停(16)
            self.日志('快手极速版重启等待结束!')
            
    def 获取名称(self):
        d = u2.connect(self.ip)
        if d.app_current()['package']=='com.kuaishou.nebula':
            return '快手极速版'
        elif d.app_current()['package']=='com.ss.android.ugc.aweme.lite':
            return '抖音极速版'
        else:
            return '手机屏幕'
    def 滑动屏幕(self):
        '''滑动屏幕'''
        d = u2.connect(self.ip)
        try:
            # d.swipe_ext("up", scale=0.88,steps=10)# 上滑88%
            d.swipe(0.5, 0.8, 0.5, 0.12)  # 按坐标滑动屏幕
            self.日志('{}滑动成功!'.format(self.获取名称()))
        except BaseException as e:
            self.日志('{}滑动异常!'.format(self.获取名称()))
        finally:
            # pass
            self.随机暂停(self.average_sleep)
        
    def 随机暂停(self,average):
        '''随机时间暂停方法'''
        # average=8
        
        sigma=6
        t=random.normalvariate(average,sigma) # 产生一个符合正态分布的随机时间
        while t<=0 or t>=12: 
            # 判断随机时间是否在指定范围
            t=random.normalvariate(average,sigma) # 重新产生一个符合正态分布的随机时间
        t0=round(t,2)#保留两位小数
        # 调用暂停方法
        self.暂停(t0)
        
    def 暂停(self,t):
        '''指定暂停时间方法'''
        t0=t
        sleep_time=0.08
        while t>sleep_time:
            t=round(t,2)
            time.sleep(sleep_time)#屏幕刷新间隔
            print('\r暂停等待时间还剩:{:>5}秒'.format(str(t)),end='')
            t=t-sleep_time
        print('\r{} 暂停等待{}秒已结束!'.format(time.strftime('%Y-%m-%d %H:%M:%S'),t0))        
        
        
        

                
    def 开始任务(self):
        '''赚金币任务'''
        d = u2.connect(self.ip)
        try:
            # d(resourceId="com.ss.android.ugc.aweme.lite:id/bh1").click() # 13.7.0
            # d(resourceId="com.ss.android.ugc.aweme.lite:id/bht").click() # 13.8.0
            d(resourceId="com.ss.android.ugc.aweme.lite:id/buq").click() # 13.9.0
            self.日志('已进入金币任务!','进入方式:','resourceId')
        except BaseException as e:
            d.click(0.500, 0.966)#点击底部来赚钱
            self.日志('已进入金币任务!','进入方式:','click(0.5, 0.95)')
        finally:
            self.暂停(8) # 等待进入任务,秒,根据手机流畅度可修改启动需要等待时长
            
        d.swipe_ext("up", 0.6)# 上滑60%
        self.日志('滑动屏幕!','up:','60%')

        hh=int(time.strftime('%H'))
        mm=int(time.strftime('%M'))
        if hh==0 and mm<=20 and self.flag_sign==1:
            self.日志('即将进行签到!')
            try:
                self.flag_sign=0
                # self.sign_in()#签到
                self.签到()#跳过签到
            except:
                pass
            self.日志('签到已完成!')
        else:
            try:
                #关闭查看收益
                self.关闭查看收益()
            except:
                pass
                 
    
            
    def 关闭查看收益(self):
        '''关闭查看收益'''
        d = u2.connect(self.ip)
        

            
    def 签到(self):
        '''签到'''
        d = u2.connect(self.ip)
        self.暂停(8)
        self.识图点击('sign_in')
        self.识图点击('Watch_the_vedio_again')
        # self.暂停(self.ad_time)
        self.暂停(self.temp_ad_time)
        self.关闭广告()
        self.再看一个获金币()
        # self.暂停(self.ad_time)
        self.暂停(self.temp_ad_time)
        self.关闭广告()            
    
            
    def 识图点击(self,picture):
        '''识图'''
        d = u2.connect(self.ip)
        self.日志('即将开始识图点击!')
        
        def matchImg(imgsrc,imgobj,confidencevalue=0.5):#imgsrc=原始图像,imgobj=待查找的图片
            imsrc = ac.imread(imgsrc)
            imobj = ac.imread(imgobj)
            confidence=confidencevalue
            match_result = ac.find_template(imsrc,imobj,confidence)  # {'confidence': 0.5435812473297119, 'rectangle': ((394, 384), (394, 416), (450, 384), (450, 416)), 'result': (422.0, 400.0)}
            if match_result is not None:
                match_result['shape']=(imsrc.shape[1],imsrc.shape[0])#0为高,1为宽
                match_result['shape']=(imobj.shape[1],imobj.shape[0])#0为高,1为宽
                match_result['px']=(match_result['rectangle'][0][0]+imsrc.shape[1]/2)/imobj.shape[1],(match_result['rectangle'][0][1]+imsrc.shape[0]/2)/imobj.shape[0]
            return match_result
        
    
        
        self.暂停(3)
        try:
            # 截图
            p=d.screenshot()# 截图
            p.save('./image/screenshot.png')
            self.暂停(3)
            ret=matchImg('./image/{name}.png'.format(name=picture),'./image/screenshot.png')                  
            d.click(ret['px'][0],ret['px'][1])#
            
            坐标=(round(ret['px'][0],2),round(ret['px'][1],2))
            self.日志('{name}截图识别点击成功!'.format(name=picture),'描述:',坐标)
            #等待响应与广告时长等待
            self.temp_ad_time=45
        except BaseException as e:
            self.日志('{name}截图识别,异常!'.format(name=picture),'错误信息:',str(e))
            self.temp_ad_time=2
            
            
    def 关闭广告(self):
        d = u2.connect(self.ip)
        try:
            if self.temp_ad_time==2:
                self.日志('temp_ad_time==2!','无截图识别点击:','跳过广告!')
            else:
                d.xpath('//*[@resource-id="com.ss.android.ugc.aweme.lite:id/aa_"]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.ViewGroup[1]/android.view.ViewGroup[2]/android.widget.ImageView[1]').click()
            
                self.日志('已关闭广告!','关闭方式:','xpath')
        except BaseException as e:
            self.日志('广告关闭异常!','错误信息',str(e))
            d.click(0.92, 0.052)
            self.日志('尝试坐标关闭广告已完成!')
            self.暂停(1)#休眠1秒
        finally:
            self.日志('正在最后确认关闭广告!')
            # d.click(0.9, 0.05)#
            d.click(0.92, 0.052)
            self.日志('确认坐标关闭广告已完成!','关闭方式:','click(0.92, 0.052)')
            # self.abnormal_time=10
        
    
    def 再看一个获金币(self):
        self.识图点击('Watch_vedio_again')
    
    
    def 限时任务赚金币(self):
        d = u2.connect(self.ip)
        # d.swipe_ext("up", 0.6)# 上滑60%
        
        self.识图点击('task')
        self.暂停(self.temp_ad_time)
        self.关闭广告()
        self.再看一个获金币()
        self.暂停(self.temp_ad_time)
        self.关闭广告()
        
              

    def 开宝箱赚金币(self):
        d = u2.connect(self.ip)
        d.click(0.858, 0.918)
        self.识图点击('Watch_the_vedio_again')
        self.暂停(self.temp_ad_time)
        self.关闭广告()
        self.再看一个获金币()
        self.暂停(self.temp_ad_time)
        self.关闭广告()
        
        self.日志('已完成开宝箱赚金币!')
        self.暂停(3)
            
                
    def 随机重新选择(self,flag='start'):
        # 随机启动切换APP
        self.app=random.choice(self.app_lalel)
        hh=int(time.strftime('%H'))
        mm=int(time.strftime('%M'))
        if hh==0 and mm<=20:
            self.app='D'
        else:
            pass
        
        if self.app=='D':
            self.app='抖音极速版'
        if self.app=='K':
            self.app='快手极速版'  
        self.日志('已随机选择极速版应用!','APP:',self.app)

        if self.app == '快手极速版':
            self.重启快手极速版()
            self.日志('已重启快手极速版!')
            self.暂停(12)
        elif self.app == '抖音极速版' and flag=='restart':
            self.重启抖音极速版()
            self.日志('已重启抖音极速版!')
            self.暂停(12)
        elif self.app == '抖音极速版' and flag=='start':
            self.启动抖音极速版()
                
    def 重置任务(self):
        '''执行继续看视频且随机启动'''
        self.initial_time = time.time()#初始化记时时间
        self.i=0 #重新计数
        self.next_time=self.task_frequency-self.abnormal_time-self.ad_time# 初始化距离下一次任务时间为任务频率
        
        d = u2.connect(self.ip)
        d.swipe_ext("up", 0.26)# 上滑26%
        # d.swipe_ext("up", 0.8)# 上滑80%
        self.暂停(6)

        self.随机重新选择(flag='restart')
            
    
if __name__=="__main__":  
    mobile_phone=智能手机('192.168.3.145')
    mobile_phone.运行()
    # mobile_phone.限时任务赚金币()
    # mobile_phone.开宝箱赚金币()
    # mobile_phone.关闭广告()
    # mobile_phone.再看一个获金币()
    # mobile_phone.签到()
    # mobile_phone.开始任务()

四、运行效果

Python控制手机实现抖音极速版快手极速版自动刷金币_第1张图片

你可能感兴趣的:(Python,python,安卓,opencv)