[TOC]
0x00 前言简述 描述: 最近在研究app自动化测试相关资料,正好最近喜欢上了耍快手以及抖音、头条,我突发奇想能否自动的刷视频而不需要我们动手指,我想懒人就是这样炼成的, 我作为一名运开,想到我们可以使用adb工具加上PowerShell或者Python以及其他编程或者脚本语言,操作我们手机设备从而快速实现自动刷抖音快速看视频,我尝试在百度中找寻关键字adb控制操作手机,发现其脚本实现的方式大约为三种类型,遂将其结合当前app进行一系列的开发实践,汇总了此篇文章,偷偷的告诉你哟,可以赚米的😳,废话不多说直接上文章说明以及脚本。
weiyigeek.top-自动化测试赚米图
温馨提示: 想要知道如何安装以及使用Android设备adb调试工具的朋友,可以关注【全栈工程师修炼指南】公众号回复【10005】或者【adb】查看相关文章。
温馨提示: 为尊重作者劳动成果,防止伸手党转发,此篇文章为收费文章,希望各位看友理解支持,购买此篇文章的朋友将会在文章末尾获取到,本章相关实践脚本代码的下载链接。
0x01 使用 adb 调试工具自动刷快速看视频 滑动屏幕看视频示例 描述: 此处就比较简单了只需要input的swipe参数即可实现屏幕的滑动浏览,基本适合全部刷视频得奖励的的app。
代码&运行:
[TOC]
0x00 前言简述 描述: 最近在研究app自动化测试相关资料,正好最近喜欢上了耍快手以及抖音、头条,我突发奇想能否自动的刷视频而不需要我们动手指,我想懒人就是这样炼成的, 我作为一名运开,想到我们可以使用adb工具加上PowerShell或者Python以及其他编程或者脚本语言,操作我们手机设备从而快速实现自动刷抖音快速看视频,我尝试在百度中找寻关键字adb控制操作手机,发现其脚本实现的方式大约为三种类型,遂将其结合当前app进行一系列的开发实践,汇总了此篇文章,偷偷的告诉你哟,可以赚米的😳,废话不多说直接上文章说明以及脚本。
weiyigeek.top-自动化测试赚米图
温馨提示: 想要知道如何安装以及使用Android设备adb调试工具的朋友,可以关注【全栈工程师修炼指南】公众号回复【10005】或者【adb】查看相关文章。
温馨提示: 为尊重作者劳动成果,防止伸手党转发,此篇文章为收费文章,希望各位看友理解支持,购买此篇文章的朋友将会在文章末尾获取到,本章相关实践脚本代码的下载链接。
0x01 使用 adb 调试工具自动刷快速看视频 滑动屏幕看视频示例 描述: 此处就比较简单了只需要input的swipe参数即可实现屏幕的滑动浏览,基本适合全部刷视频得奖励的的app。
代码&运行:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 function screen_swipe($x1 =480 ,$y1 =1080 ,$x2 =480 ,$y2 =720 ,$duration =100 ){ $ScreenSize =(.\adb shell wm size) 1 ..1000 | ForEach-Object { $delay_time = Get-Random -Minimum 3 -Maximum 5 Write-Host -ForegroundColor green "第 $_ 次 swipe,屏幕像素尺寸 $ScreenSize ,延时 $delay_time s" .\adb.exe shell input swipe $x1 $y1 $x2 $y2 $duration ; sleep($delay_time ) } } screen_swipe screen_swipe(100 ,300 ,100 ,500 ,100 )
weiyigeek.top-屏幕向上滑动图
点击广告得金币示例 描述: 此处使用input的tap命令进行模拟屏幕的点击,最简单的方式就是获取屏幕要点击的坐标,通常有三种方式获取要点击的左边:
第一种:手动获取坐标,在开发者选项中-> 输入 开启【屏幕指针选项】,即可实时看到点击的位置坐标等相关参数。
第二种:利用截图与关键图标对比获取要点击的坐标,此处可以使用python中第三方aircv
模块进行实现。
第三种: 同样是利用截图利用ocr包进行图片文字识别并给出坐标位置,此处可以使用Python中第三方easyocr
模块进行实现。
第一种,手动获取记录定位点击 此处我们先实现最简单的第一种,即手动获取要点击的坐标,从而点击指定位置,废话不多上代码。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 $ScreenSize =(.\adb shell wm size) function screen_tap($x1 =480,$y1 =1080){ Write-Host -ForegroundColor green "点击屏幕( $x1 , $y1 ) 坐标" .\adb.exe shell input tap $x1 $y1 sleep(1) } function kuaishou_adver_box($name , $delay_time =60) { 1..1000 | ForEach-Object { Write-Host -ForegroundColor green "第 $_ 次,正在观看【kuaishou】宝箱广告 $delay_time s" if ($name -like "饭点补贴" ) { screen_tap(306,2061) sleep($delay_time ) screen_tap(539,192) } elseif ($name -like "日常广告任务" ) { screen_tap(942,345) sleep($delay_time ) screen_tap(539,192) } else { .\adb shell input keyevent KEYCODE_BACK } } } function kuaishou_adver_box($delay_time =60) { 1..1000 | ForEach-Object { Write-Host -ForegroundColor green "第 $_ 次,正在观看【kuaishoujs】宝箱广告 $delay_time s" screen_tap(943,915) sleep($delay_time ) screen_tap(539,192) } }
执行结果:1 2 3 4 5 6 7 PS D:\Tools\platform-tools_r34.0.1-windows> kuaishou_adver_box(28) 第 1 次,正在观看【kuaishou】宝箱广告 28 s 点击屏幕( 306 2061 , 1080 ) 坐标 点击屏幕( 539 192 , 1080 ) 坐标 第 2 次,正在观看【kuaishou】宝箱广告 28 s 点击屏幕( 306 2061 , 1080 ) 坐标 点击屏幕( 539 192 , 1080 ) 坐标
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 function common_adver_box($appname ="toutiao" ,$x1 =943 ,$y1 =209 ,$x2 =652 ,$y2 =1272 ,$delay_time =30 ) { 1 ..1000 | ForEach-Object { Write-Host -ForegroundColor green "第 $_ 次,正在观看【$appname 】宝箱广告 $delay_time s" screen_tap($x1 ,$y1 ) screen_tap($x2 ,$y2 ) sleep($delay_time ) } } common_adver_box() common_adver_box("toutiao" ,943 ,209 ,652 ,1272 ,30 ) common_adver_box -appname toutiao -x1 967 -y1 161 -x2 580 -y2 1362 -delay_time 30
第二种,利用截图与关键图标对比获取要点击的坐标
使用第一种方法缺点在于如果屏幕滑动变化又需要重新采集点击位置的坐标,那有木有什么办法当屏幕页面发生变化后还可能根据图片获取相应的点击目标,答案就是使用我们第二种方法,操作流程以及代码如下所示:
Step 1.首先,我们需要手动截屏然后将需要点击的位置图标,截取出来并存放在adb.exe的同级”./img/“目录中, 非常注意截图标时其比例不能缩小和放大,即在100%的比例中截取没否则将无法进行匹配对比。
Step 2.然后,将截取的图标路径填入到代码KUAISHOU_JS
变量中(此处只是一个简单的思路),通常情况下我们可以使用python遍历”./img/“目录中1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 # -*- coding:utf-8 -*- ################################################################################ ## Desc: 利用adb+aircv模块实现自动看广告视频得金币脚本 ## Author: WeiyiGeek ## Index: weiyigeek.top ## Blog: blog.weiyigeek.top ## 微信公众号: 全栈工程师修炼指南 ################################################################################# import aircv as ac import os import time # 此处是作者adb工具存放目录 ADB_DIR=r'D:/Tools/platform-tools_r34.0.1-windows' # 此处是图片中图标部分路径 KUAISHOU_JS=["./img/gold_task5000.png","./img/gold_close.png","./img/gold_nextwatching.png","./img/gold_continuewatching.png"] # 函数 adb_screen # 实现手机截屏并保存指定文件到指定目录之中。 def adb_screen(src_img,dest_img): print("正在截取屏幕 {},保存到 {}".format(src_img,dest_img)) try: os.system(".\\adb shell /system/bin/screencap -p " + src_img) time.sleep(1) os.system(".\\adb pull " + src_img + " " + dest_img) return None except OSError as err: print(err) return err # 函数 img_screen_coord # 实现手机截屏图片与图标对比获取 def img_screen_coord(src_img, dest_mini_img, reli=0.8): ac_src_img = ac.imread(src_img) ac_split_img = ac.imread(dest_mini_img) try: result=ac.find_template(ac_src_img, ac_split_img,reli) if( result != None ): return result['result'][0],result['result'][1] else: return None,None except OSError as err: print(err) return None,None # 函数 adb_screen # 实现点击手机截屏指定位置 def adb_tap(x, y, delayed=1): print("正在点击屏幕 {},{} 坐标".format(x,y)) os.system(".\\adb shell input tap " + str(x) + " " + str(y)) time.sleep(delayed) # 函数 img_check # 循环检测当前页面内容 def img_check(src_img, delayed=1): adb_screen("/sdcard/pic/screencap.png",src_img) for i in KUAISHOU_JS: x,y = img_screen_coord("./img/screencap.png",i) print(i,x,y) if x == None or y == None: continue else: adb_tap(x,y,delayed) if __name__ == '__main__': os.chdir(ADB_DIR) while True: img_check("./img/screencap.png") time.sleep(30) img_check("./img/screencap.png") img_check("./img/screencap.png") # 脚本执行 python main.py
weiyigeek.top-代码执行结果图
第三种,利用ocr图像识别获取需要点击的位置 描述: 第二种方法虽然可以解决当屏幕位置发生改变的,但是需要我们手动收集需要点击的图标截图,比较费时费力,所以此处作者是推荐使用第三种方式,那便是ocr识别文字从而获取要点击的目标。
此处,作者使用的是easyocr第三方模块包,进行ocr识别,安装使用教程可以查看作者的博客或者【全栈修炼公众号】回复【easyocr】,即可获取实践文章( https://blog.weiyigeek.top/2022/5-8-658.html )
Step 1.此处,先通过命令行导入easyocr模块并识别上面手机截图中的文章及其位置,使用reader.readtext方法便可读取图片中的文字信息,例如1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 $ python >>> from pprint import pprint >>> import easyocr >>> reader = easyocr.Reader(['ch_sim' ,'en' ]) CUDA not available - defaulting to CPU. Note: This module is much faster with a GPU. >>> result = reader.readtext('screencap.png' ) >>> pprint(result) [ ([[890, 139], [1048, 139], [1048, 189], [890, 189]], '限时奖励' , 0.9851478338241577), ([[305, 221], [691, 221], [691, 285], [305, 285]], '周周赚15万金而' , 0.23285558503922457), ..... '错过饭点也能领' , 0.9621742131471891), ([[359, 687], [530, 687], [530, 740], [359, 740]], '点击立得!' , 0.9752904211938732), ([[69, 845], [455, 845], [455, 907], [69, 907]], '领金币购签到奖励' , 0.5052843723810563), ([[517, 855], [569, 855], [569, 895], [517, 895]], '50' , 0.9999767350188884), ([[856, 882], [974, 882], [974, 930], [856, 930]], '立即领' , 0.993126815531403), ..... ([[928, 2074], [1008, 2074], [1008, 2146], [928, 2146]], '我' , 0.9930032522348142)]
Step 2.下述示例代码中通过cv2、pandas、easyocr等扩展模块包(若你机器上没有请 pip3 install 模块包名称
进行安装)将图片中识别出的文字信息进行标注。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 import osimport timeimport pandas as pdimport easyocrimport cv2ADB_DIR=r'D:/Tools/platform-tools_r34.0.1-windows' def adb_screen (src_img, dest_img) : """ 函数:adb_screen 说明:实现手机截屏并保存指定文件到指定目录之中。 参数:src_img 截屏图片,dest_img 保存图片 """ print("正在截取屏幕 {},保存到 {}" .format(src_img,dest_img)) try : os.system(".\\adb shell /system/bin/screencap -p " + src_img) time.sleep(1 ) os.system(".\\adb pull " + src_img + " " + dest_img) return None except OSError as err: print(err) return err def img_readtext (src_img) : start_time = time.time() try : ocr_result = reader.readtext(image=src_img) print('cpu need time' , time.time() - start_time, 's' ) return ocr_result except OSError as err: print(err) return None def img_text_storage (ocr_result, csv_file='./data/ocr.csv' ) : df = pd.DataFrame(columns=['x1' , 'y1' , 'x2' , 'y2' , 'text' , 'proba' ]) for i, item in enumerate(ocr_result): ((x1, y1), _, (x2, y2), _), text, prob = item df.loc[i] = [x1, y1, x2, y2, text, prob] df.to_csv(csv_file) def img_tags (src_img,dest_img,csv_file) : info = pd.read_csv(csv_file, index_col=1 ) img = cv2.imread(src_img) for x1, y1, x2, y2, _, _ in info.values: cv2.rectangle(img, (x1,y1), (x2,y2),color=(0 , 0 , 255 ), thickness=2 ) cv2.namedWindow('rect' , cv2.WINDOW_NORMAL) cv2.imshow('rect' , img) cv2.waitKey(0 ) cv2.destroyAllWindows() if __name__ == '__main__' : os.chdir(ADB_DIR) reader = easyocr.Reader(['ch_sim' , 'en' ], gpu=False ) src_img="./img/screencap.png" csv_file="./data/ocr.csv" adb_screen("/sdcard/pic/screencap.png" ,src_img) result = img_readtext(src_img) img_text_storage(result,csv_file) img_tags(src_img,"./img/screencap_tags.png" ,csv_file)
执行结果:1 2 3 4 5 python .\setup.py Using CPU. Note: This module is much faster with a GPU. 正在截取屏幕 /sdcard/pic/screencap.png,保存到 ./img/screencap.png /sdcard/pic/screencap.png: 1 file pulled, 0 skipped. 35.8 MB/s (1575789 bytes in 0.042s) cpu need time 9.657010555267334 s
weiyigeek.top-图