透過標籤清理微信好友:Python自動化指令碼解析

左诗右码發表於2024-12-02

微信已經成為我們日常生活中不可或缺的社交工具。隨著使用時間的增長,我們的微信好友列表可能會變得越來越臃腫。

在上一篇文章中,我寫了一個自動根據使用者狀態(好友將我們刪除了還是拉黑了)將使用者打上不同標籤的工具。那麼,已經將使用者打好了標籤之後,我們就可以根據指定的標籤名來直接刪除好友了

在本文中,我將逐步分析這個用 Python 編寫的自動化指令碼,它可以透過標籤批次清理微信好友。該指令碼使用了 uiautomator2 庫,這是一個強大的Android UI 自動化工具,廣泛用於 Android 裝置的自動化操作。本指令碼就是透過模擬使用者的點選、滑動等操作,實現自動化清理指定標籤下的微信好友。

環境準備

  1. 安裝 Python 3.x
  2. 安裝 uiautomator2 庫:pip install uiautomator2
  3. 準備一臺 Android 裝置,並開啟開發者模式
  4. 確保裝置與電腦在同一網路環境下

使用步驟

  1. 首先給要清理的好友打上統一的標籤(這點也可以直接執行上文我分享的指令碼,可以自動化打標籤)
  2. 然後在指令碼中設定指令碼名稱,執行指令碼。

以下是對程式碼的逐行分析,希望幫助大家更好地理解指令碼的實現過程。

