一、目標場景
如今短視頻橫行的時代,以某短視頻為首的,背后依靠着強大的資金后盾,瘋狂地對平台用戶進行紅包轟炸。
與傳統的紅包不一樣,視頻紅包包含位置的不確定性、大小不確定性、元素 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 以上的時候,就認為當前視頻內一定包含紅包。
第三步,如果判斷當前視頻內包含互動紅包元素,就可以執行「搶紅包」的操作了。
首先,利用 Monitor 截取紅包出現那一刻的界面元素樹,依然可以看到紅包圖片元素不存在 ID 和 Text 屬性。
然后我首先想到是否可以利用上面的方式,通過局部圖片匹配去拿到紅包圖片的中心點坐標。
可是通過大量的測試發現,視頻中紅包圖片元素的大小「存在不確定性」,用 PS 截取的圖片不能適用於所有視頻。
最后,只能通過分析元素的層次結構,拿到存在元素 ID 的最近一級父類元素,然后再去得到紅包元素,進而得到「bound」屬性值。
拿到紅包圖片元素的 bound 屬性之后,就可以計算出紅包圖片元素的中心點坐標。
我們都知道一段視頻中,紅包出現的時間存在不確定性。
通過對紅包圖片出現前和出現后的元素樹進行對比,可以發現,當紅包出現的時候,紅包圖片元素「存在多個子元素」。
因此可以循環獲取 UI 元素樹,直到紅包元素存在子元素的時候,就退出循環。
通過點擊紅包元素的「中心點坐標」,就可以完成搶視頻紅包的最后操作。
四、結論
通過上面的操作,完成了搶普通視頻紅包的操作,循環操作就可以拿到應用內的所有的普通視頻紅包。
如果你此文你也有同感,如果你覺得此文對你有幫助,如果你對軟件測試、接口測試、自動化測試、面試經驗交流感興趣歡迎加入:
軟件測試技術群:695458161,群里發放的免費資料都是筆者十多年測試生涯的精華。還有同行大神一起交流技術哦。
作者:來自公眾號:軟測之家
出處:https://www.cnblogs.com/csmashang/p/12696600.html
歡迎轉載,但未經作者同意請保留此段聲明,並在文章頁面明顯位置給出原文鏈接。









