如果你对软件测试、面试经验交流感兴趣欢迎加入软件测试技术群:695458161,群里发放的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

薅羊毛? 月入10万? Python自动化带你薅视频红包,一个都不放过!

上一篇 / 下一篇  2020-04-28 17:50:48 / 个人分类:Python

一、目标场景

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

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

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

二、准备工作

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

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

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

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

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

三、编写代码

如果你觉得此文对你有帮助,如果你对软件测试、面试经验感兴趣欢迎加入:
软件测试技术群:695458161,群里发放的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。
笔者来自公众号:软测之家

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

# 目标应用的包名和LaunchActivityself.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 =0whilecount < self.wait_for_dialog_timeout:
         tip_notice = self.poco('com.tencent.weishi:id/title_text', text=u'青少年保护功能提示')try:iftip_notice.exists():# 关闭print('出现警告对话框,关闭之。')
                self.poco('com.tencent.weishi:id/close_btn').click()breakelse:passexceptExceptionase:
            print('产生异常了')

         time.sleep(1)
         count +=1# 异步处理threading.Thread(target=self.__handle_dialog, name='thread1').start()

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

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

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

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

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

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

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

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

defsave_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 以上的时候,就认为当前视频内一定包含红包。

deffind_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)# 匹配图片中心点坐标ifresult_rawandresult_raw.get('confidence') >=0.8:
        center_position = result_raw.get('result')
        print(result_raw)else:
        center_position =Nonereturncenter_position

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

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

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

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

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

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

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


defget_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_heightreturncenter_position

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

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

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

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

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

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



TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

诸葛_

诸葛_

如果你对软件测试、面试经验交流感兴趣欢迎加入软件测试技术群:695458161,群里发放的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

日历

« 2020-07-06  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 7567
  • 日志数: 38
  • 建立时间: 2020-04-01
  • 更新时间: 2020-06-29

RSS订阅

Open Toolbar