
作者:星安果
來源:AirPython
前幾天,有一個(gè)小姐姐私聊我,說她每次打開微信,界面上密密麻麻的紅點(diǎn)提示讓她很惆悵,每一條消息她都要一條條去點(diǎn)擊,太費(fèi)時(shí)間且焦慮了
本篇文章將以之前聊過的python的UiAutomator2 編寫自動(dòng)化腳本,來幫小姐姐解決這個(gè)問題
準(zhǔn)備
在開始實(shí)戰(zhàn)之前,需要做如下準(zhǔn)備:
1、在 PC 端配置 Android 開發(fā)環(huán)境
2、安裝依賴庫及應(yīng)用
其中:
uiautomator2 負(fù)責(zé)自動(dòng)化;weditor 負(fù)責(zé)連接設(shè)備,查看應(yīng)用的界面元素
# 安裝依賴 pip3 install -U uiautomator2 # 如果需要截屏,需要安裝pillow pip3 install pillow # 安裝weditor,實(shí)時(shí)查看 App 的界面元素信息 pip3 install -U weditor
3、在手機(jī)上安裝 atx-agent 應(yīng)用
# 安裝apk服務(wù)到手機(jī)上 python -m uiautomator2 init
實(shí)戰(zhàn)
在實(shí)戰(zhàn)之前,在命令行輸入 weditor命令,瀏覽器會(huì)自動(dòng)打開設(shè)備管理頁面
查看手機(jī)的 ip 地址,通過 ip 地址 連接設(shè)備后,界面會(huì)展示當(dāng)前設(shè)備界面的元素信息
1、打開微信 App
在局域網(wǎng)下通過 IP 地址連接設(shè)備,然后通過微信 App 的包名打開應(yīng)用
import uiautomator2 as u2 # 微信App的包名 PACKAGE_NAME = 'com.tencent.mm' # 連接設(shè)備 self.device = u2.connect('192.168.0.101') # 獲取屏幕的寬、高度 self.width, self.height = self.device.window_size() # 利用應(yīng)用包名打開App self.device.app_start(PACKAGE_NAME, stop=True)
2、等待主頁加載完成
由于上面冷啟動(dòng) App 比較耗時(shí),這里需要進(jìn)行等待主頁的頁面元素加載完成
利用 WEditor 定位獲取底部 Tab 的元素 ID,然后利用「 ID + 文本內(nèi)容 」定位到 Tab 控件,通過設(shè)置一個(gè)最大超時(shí)時(shí)間,一直等待查詢控件成功為止
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='發(fā)現(xiàn)').wait(timeout=20) self.device(resourceId='com.tencent.mm:id/cns', text='發(fā)現(xiàn)').wait(timeout=20) print('首頁加載完成')
3、判斷是否存在未處理消息
和上面一樣,使用 WEditor 獲取頂部 Tab 未讀消息控件的文本內(nèi)容
如果文本內(nèi)容不為空,那么代表存在未處理的消息;否則,直接退出程序即可
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、查找未處理消息進(jìn)行處理
在當(dāng)前界面查找消息列表,篩選出頭像右上角包含數(shù)字的控件
如果查找的元素不為空,并且文本內(nèi)容為整形且大于 0,則模擬執(zhí)行一次點(diǎn)擊操作,然后返回到主頁面
# 未處理消息控件 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、查找與定位優(yōu)化
有 2 種方式去查找定位所有未讀的消息,分別是:
這里更推薦后者,因?yàn)榈诙N方式更加穩(wěn)定精確,而且支持循環(huán)定位查找
我們獲取到底部 Tab 控件的中心點(diǎn)坐標(biāo),使用 double_click() 指定兩次點(diǎn)擊的時(shí)長為 0.05s,模擬快速點(diǎn)擊兩下
def click_twice_quickly(device, element): """ 快讀點(diǎn)擊兩下 :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、循環(huán)操作
只需要循環(huán)判斷是否存在未處理的消息,如果存在,就快速點(diǎn)擊底部 Tab 定位到未讀的消息項(xiàng)進(jìn)行一次閱讀操作,直到不存在未處理的消息為止
while True: # 存在未讀消息 if self.__has_unread_msg(): # 連續(xù)點(diǎn)擊兩下,快速定位 click_twice_quickly(self.device, element) # 處理未讀消息 pass # 沒有未讀消息 else: logger.debug('沒有可讀的消息了,退出!') break
最后
通過上面的實(shí)例,我們處理了首頁消息的所有未讀消息;至于通訊錄、朋友圈、個(gè)人消息的提示,可以按同樣的方式去處理
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10