我只发Python脚本,别的什么都不说了!
因为很多人在问,这个不是什么高大上的玩意儿,发出来共同进步!我自己在用的,还只有这个稳定一点,别的什么其实都不好用。
需要自己截图,存在程序同目录下,就是通过图片判断,是否点击和点击位置。
Python源码:
""" 当然在学习Python的道路上肯定会困难,没有好的学习资料,怎么去学习呢? 学习Python中有不明白推荐加入交流Q群号:928946953 群里有志同道合的小伙伴,互帮互助, 群里有不错的视频学习教程和PDF! 还有大牛解答! """ #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
有同学问写脚本难不难学,我一直没回复,想等个时间用最简单明了的方式说明一下。
拿写各种挂机脚本来说,其实非常简单。如果有人说难,那就是准备忽悠你。
挂机脚本,用一句话说明白:让程序去驱动手机,模拟人的动作,操作手机执行一定动作。
人有视觉,会思考判断,知道下一步该干什么。而程序脚本一开始它是不知道的。所以你得告诉它。它呢,听不懂人话,所以你得用程序语言来告诉它。
我们知道语言,有单词和语法两个重要的东西,掌握了这两个,你就会说人话。比如“天”是单词,“我抬头看了看天”是语法句式。“我抬头看了看天,发现天快要下雨了,我决定回家拿把伞”,这里就有思考和判断,可以让一个人不再是个傻。
所有的脚本编程语言,不管python,还是autojs,他们也都有自己的单词和语法两个东西。但是单词和语法总量,就那么几个,花两三天时间就能浏览完,并稍加理解,如果记不住,到时用的时候查百度查文档就行,这不是闭卷考试,你随便翻书。只要两三天时间,你以后就知道该怎么翻书偷看了。
接下来,你就会写挂机脚本了,比如你要刷抖音粉丝。
当你想到你可以去关注一个人的粉丝列表下所有的人,这样就有不少人也许会回关你。这个就是一开始的程序设计思路。这本身跟程序无关。
那么,你要写的脚本就是,先到一个抖音用户的粉丝列表页,这个页面有什么特征标识,你眼睛看得到,程序不知道啊,它只能通过页面上有的东西来判断,比如页面上有什么图形(这个叫找图识图,我的python脚本就是用的这种方式),或者页面有什么元素,或者有什么文字之类的(autojs提供这种功能)。
当确定了一个粉丝列表页,接下来就该去点击每个“关注”按钮了。一页有10个“关注”按钮,程序就得点10次,你就得用语法告诉程序,让它按照你的设计来执行动作。
点完一个按钮之后,为了防止抖音察觉有机器人在快速圈粉,你得装作人类,点完一个按钮要稍微停顿一下,这时你就可以用一个单词,比如sleep(1000),这个表示程序执行到这里,暂停1000毫秒。
再说一遍,掌握这些单词和语法,两三天时间就够了。
你不愿意学,几年,十几年在原地打转,那谁也没办法救你。
问python脚本的同学,我那个脚本需要你在本地配置好python环境。
截图是截你要查找的标识图片,或者你要点击的按钮图片。如果不懂python那肯定有点蒙圈。
这个没时间教了,有兴趣自己查一下,不难的,一天把的事。