UiAutomator2とPythonで微信の未読メッセージを自動処理する方法

1. はじめに

微信(WeChat)の通知紅点が大量に表示されると、クリックだけで時間を消費してしまいます。今回はUiAutomator2を使用して、Androidの自動化スクリプトで未読メッセージを自動的に処理する方法を説明します。

2. 準備環境

実装 전에 다음 준비가 필요합니다: 1. PC側にAndroid開発環境を構築 2. 必要なライブラリをインストール uiautomator2は自动化制御を担当し、weditorはデバイス接続とUI要素の検証に使用します:
# 基本ライブラリのインストール
pip3 install -U uiautomator2

# スクリーンショットが必要な場合
pip3 install pillow

# UI要素確認ツールのインストール
pip3 install -U weditor
次にスマホ側にATXエージェントをインストールします:
# 手机にAPKサービスをインストール
python -m uiautomator2 init

3. 実装

먼저、コマンドラインで「weditor」と入力すると、ブラウザがデバイス管理画面を開きます。手机的IPアドレスを確認し、デバイスに接続后就 可以看到現在のインターフェース要素が表示されます。

微信アプリを起動

LAN内でIPアドレスを使用してデバイスに接続し、微信のパッケージ名で開きます:
import uiautomator2 as u2

# 微信のパッケージ名
WECHAT_PKG = 'com.tencent.mm'

# デバイスに接続
client = u2.connect('192.168.0.105')

# 画面の幅と高さを取得
screen_width, screen_height = client.window_size()

# アプリを開始
client.app_start(WECHAT_PKG, stop=True)

ホーム画面の読み込みを待機

コールドスタートは時間がかかるため、ホームページの要素が読み込まれるまで待機します。底部Tabの要素IDを特定し、「ID + テキスト内容」でTabコントロールを配置し、最大タイムアウト時間を設定してコントロールの成功を待ちます:
def wait_for_home_ready():
    """
    ホーム画面の読み込み完了を待機
    """
    client(resourceId='com.tencent.mm:id/cns', text='微信').wait(timeout=20)
    client(resourceId='com.tencent.mm:id/cns', text='連絡先').wait(timeout=20)
    client(resourceId='com.tencent.mm:id/cns', text='発見').wait(timeout=20)
    print('ホーム画面読み込み完了')

未読メッセージの存在を確認

顶部Tabの未読メッセージコントロールのテキスト内容を取得します。テキストが空ではない場合、未処理のメッセージが存在します。空の場合はプログラムを終了します:
def has_unread_messages():
    """
    未読メッセージがあるか確認
    :return: bool
    """
    try:
        unread_badge = client(resourceId='com.tencent.mm:id/gik')
        return unread_badge.get_text() != ""
    except Exception:
        return False

未処理メッセージを取得して処理

現在のインターフェースでメッセージリストを検索し、ヘッダーの右上に数字を含むコントロールをフィルタリングします。要素が空ではなく、テキスト内容が整数で大于0の場合、クリック操作をシミュレートして主页に戻ります:
# 未処理メッセージのコントロール
message_item = client(resourceId='com.tencent.mm:id/ga3', instance=0)

if message_item.exists and is_numeric(message_item.get_text()):
    # 未処理メッセージが存在
    message_item.click()
    
    if not is_home_screen():
        # ホーム画面に戻る
        client.press('back')
else:
    # 未処理メッセージなし
    pass

検索と配置の最適化

未読メッセージをすべて検索する2つの方法: 1. 上下にスワイプして循环で検索 2. 底部Tabを素早く2回クリックして、未処理メッセージに直接ジャンプ 后者推荐更快、更稳定で、循环検索をサポートしています。 底部Tabコントロールの中心座標を取得し、double_click()で0.05秒の間隔で2回クリックをシミュレートします:
def double_tap_element(device, elem):
    """
    素早く2回タップ
    :param device: デバイスオブジェクト
    :param elem: UI要素
    """
    bounds = elem.bounds()
    
    center_x = (bounds[2] + bounds[0]) / 2
    center_y = (bounds[3] + bounds[1]) / 2
    print(f"中心座標: ({center_x}, {center_y})")
    device.double_click(center_x, center_y, 0.05)

ループ処理

未処理メッセージが存在するかどうかをチェックするループを実装し、存在する場合は底部Tabを素早くクリックして未読メッセージ位置にジャンプして閲覧処理を行い、存在しないなくなるまで繰り返します:
# メインループ
while True:
    # 未読メッセージがある場合
    if has_unread_messages():
        # 素早く2回クリックして素早く位置を特定
        double_tap_element(client, tab_element)
        
        # 未読メッセージを処理
        process_unread_message()
    else:
        print('処理するメッセージがありません。終了します。')
        break

4. まとめ

以上の実装により、ホーム 页面の未読メッセージをすべて処理できます。連絡先、朋友圈、個人メッセージの通知も同様の方法で処理できます。 実装にあたっては、実際にデバイスで動作確認を行い、各要素のIDや座標が環境によって異なる場合があるため、weditorで事前に確認することをお勧めします。

タグ: Python Android automation uiautomator2 WeChat

5月19日 23:35 投稿