薅羊毛? 月入10萬? | 這是自動化測試老司機的特長--Python自動化帶你薅視頻紅包,一個都不放過!


一、目標場景

如今短視頻橫行的時代,以某短視頻為首的,背后依靠着強大的資金后盾,瘋狂地對平台用戶進行紅包轟炸。

與傳統的紅包不一樣,視頻紅包包含位置的不確定性、大小不確定性、元素 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
歡迎轉載,但未經作者同意請保留此段聲明,並在文章頁面明顯位置給出原文鏈接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM