一、目标场景

如今短视频横行的时代,以某短视频为首的,背后依靠着强大的资金后盾,疯狂地对平台用户进行红包轰炸。

与传统的红包不一样,视频红包包含位置的不确定性、大小不确定性、元素 ID 的不确定性等......这些不确定性都会导致抢红包的操作变得异常的复杂。

本篇文章的目的是利用 Python 自动化实现「抢视频红包」这一骚操作。本文仅仅用于学习交流技术!请勿用于其他用途!

二、准备工作

在开始编写脚本之前,需要做如下准备

1、一部 Android 手机,并在 PC 端配置好 ADB 运行环境

2、Python 虚拟环境下安装自动化依赖库、图片对比依赖库

3、PS 或者其他图片编辑软件

# 自动化依赖
pip3 install pocoui # 图片对比依赖
pip3 install aircv

三、编写代码

第一步,我们需要借助 Airtest 驱动手机打开目标短视频 App。

# 目标应用的包名和LaunchActivity
self.package_name = 'com.**.weishi'
self.home_activity = 'com.**.oscar.module.splash.SplashActivity' # 回到主界面
home()
# stop_app(self.package_name) # 打开应用
start_my_app(self.package_name, self.home_activity)

第一次打开应用的时候,会弹出一个警告对话框。

这里利用「异步线程」去处理。

循环检测对话框元素是否存在,一旦出现,就模拟点击操作,关闭这个对话框。

def __handle_dialog(self):
"""
处理警告对话框
:return:
"""
count = 0
while count < self.wait_for_dialog_timeout:
tip_notice = self.poco('com.tencent.weishi:id/title_text', text=u'青少年保护功能提示')
try:
if tip_notice.exists():
# 关闭
print('出现警告对话框,关闭之。')
self.poco('com.tencent.weishi:id/close_btn').click()
break
else:
pass
except Exception as e:
print('产生异常了') time.sleep(1)
count += 1 # 异步处理
threading.Thread(target=self.__handle_dialog, name='thread1').start()

第二步,「判断」当前播放的视频是否是一个包含红包的视频。

通过对大量视频的观察,可以看出视频内包含两类红包,分别是普通视频红包、问答视频红包。

通过 Android SDK 自动的工具 Monitor 查看界面元素。

可惜的是,这个互动红包元素标识「元素ID不存在」,并且Text属性也为空,没法利用传统的方式来获取到。

我换一种方式来实现,利用「图片对比」技术来判断互动红包元素是否存在,进而判断视频是否是一个包含红包的视频。

利用「PS」把互动红包元素图片从屏幕截图中裁剪出来。

需要注意的是,由于这个元素形状不规则,这里只能裁剪一个规则的矩形区域,不能截取其他多余的区域,否则会导致图片比对会失败。

接着利用 adb 命令截取手机屏幕的图片,然后保存到本地。

def save_screenshot_to_pc(desc):
"""
获取屏幕截图
desc 截图保存路径
:return:
"""
exec_cmd('adb shell /system/bin/screencap -p /sdcard/screenshot.png')
exec_cmd('adb pull /sdcard/screenshot.png %s' % desc)

然后就可以利用「aircv」库,利用上面裁剪的图和屏幕截图进行比对,判断裁剪的互动红包元素是否能匹配到。

当匹配指数为 0.8 以上的时候,就认为当前视频内一定包含红包。

def find_image(source_path, part_path):
"""
匹配模板
:param source_path: 原图片
:param part_path: 待匹配的图片
:return:
"""
# 原始图像
source = ac.imread(source_path) # 待查找的部分
part = ac.imread(part_path) result_raw = ac.find_template(source, part) # 匹配图片中心点坐标
if result_raw and result_raw.get('confidence') >= 0.8:
center_position = result_raw.get('result')
print(result_raw)
else:
center_position = None
return center_position

第三步,如果判断当前视频内包含互动红包元素,就可以执行「抢红包」的操作了。

首先,利用 Monitor 截取红包出现那一刻的界面元素树,依然可以看到红包图片元素不存在 ID 和 Text 属性。

然后我首先想到是否可以利用上面的方式,通过局部图片匹配去拿到红包图片的中心点坐标。

