我只发脚本,别的什么都不说了,版主别开枪!
因为很多人在问,这个不是什么高大上的玩意儿,发出来共同进步!我自己在用的,还只有这个稳定一点,别的什么其实都不好用。
需要自己截图,存在程序同目录下,就是通过图片判断,是否点击和点击位置。
主程序
- #python 3.6.4
- # encoding:utf-8
-
- #确保已连接好adb
- #1080 2280 分辨率,一加6测试通过
- #抖音版本20200618
-
- import os
- import cv2
- import sys
- import time
- import random
- from PIL import Image #pip install pillow
- import diannaoshuohua
- import zhaotu
-
- # 上传照片到电脑
- def screen():
- # 截图保存在手机上
- os.system('adb shell screencap -p /sdcard/screen.png')
- # 传到电脑上
- os.system('adb pull /sdcard/screen.png')
-
- # 截图,粉丝详情页图片
- def screen3():
- # 截图保存在手机上
- os.system('adb shell screencap -p /sdcard/screen3.png')
- # 传到电脑上
- os.system('adb pull /sdcard/screen3.png')
-
-
- #处理照片
- def getDistance():
- #读取图片
- image = Image.open('screen.png')
- #返回元组
- width = image.size[0]
- height = image.size[1]
- #print(height,width)
-
- for i in range(803,804):#遍历一个纵列
- for j in range(0,height):
- if image.getpixel((i,j))[:3] == (179, 38, 69):#如果找到符合位置的颜色点,则确定了按钮所在
- yield j #生成器。返回所有找到的纵坐标的值
-
- def jietu(mubiaotu):
- # 打开刚截取的全屏图
- img = Image.open(mubiaotu)
- # 定位到需要截取的地方
- img = img.crop((0, 200, 1080, 1400))
- # 截取成功并保存到本地
- img.save('screen3_jietu.png')
-
- def as_num(x):
- y = '{:.10f}'.format(x) # .10f 保留10位小数
- return y
-
- # 查找图片
- def findImg(target1,template2):
- #读取目标图片
- target = cv2.imread(target1)
- #读取模板图片
- template = cv2.imread(template2)
- #获得模板图片的高宽尺寸
- theight,twidth = template.shape[:2]
- #执行模板匹配,采用的匹配方式cv2.TM_SQDIFF_NORMED
- result = cv2.matchTemplate(target,template,cv2.TM_SQDIFF_NORMED)
- cv2.normalize(result,result, 0, 1, cv2.NORM_MINMAX, -1 )
- min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
- strmin_val = str(min_val)
- cv2.rectangle(target,min_loc,(min_loc[0]+twidth,min_loc[1]+theight),(0,0,225),2)
- print ("匹配最小值为:"+as_num(float(str(min_val))))
- print ('匹配最大值为:'+as_num(float(str(max_val))))
- r = int((image.getpixel((min_loc[0]+23,min_loc[1]+17)))[0])
- if (abs(float(as_num(float(str(max_val))))) >= 0.9) and r > 180:#如果找到符合位置的颜色点:
- print ('找到符合的图片')
- return True
- else:
- print('没有找到符合的图片')
- return False
-
-
- if __name__ == '__main__':#主函数开头
-
- i=0
- n=0
- sj = random.uniform(1,5)
-
-
- for _ in range(100):
- screen()
- print('截屏某用户的粉丝列表')
- xy = zhaotu.findImg2('s.png','screen.png')
- for d in xy:
- screen()
- time.sleep(sj)
- os.system('adb shell input tap {} {}'.format(d[0],d[1]))
- time.sleep(sj)
- screen3()#个人详情页截图
- time.sleep(sj)
- jietu('screen3.png')
- time.sleep(sj)
-
- if zhaotu.findImg1('nv.png','screen3_jietu.png'):
- xy = zhaotu.findImg1('nv.png','screen3_jietu.png')
- image = Image.open("screen3_jietu.png")#打开个人详情页截图
- r = int((image.getpixel((xy[0],xy[1])))[0])
- if (r > 180):
- print('找到一位女士,即将关注!')
- os.system('adb shell input tap 550 466')#点击关注按钮,暂用坐标,待完善
- time.sleep(sj)
- os.system('adb shell input keyevent 4')
- time.sleep(sj)
- i=i+1
- print('已关注了'+str(i)+'位女士')
- if i == 175:
- print('本次运行已关注198人,已退出运行!')
- diannaoshuohua.shuohua('本次已关注198人,即将退出!')
- os.system('adb shell input keyevent 26')#power事件。
- sys.exit()
- else:
- os.system('adb shell input keyevent 4') #点击后退按钮
- else:
- print('这不是女士,即将返回!')
- n=n+1
- os.system('adb shell input keyevent 4') #点击后退按钮
-
- #翻页滑动按钮
- os.system('adb shell input swipe 548 1500 540 225 511')
- time.sleep(random.uniform(0.4, 0.8))
- print('正在翻页。。。')
-
-
- #zhaotu.py 调用方法:findImg('目标图片地址','模板图片地址')
- #findImg2----多目标匹配,返回的是生成器结果,需要for遍历出单个结果
- #findImg1----单目标匹配,返回图片所在位置的中心点坐标值
-
- import cv2
- import numpy
- from PIL import Image
-
- def as_num(x):
- y = '{:.10f}'.format(x) # .10f 保留10位小数
- return y
-
- def findImg2(target,template):#opencv模板匹配----多目标匹配
- #读取目标图片
- target = cv2.imread(target)
- #读取模板图片
- template = cv2.imread(template)
- #获得模板图片的高宽尺寸
- theight, twidth = template.shape[:2]
- #执行模板匹配,采用的匹配方式cv2.TM_SQDIFF_NORMED
- print(theight,twidth)
- result = cv2.matchTemplate(target,template,cv2.TM_SQDIFF_NORMED) #CV_TM_SQDIFF_NORMED
-
- min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
-
- cv2.rectangle(target,min_loc,(min_loc[0]+twidth,min_loc[1]+theight),(0,0,225),2)
-
- strmin_val = str(min_val)
- #初始化位置参数
- temp_loc = min_loc
- other_loc = min_loc
- numOfloc = 1
- #第一次筛选----规定匹配阈值,将满足阈值的从result中提取出来
- #对于cv2.TM_SQDIFF及cv2.TM_SQDIFF_NORMED方法设置匹配阈值为0.01
- threshold = 0.01 #这个值从0.01到0.05之间
- loc = numpy.where(result<threshold)
- if loc:
- #遍历提取出来的位置
- for other_loc in zip(*loc[::-1]):
- #print(other_loc[0],other_loc[1])
- yield other_loc
- else:
- return false
-
-
- # 查找设定的图片是否包含在另一张图片里
- def findImg1(target1,template2):#传入要查找的图片地址和名称,1为大图,2为小图,从大图里查找小图。
- #读取目标图片
- target = cv2.imread(target1)
- theight1,twidth1 = target.shape[:2]
- #读取模板图片
- template = cv2.imread(template2)
- #获得模板图片的高宽尺寸
- theight,twidth = template.shape[:2]
- #执行模板匹配,采用的匹配方式cv2.TM_SQDIFF_NORMED
- result = cv2.matchTemplate(target,template,cv2.TM_SQDIFF_NORMED)
- #归一化处理
- cv2.normalize(result,result, 0, 1, cv2.NORM_MINMAX, -1 )
- #寻找矩阵(一维数组当做向量,用Mat定义)中的最大值和最小值的匹配结果及其位置
- min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
- #对于cv2.TM_SQDIFF及cv2.TM_SQDIFF_NORMED方法min_val越趋近与0匹配度越好,匹配位置取min_loc
- #对于其他方法max_val越趋近于1匹配度越好,匹配位置取max_loc
- strmin_val = str(min_val)
- #min_loc:矩形定点
- cv2.rectangle(target,min_loc,(min_loc[0]+twidth,min_loc[1]+theight),(0,0,225),2)
- #显示结果,并将匹配值显示在标题栏上
- print ("匹配最小值为:"+as_num(float(str(min_val))))
- print ('匹配最大值为:'+as_num(float(str(max_val))))
-
- if (abs(float(as_num(float(str(max_val))))) >= 0.9):# 如果找到
- print ('找到符合的图片')
- return min_loc[0]+twidth1/2,min_loc[1]+theight1/2
- else:
- print('没有找到符合的图片')
- return False
复制代码
|