首頁 > 軟體

我用幾行Python自動化指令碼完美解決掉了小姐姐的微信焦慮感

2021-03-19 22:00:26

來源:AirPython

作者:星安果

一、場景

前幾天,有一個小姐姐私聊我,說她每次開啟微信,介面上密密麻麻的紅點提示讓她很惆悵,每一條訊息她都要一條條去點選,太費時間且焦慮了

本篇文章將以之前聊過的 UiAutomator2 編寫自動化指令碼,來幫小姐姐解決這個問題

二、準備

在開始實戰之前,需要做如下準備:

1、在 PC 端配置 Android 開發環境

2、安裝依賴庫及應用

其中:

uiautomator2 負責自動化;weditor 負責連線裝置,檢視應用的介面元素

# 安裝依賴pip3 install -U uiautomator2# 如果需要截圖,需要安裝pillowpip3 install pillow# 安裝weditor,實時檢視 App 的介面元素資訊pip3 install -U weditor

3、在手機上安裝 atx-agent 應用

# 安裝apk服務到手機上python -m uiautomator2 init

三、實戰一下

在實戰之前,在命令列輸入 weditor命令,瀏覽器會自動開啟裝置管理頁面

檢視手機的 ip 地址,通過 ip 地址 連線裝置後,介面會展示當前裝置介面的元素資訊

1、開啟微信 App

在區域網下通過 IP 地址連線裝置,然後通過微信 App 的包名開啟應用

import uiautomator2 as u2# 微信App的包名PACKAGE_NAME = 'com.tencent.mm'# 連線裝置self.device = u2.connect('192.168.0.101')# 獲取螢幕的寬、高度self.width, self.height = self.device.window_size()# 利用應用包名開啟Appself.device.app_start(PACKAGE_NAME, stop=True)

2、等待主頁載入完成

由於上面冷啟動 App 比較耗時,這裡需要進行等待主頁的頁面元素載入完成

利用 WEditor 定位獲取底部 Tab 的元素 ID,然後利用「 ID + 文字內容 」定位到 Tab 控制項,通過設定一個最大超時時間,一直等待查詢控制項成功為止

def __wait_home_appear(self):"""等待主頁載入完成:return:"""self.device(resourceId='com.tencent.mm:id/cns', text='微信').wait(timeout=20)self.device(resourceId='com.tencent.mm:id/cns', text='通訊錄').wait(timeout=20)self.device(resourceId='com.tencent.mm:id/cns', text='發現').wait(timeout=20)self.device(resourceId='com.tencent.mm:id/cns', text='發現').wait(timeout=20)print('首頁載入完成')

3、判斷是否存在未處理訊息

和上面一樣,使用 WEditor 獲取頂部 Tab 未讀訊息控制項的文字內容

如果文字內容不為空,那麼代表存在未處理的訊息;否則,直接退出程式即可

def __has_unread_msg(self):"""是否有未讀的訊息:return:"""try:number_unread_msg = self.device(resourceId='com.tencent.mm:id/gik')return

number_unread_msg.get_text() != ""except Exception:return False

4、查詢未處理訊息進行處理

在當前介面查詢訊息列表,篩選出頭像右上角包含數字的控制項

如果查詢的元素不為空,並且文字內容為整形且大於 0,則模擬執行一次點選操作,然後返回到主頁面

# 未處理訊息控制項element = self.device(resourceId='com.tencent.mm:id/ga3', instance=0)if element.exists and self.__is_number(element.get_text()):# 存在未處理的訊息element.click()if not self.__is_home_page():# 返回到主頁面self.device.press('back')else:# 不存在未處理的訊息pass

5、查詢與定位優化

有 2 種方式去查詢定位所有未讀的訊息,分別是:

上下滑動,去迴圈查詢當前介面快速點選底部 Tab 兩下,直接跳轉到未處理的訊息項這裡更推薦後者,因為第二種方式更加穩定精確,而且支援迴圈定位查詢

我們獲取到底部 Tab 控制項的中心點座標,使用 double_click() 指定兩次點選的時長為 0.05s,模擬快速點選兩下

def click_twice_quickly(device, element):"""快讀點選兩下:param device::param id: 控制項ID:return:"""bounds = element.bounds()center_x, center_y = ((bounds[2] + bounds[0]) / 2, ((bounds[3] + bounds[1]) / 2))print(center_x,center_y)device.double_click(center_x, center_y, 0.05)

6、迴圈操作

只需要迴圈判斷是否存在未處理的訊息,如果存在,就快速點選底部 Tab 定位到未讀的訊息項進行一次閱讀操作,直到不存在未處理的訊息為止

while True:# 存在未讀訊息if self.__has_unread_msg():# 連續點選兩下,快速定位click_twice_quickly(self.device, element)# 處理未讀訊息pass# 沒有未讀訊息else:logger.debug('沒有可讀的訊息了,退出!')break

四.最後

通過上面的例項,我們處理了首頁訊息的所有未讀訊息;至於通訊錄、朋友圈、個人訊息的提示,可以按同樣的方式去處理。


IT145.com E-mail:sddin#qq.com