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で事前に確認することをお勧めします。