可是通过大量的测试发现,视频中红包图片元素的大小「存在不确定性」,用 PS 截取的图片不能适用于所有视频。

最后,只能通过分析元素的层次结构,拿到存在元素 ID 的最近一级父类元素,然后再去得到红包元素,进而得到「bound」属性值。

vp = self.poco('com.tencent.weishi:id/hippy_container')
if vp.exists():
# 元素
try:
red_package_element = vp.children()[0].children()[0].children()[0].children()[0]
except Exception:
print('产生一个异常')
continue # 获取bound()属性
element_size = red_package_element.get_bounds()

拿到红包图片元素的 bound 属性之后,就可以计算出红包图片元素的中心点坐标。

def get_element_center_position(poco, bound):
"""
获取元素的中心点坐标
:return:
"""
# 获取手机屏幕的宽、高
screen_width = poco.get_screen_size()[0]
screen_height = poco.get_screen_size()[1] # 元素的中心点坐标
center_position = (bound[1] + bound[-1]) / 2 * screen_width, (
bound[0] + bound[2]) / 2 * screen_height return center_position

我们都知道一段视频中,红包出现的时间存在不确定性。

通过对红包图片出现前和出现后的元素树进行对比,可以发现,当红包出现的时候,红包图片元素「存在多个子元素」

因此可以循环获取 UI 元素树,直到红包元素存在子元素的时候,就退出循环。

# 一直等待红包元素出现,才执行点击操作
if len(red_package_element.children()) > 0:
print(center_position)
break
else:
# print('等待红包出现可以点击')
pass

通过点击红包元素的「中心点坐标」,就可以完成抢视频红包的最后操作。

# 获取到红包坐标之后,执行点击点击操作,直到抢到红包为止
exec_cmd('adb shell input tap %d %d' % (center_position[0], center_position[1]))

四、结论

通过上面的操作,完成了抢普通视频红包的操作,循环操作就可以拿到应用内的所有的普通视频红包。

如果你此文你也有同感,如果你觉得此文对你有帮助,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入:

软件测试技术群:695458161,群里发放的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

作者:来自公众号:软测之家
出处:https://www.cnblogs.com/csmashang/p/12696600.html
欢迎转载,但未经作者同意请保留此段声明,并在文章页面明显位置给出原文链接。

