https://blog.csdn.net/FG24151110876/article/details/103867863
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.开始任务()