程式碼分析

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
透過標籤清理微信好友
"""
import time
import uiautomator2 as u2

說明:

  • #!/usr/bin/env python3 是指令碼的設定,告訴作業系統用 Python3 來執行該指令碼。
  • # -*- coding: utf-8 -*- 用於指定檔案的編碼格式為UTF-8,避免中文字元出現亂碼。
  • 匯入了 time 模組,用於實現延時操作。
  • uiautomator2 是一個用於控制 Android 裝置 UI 的 Python 庫,本文指令碼依賴它來執行自動化任務。

類定義

class WXClearFriendByTag:
    """
    透過標籤清理微信好友
    """
    def __init__(self, tag_name: str, max_times_tag: int = 5, max_times_friend: int = 5):
        self.d = u2.connect()  # 連線裝置
        self.clear_tag_name = tag_name  # 需要被清理好友的標籤名
        self.max_times_tag = max_times_tag  # 查詢指定標籤的最大迴圈次數
        self.max_times_friend = max_times_friend  # 清理好友的最大迴圈次數

說明:

  • WXClearFriendByTag 類的作用是透過標籤清理微信中的好友。初始化時,我們傳入標籤名(tag_name),以及查詢標籤和清理好友的最大次數。
  • self.d = u2.connect() 用於連線裝置,u2.connect()會自動選擇連線到的裝置。如果有多個裝置,預設連線第一個裝置。
  • max_times_tagmax_times_friend 分別指定了查詢標籤和清理好友的最大次數。

啟用除錯模式

def enable_debug(self):
    """
    開啟除錯模式
    :return:
    """
    print(f"裝置資訊 ==> {self.d.info}")
    print(f"裝置IP ==> {self.d.wlan_ip} 裝置號 ==> {self.d.serial}")
    self.d.implicitly_wait(30)  # 設定查詢元素等待時間,單位秒

說明:

  • enable_debug 方法用於啟用除錯模式,列印裝置資訊(如裝置IP、裝置號)以及設定UI元素查詢的預設超時時間。
  • self.d.implicitly_wait(30) 設定了 UI 元素查詢的最大超時時間為 30 秒,意味著在操作前,系統會等待最多 30 秒來查詢元素。

進入標籤頁面

def go_to_tag_page(self):
    """
    進入標籤頁面
    :return:
    """
    print("開啟【通訊錄】")
    self.d(text='通訊錄', className='android.widget.TextView').click_exists(timeout=3)
    print("開啟【標籤】")
    self.d(text='標籤', className='android.widget.TextView').click_exists(timeout=3)

說明:

  • go_to_tag_page 方法模擬點選進入微信的“通訊錄”頁面,再點選進入“標籤”頁面。click_exists(timeout=3) 用來判斷元素是否存在,如果存在則點選。

查詢標籤並點選

def find_tag_click(self):
    i = 1
    while i <= self.max_times_tag:
        print(f"第{i}次查詢")
        status = self.find_tag_by_name()
        if status == 'done':
            break
        else:
            self.d.swipe(100, 1000, 100, 200)
            i += 1
    if i > self.max_times_tag:
        print(f"沒有找到標籤:{self.clear_tag_name}")
        exit()

    tag = self.d(text=self.clear_tag_name)
    if tag.exists() is False:
        print(f"沒有找到標籤:{self.clear_tag_name}")
        exit()

    print(f"找了{i}次,找到了標籤:{self.clear_tag_name} 點選")
    tag.click_exists(timeout=5)

說明:

  • find_tag_click 方法的核心是查詢指定標籤並點選。首先透過 find_tag_by_name() 查詢標籤,若沒有找到,就會透過滑動螢幕繼續查詢,最多重複 max_times_tag 次。
  • 滑動操作 self.d.swipe(100, 1000, 100, 200) 會從螢幕下方滑動至上方,模擬手動滑動以載入更多標籤。
  • 如果找到了目標標籤,會點選該標籤進入標籤頁面。

透過標籤名查詢標籤

def find_tag_by_name(self):
    run_status = 'doing'
    elems = self.d(resourceId="com.tencent.mm:id/hs8")
    for elem in elems:
        tag_name = elem.get_text(timeout=10)
        friend_count = elem.sibling(resourceId="com.tencent.mm:id/hs7").get_text(timeout=10)
        print(f"標籤是:{tag_name},好友數:{friend_count}")
        if tag_name == self.clear_tag_name:
            run_status = 'done'
            break
    return run_status

說明:

  • find_tag_by_name 方法透過標籤的resourceId查詢所有標籤,獲取每個標籤的名稱和好友數。
  • 如果找到指定的標籤名,會返回 'done',否則返回 'doing',供 find_tag_click 方法判斷是否繼續查詢。

清理每個好友

def clear_every_friend(self):
    """
    清理每個好友
    :return:
    """
    time.sleep(3)
    elems = self.d(resourceId='com.tencent.mm:id/kbq')
    if elems.exists() is False:
        print("沒有找到好友")
        exit()

    for elem in elems:
        time.sleep(1)
        friend_nickname = elem.get_text(timeout=10)
        print(f'進入好友詳情頁面 --> {friend_nickname}')

        elem.click(timeout=5)

        self.d(resourceId='com.tencent.mm:id/coy').click(timeout=5)
        time.sleep(1)
        self.d(text='刪除').click(timeout=5)
        time.sleep(3)
        self.d(text='刪除', resourceId='com.tencent.mm:id/mm_alert_ok_btn').click(timeout=5)
        time.sleep(1)

說明:

  • clear_every_friend 方法負責清理每個好友。首先,透過resourceId='com.tencent.mm:id/kbq' 獲取所有好友元素。
  • 點選每個好友,進入好友詳情頁面後,點選右上角的選單,選擇刪除該好友。
  • 刪除操作是透過點選【刪除】按鈕實現的,並最終點選確認框中的【刪除】。

清理標籤中的所有好友

def clear_friends_in_tag(self):
    """
    在標籤中清理好友
    :return:
    """
    i = 1
    while i <= self.max_times_friend:
        print(f"第{i}次清理好友")
        self.clear_every_friend()
        i += 1

    print(f"清理了{i}次好友")

說明:

  • clear_friends_in_tag 方法用於在標籤中清理所有好友。它會迴圈呼叫 clear_every_friend 方法,直到達到 max_times_friend 次。

指令碼入口

if __name__ == '__main__':
    tag_name = "清粉-賬號問題"
    wx = WXClearFriendByTag(tag_name)
    wx.enable_debug()
    wx.find_tag_click()
    wx.clear_friends_in_tag()

說明:

  • if __name__ == '__main__': 是Python指令碼的入口,確保指令碼從此處開始執行。
  • 建立 WXClearFriendByTag 類的例項,傳入標籤名“清粉-賬號問題”,並依次呼叫 enable_debugfind_tag_clickclear_friends_in_tag 方法,完成清理操作。

總結

這段程式碼展示瞭如何使用 uiautomator2 庫進行微信好友管理自動化。透過標籤篩選好友並刪除,非常適合需要批次清理好友的場景。

對於初學者來說,理解此指令碼能幫助你掌握如何使用 uiautomator2 控制 Android 裝置,執行 UI 操作。

希望本文的解析能幫助你更好地理解程式碼實現。如果你有更多問題,歡迎隨時提問!

相關文章