Pythonについて調べていたら、Androidを操作できることを知りました。
スマホアプリの操作が自動化できたら便利ですよね。
さらに調べを進めたところ、2022年現在、3つの方法を見つけました。
- 「Selenium」を使う
- 「Appium」を使う
- 「android-auto-play-opencv」を使う
そのうち、「UWSC」のように画像認識ができる「android-auto-play-opencv」を使うことにしました。
Windows10で実行する方法をまとめます。
用意するものは?
外部ライブラリ「android-auto-play-opencv」
Pythonの外部ライブラリ「android-auto-play-opencv」をインストールします。
pip install android-auto-play-opencv
外部ライブラリインストールの詳しい方法はこちら。 Pythonに関する投稿が増えると、「外部ライブラリをインストールして~」と書くことも増えてきます。 インストール方法をその都度書いていたものの、1つにまとめる事にしました。 手順は? ... 続きを見る
Pythonで外部ライブラリをインストールするには?【Windows】
Android Debug Bridge(adb)
「android-auto-play-opencv」を使ってAndroidスマホを操作するのに「adb.exe」というファイルが必要です。
SDK Platform-Toolsから、パソコンのOSと同じもののリンクをクリックします。
利用規約に同意すると、ダウンロードが開始されます。
ダウンロードしたZIPファイルを解凍し、任意のフォルダに保存しておきます。
Pythonのコードにパスを使うので、「platform-tools」フォルダをどこに保存したか控えておくと便利です。
通信ケーブル
スマホとパソコンを物理的につなぐケーブルが必要です。
充電用に買ったダイソーのケーブルで試したら、通信もできました。
スマホの設定は変更するの?
「開発者オプション」の「USBデバッグ」をオンにすることが必須です。
開発者オプションは、「開発者(ディベロッパー)モード」にしないと表示されません。
開発者(ディベロッパー)モードにするには、「設定」⇒「端末情報」の中にある「ビルド番号」を7回タップすると切り替わります。
そうすると、開発者オプションが表示されるので、その中にある「USBデバッグ」をオンにして、事前準備完了です。
その他、やっておくと便利なのは、座標を表示させることです。
「android-auto-play-opencv」では、タップする位置を座標で指定することができます。
「開発者オプション」の中にある「ポインタの位置」をオンにすると、画面上に座標が表示されるようになります。タップする位置を調べるのに便利ですね。
また、画面がオフになると自動操作が途切れることもあるので、「自動画面オフ」の設定も見ておくと良いでしょう。
Pythonのコードの書き方は?
基本的にはリファレンスに書いてあるものの、実際にやってみて「???」と思ったところを書いていきます。
パッケージ名とクラス名
アプリを立ち上げるのに「aapo.start()」を使います。
その引数に、立ち上げたいアプリの「パッケージ名」と「クラス名」が必要です。
パッケージ名は、立ち上げたいアプリをGooglePlayで検索して、出てきたURLに記載されています。
例えば、「YouTubeアプリ」のURLは、「https://play.google.com/store/apps/details?id=com.google.android.youtube」です。その中の「id=」以降の「com.google.android.youtube」がパッケージ名です。
「id=」の後に「&」がある場合は、その前までがパッケージ名になります。
クラス名は、コマンドプロンプトから「adbコマンド」を実行することで取得できます。
まず、立ち上げたいアプリをインストールしたスマホをパソコンにつなぎます。
次に、コマンドプロンプトで、保存した「platform-tools」フォルダをカレントフォルダにします。
その後、パッケージ名を入れた下記のコードを実行します。
adb shell pm dump 【パッケージ名】
そうすると、アプリに関する情報が大量に出てきます。
その中に「android.intent.action.MAIN:」という文字列があるので、その後にある「パッケージ名」/「クラス名」を控えておきます。
末尾の「filter ~」はクラス名には含まれません。
タスクキーを押す
「aapo.inputkeyevent()」で、タスクキーも送れます。
# タスクキーを押す
aapo.inputkeyevent(187)
画像認識について
「aapo.chkImg()」で画像の有無を判定できますが、完全一致ではありません。
例えば、形が同じで色が違う場合、同じ画像と判定されます。
また、探したい画像は「pngファイル」で作りますが、スマホ本体のスクリーンショット機能ではなく、「aapo.screencap()」と「aapo.imgSave()」を組み合わせて取得した画像を使わないと認識しません。
まとめ
PythonでAndroidを操作するのに「android-auto-play-opencv」というライブラリを使いました。
Windows11ではAndroidが扱えるので、いずれこれより良い方法が出てくるでしょう。
この方法でもかなり手間が省けるので、とてもありがたいです。