薅羊毛? 月入10万? | 这是自动化测试老司机的特长--Python自动化带你薅视频红包,一个都不放过!的更多相关文章

  1. [每日app二]月入60万多嘛?单词锁屏的潜力!

    抢了用户的时间,就是抢了用户的金钱! 单词锁屏,一个开发难度不太大,但仅仅360手机助手下载就是每周4万!拉风- 对于搞app的同学来说,搞个锁屏,还不是玩似的,但是要定位好,玩得好,那就有难度了.最 ...

  2. 年近30的Java程序员为了达到月入三万的目标,都做了哪些准备?

    1.我觉得像我这般年纪的(29岁),有相对扎实技术功底的(就不自谦了),对赚钱有着强烈欲望的程序员,应该定一个切实的小目标——五年内月入三万! 之所以要定这个目标,最主要的原因是老婆的批评刺痛了我—— ...

  3. [每日App一]QQ主题要逆天!轻轻松松月入30万!

    听从吾师秦刚(微信或QQ:1111884)酋长的建议,谋哥(微信viyi88)我开始新的征程,每日更新一篇干货文章(要坚持啊!否则被酋长鄙视了). 好了,废话不多说,今天我给大家揭秘一个你从来想也木有 ...

  4. 【月入41万】Mono For Android中使用百度地图SDK

    借助于Mono For Android技术,.Net开发者也可以使用自己熟悉的C#语言以及.Net来开发Android应用.由于Mono For Android把Android SDK中绝大部分类库都 ...

  5. 追踪神秘的成都Uber:月入2万元是现实还是传说

    4月6日,一个视频在网上疯转——在上海,明星佟大为驾驶着售价近100万元的特斯拉电动汽车,作为一名Uber的司机满市转悠着拉客. Uber——优步,如果你不知道这个词,那就OUT了.就是这样的一款软件 ...

  6. 远程办公《Remote》读书笔记:中国程序员在家上班月入过六万不是梦

    这不是一本新书,这是一本很值得中国程序员看的老书,所以我不是来做卖新书广告的:) 但它的确是一本好书,这本书在Amazon上3个business categories排第一.作者Jason Fried ...

  7. 快速注册Uber司机,兼职月入轻松过万

    Uber是世界领先的即时用车网络平台.当前部分中国城市,Uber司机只需每周完成70单,可获得7000元的激励制度回报司机,月收入近3万元.[加入条件]1. 车辆为本地牌照2. 车龄在5年以内3. 裸 ...

  8. 200万枚SPC空投来袭,这样的薅羊毛活动你确定不参加吗?

    在过去的2020年,币圈真的是很火爆,很多人在参与数字货币交易或DeFi挖矿中赚到了大钱.但是转眼到了2021年,DeFi进入了下半场,区块链市场也进入了新的阶段,那么区块链的下一个爆点是什么呢?很多 ...

  9. 亿财道APP赚钱攻略,亿财道,一个看广告年入36万的APP

            亿财道(http://etway.net/),一款看广告(传单)赚钱的软件,这是一项革新的广告产品,代替了以往的纸质传单.在商家节约成本的同时,还给阅读者佣金,推广也有相应提成比例. ...

随机推荐

  1. mysql实现读写分离

    MySQL读写分离概述 1.读写分离介绍 对于目前单机运行MySQL服务.会导致MySQL连接数过多.最终导致mysql的宕机.因此可以使用多台MySQL服务器一起承担压力.考虑到项目中读写比例的不一 ...

  2. JAVAEE学习day01

    1.二进制和十进制之间的转换: 十进制转换成二进制: 除2取余,从下往上吧余数拼接 二进制转换十进制: 1 0 1 0 8 4 2 1 把有1位的十进制求和 2.JAVA语言跨平台的原理 java程序 ...

  3. angular vue通过node启动项目局域网内关闭防火墙无法访问的解决办法

    先试 ng serve --host 0.0.0.0 不行再试 ng serve --host 0.0.0.0 --disable-host-check

  4. VLAN间的通信

    多臂路由/单臂路由 :实现不同VLAN间的通信 1.多臂路由 划分两个vlan,将主机划分到不同vlan中 配置ip地址,(注意:不同vlan在不同的网络下) 将交换机的两个端口分别与路由器连接,将这 ...

  5. 免费开源数字货币交易所——基于Java开发的比特币交易所 | BTC交易所 | ETH交易所 | 数字货币交易所

    本项目是基于Java开发的比特币交易所 | BTC交易所 | ETH交易所 | 数字货币交易所 | 交易平台 | 撮合交易引擎.本项目基于SpringCloud微服务开发,可用来搭建和二次开发数字货币 ...

  6. Asp.Net Core 中IdentityServer4 实战之角色授权详解

    一.前言 前几篇文章分享了IdentityServer4密码模式的基本授权及自定义授权等方式,最近由于改造一个网关服务,用到了IdentityServer4的授权,改造过程中发现比较适合基于Role角 ...

  7. Java 访问修饰符大全详解

    鉴于笔试面试总会遇到,决心仔细认真梳理一下: 1:涉及的关键字:public,default(表示缺省),protected,private,static,final,abstract. 2:关键字含 ...

  8. bugku论剑场web解题记录

    前言 国庆这几天感觉没什么好玩的地方,家又离的太远,弱鸡的我便决定刷刷题涨涨知识,于是就有了这篇文章.. 正文 写的不对的地方欢迎指正 web26 打开直接就是代码,这应该就是一道代码审计的题了 这里 ...

  9. 干货|漫画算法:LRU从实现到应用层层剖析(第一讲)

    今天为大家分享很出名的LRU算法,第一讲共包括4节. LRU概述 LRU使用 LRU实现 Redis近LRU概述 第一部分:LRU概述 LRU是Least Recently Used的缩写,译为最近最 ...

  10. 解决GPU显存未释放问题

    前言 今早我想用多块GPU测试模型,于是就用了PyTorch里的torch.nn.parallel.DistributedDataParallel来支持用多块GPU的同时使用(下面简称其为Dist). ...