# android-auto-play-opencv
OpenCV の画像認識を使って、Android を自動操作するライブラリです。
Android を操作する時に [Android Debug Bridge (adb)](https://developer.android.com/studio/command-line/adb "Android Debug Bridge (adb) | Android Developers") を使うので、マウスカーソルが奪われません。
NoxPlayer を操作することも出来ます。
## Readme
https://noitaro.github.io/android-auto-play-opencv/
## Installation
+ ライブラリのインストール
```
pip install android-auto-play-opencv
```
+ このライブラリを使うには、[Android SDK Platform-Tools](https://developer.android.com/studio/releases/platform-tools "SDK Platform Tools release notes | Android Developers") に含まれる ```adb.exe``` が必要です。
## How to use
```python
# This Python file uses the following encoding: utf-8
# pip install android-auto-play-opencv
import android_auto_play_opencv as am
adbpath = '..\\platform-tools\\'
def main():
aapo = am.AapoManager(adbpath)
while True:
# 画面キャプチャ
aapo.screencap()
# 早送りボタンは常にタップ
if aapo.touchImg('./umamusume/hayaokuri.png'):
# タップ出来たら待機
aapo.sleep(1)
# Google Playダイアログが出たら、キャンセルの位置をタップ
elif aapo.chkImg('./umamusume/google-play.png'):
aapo.touchPos(135, 630)
aapo.sleep(1)
if __name__ == '__main__':
main()
```
### 完成品
* [ウマ娘自動リセマラ周回](https://github.com/noitaro/python-umamusume)
## Reference
### start
アプリを起動する。
```python
# FGOを起動する.
aapo.start('com.aniplex.fategrandorder/jp.delightworks.Fgo.player.AndroidPlugin')
```
### end
アプリを終了する。
```python
# FGOを終了する.
aapo.end('com.aniplex.fategrandorder')
```
### sleep
処理を待機させる。
```python
# 5秒待機.
aapo.sleep(5)
```
### screencap
Android の画面をキャプチャする。
```python
# 画面キャプチャ
aapo.screencap()
```
### chkImg
[`screencap`](#screencap) で取得したスクリーンショットに、テンプレート画像があるか確認します。タップはしません。
```python
if aapo.chkImg('./template/stage_clear.png'):
# あった時の処理.
pass
```
### chkImg2
[`screencap`](#screencap) で取得したスクリーンショットに、テンプレート画像があるか確認します。タップはしません。見つけた座標も返してくれます。
```python
# 古龍の心臓 が見つかったら位置を戻す。
result, x, y = aapo.chkImg2('./template/koryunosinzo.png')
print('result=' + str(result) + ', x=' + str(x) + ', y=' + str(y))
if result:
# 見つかった位置から指定ピクセルズラしてロングタップ(5秒)
aapo.longTouchPos(x+50, y+50, 5000)
```
引数_multiをTrueにすると、複数の結果を返してくれます。
```Python
ret, poss = aapo.chkImg2('tenpure.png',_multi = True)
if ret:
for i in range(len(poss)):
pos = poss[i]
print(f'X={pos[0]}, Y={pos[1]}')
pass
pass
```
### touchImg
[`screencap`](#screencap) で取得したスクリーンショットに、テンプレート画像があればタップします。タップ結果を返してくれます。
```python
aapo.touchImg('./template/stage_clear.png')
```
### touchPos
指定位置をタップします。
```python
# X=750、Y=400 の位置をタップする.
aapo.touchPos(750, 400)
```
第3引数を指定すると、ロングタップします。
```python
# X=750、Y=400 の位置を5秒間タップする.
aapo.longTouchPos(750, 400, 5000)
```
### swipeTouchPos
指定位置をスワイプします。
```python
# X=750、Y=800 から、X=750、Y=400 まで、1秒かけてスワイプする.
aapo.swipeTouchPos(750, 800, 750, 400, 1000)
```
### inputtext
文字を入力します。
```python
# abc を入力する.
aapo.inputtext('abc')
```
### inputkeyevent
HOMEキーやバックキーを送ります。
```python
# ホームキーを押す.
aapo.inputkeyevent(3)
# バックキーを押す.
aapo.inputkeyevent(4)
```
### inputkeyevent
[`screencap`](#screencap) で取得したスクリーンショットを保存します。
```python
# キャプチャ画像を保存
aapo.imgSave('screenshot.png')
# 現在の日時でキャプチャ画像を保存
aapo.imgSave('img/screenshot_' + datetime.datetime.now().strftime('%Y%m%d%H%M%S') + '.png')
# ↑をする場合「import datetime」をファイルの先頭に書くこと。
```
### デバイス選択
複数の端末で同時実行できます。
```python
import inquirer # pip install inquirer
aapo = am.AapoManager('C:\\Program Files\\Nox\\bin\\')
devicesselect = [
inquirer.List(
"device",
message="デバイスを選択して下さい。",
choices=aapo.adbl.devices
)
]
selected = inquirer.prompt(devicesselect)
aapo.adbl.setdevice(selected['device'])
aapo.screencap()
```
Raw data
{
"_id": null,
"home_page": "https://github.com/noitaro/android-auto-play-opencv",
"name": "android-auto-play-opencv",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "android auto play opencv",
"author": "noita",
"author_email": "noitalog.tokyo@gmail.com",
"download_url": null,
"platform": null,
"description": "# android-auto-play-opencv\r\n\r\nOpenCV \u306e\u753b\u50cf\u8a8d\u8b58\u3092\u4f7f\u3063\u3066\u3001Android \u3092\u81ea\u52d5\u64cd\u4f5c\u3059\u308b\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u3059\u3002\r\n\r\n\r\n\r\nAndroid \u3092\u64cd\u4f5c\u3059\u308b\u6642\u306b [Android Debug Bridge (adb)](https://developer.android.com/studio/command-line/adb \"Android Debug Bridge (adb) \u00a0|\u00a0 Android Developers\") \u3092\u4f7f\u3046\u306e\u3067\u3001\u30de\u30a6\u30b9\u30ab\u30fc\u30bd\u30eb\u304c\u596a\u308f\u308c\u307e\u305b\u3093\u3002\r\n\r\n\r\n\r\nNoxPlayer \u3092\u64cd\u4f5c\u3059\u308b\u3053\u3068\u3082\u51fa\u6765\u307e\u3059\u3002\r\n\r\n\r\n\r\n## Readme\r\n\r\nhttps://noitaro.github.io/android-auto-play-opencv/\r\n\r\n\r\n\r\n## Installation\r\n\r\n+ \u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\r\n\r\n```\r\n\r\npip install android-auto-play-opencv\r\n\r\n```\r\n\r\n\r\n\r\n+ \u3053\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u4f7f\u3046\u306b\u306f\u3001[Android SDK Platform-Tools](https://developer.android.com/studio/releases/platform-tools \"SDK Platform Tools release notes | Android Developers\") \u306b\u542b\u307e\u308c\u308b ```adb.exe``` \u304c\u5fc5\u8981\u3067\u3059\u3002\r\n\r\n\r\n\r\n## How to use\r\n\r\n```python\r\n\r\n# This Python file uses the following encoding: utf-8\r\n\r\n\r\n\r\n# pip install android-auto-play-opencv\r\n\r\nimport android_auto_play_opencv as am\r\n\r\n\r\n\r\nadbpath = '..\\\\platform-tools\\\\'\r\n\r\n\r\n\r\ndef main():\r\n\r\n\r\n\r\n aapo = am.AapoManager(adbpath)\r\n\r\n \r\n\r\n while True:\r\n\r\n \r\n\r\n # \u753b\u9762\u30ad\u30e3\u30d7\u30c1\u30e3\r\n\r\n aapo.screencap()\r\n\r\n \r\n\r\n # \u65e9\u9001\u308a\u30dc\u30bf\u30f3\u306f\u5e38\u306b\u30bf\u30c3\u30d7\r\n\r\n if aapo.touchImg('./umamusume/hayaokuri.png'):\r\n\r\n # \u30bf\u30c3\u30d7\u51fa\u6765\u305f\u3089\u5f85\u6a5f\r\n\r\n aapo.sleep(1)\r\n\r\n \r\n\r\n # Google Play\u30c0\u30a4\u30a2\u30ed\u30b0\u304c\u51fa\u305f\u3089\u3001\u30ad\u30e3\u30f3\u30bb\u30eb\u306e\u4f4d\u7f6e\u3092\u30bf\u30c3\u30d7\r\n\r\n elif aapo.chkImg('./umamusume/google-play.png'):\r\n\r\n aapo.touchPos(135, 630)\r\n\r\n aapo.sleep(1)\r\n\r\n\r\n\r\nif __name__ == '__main__':\r\n\r\n main()\r\n\r\n```\r\n\r\n\r\n\r\n### \u5b8c\u6210\u54c1\r\n\r\n* [\u30a6\u30de\u5a18\u81ea\u52d5\u30ea\u30bb\u30de\u30e9\u5468\u56de](https://github.com/noitaro/python-umamusume)\r\n\r\n\r\n\r\n## Reference\r\n\r\n\r\n\r\n### start\r\n\r\n\u30a2\u30d7\u30ea\u3092\u8d77\u52d5\u3059\u308b\u3002\r\n\r\n```python\r\n\r\n# FGO\u3092\u8d77\u52d5\u3059\u308b.\r\n\r\naapo.start('com.aniplex.fategrandorder/jp.delightworks.Fgo.player.AndroidPlugin')\r\n\r\n```\r\n\r\n\r\n\r\n### end\r\n\r\n\u30a2\u30d7\u30ea\u3092\u7d42\u4e86\u3059\u308b\u3002\r\n\r\n```python\r\n\r\n# FGO\u3092\u7d42\u4e86\u3059\u308b.\r\n\r\naapo.end('com.aniplex.fategrandorder')\r\n\r\n```\r\n\r\n\r\n\r\n### sleep\r\n\r\n\u51e6\u7406\u3092\u5f85\u6a5f\u3055\u305b\u308b\u3002\r\n\r\n```python\r\n\r\n# 5\u79d2\u5f85\u6a5f.\r\n\r\naapo.sleep(5)\r\n\r\n```\r\n\r\n\r\n\r\n### screencap\r\n\r\nAndroid \u306e\u753b\u9762\u3092\u30ad\u30e3\u30d7\u30c1\u30e3\u3059\u308b\u3002\r\n\r\n```python\r\n\r\n# \u753b\u9762\u30ad\u30e3\u30d7\u30c1\u30e3\r\n\r\naapo.screencap()\r\n\r\n```\r\n\r\n\r\n\r\n### chkImg\r\n\r\n[`screencap`](#screencap) \u3067\u53d6\u5f97\u3057\u305f\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\u306b\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u753b\u50cf\u304c\u3042\u308b\u304b\u78ba\u8a8d\u3057\u307e\u3059\u3002\u30bf\u30c3\u30d7\u306f\u3057\u307e\u305b\u3093\u3002\r\n\r\n```python\r\n\r\nif aapo.chkImg('./template/stage_clear.png'):\r\n\r\n # \u3042\u3063\u305f\u6642\u306e\u51e6\u7406.\r\n\r\n pass\r\n\r\n```\r\n\r\n\r\n\r\n### chkImg2\r\n\r\n[`screencap`](#screencap) \u3067\u53d6\u5f97\u3057\u305f\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\u306b\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u753b\u50cf\u304c\u3042\u308b\u304b\u78ba\u8a8d\u3057\u307e\u3059\u3002\u30bf\u30c3\u30d7\u306f\u3057\u307e\u305b\u3093\u3002\u898b\u3064\u3051\u305f\u5ea7\u6a19\u3082\u8fd4\u3057\u3066\u304f\u308c\u307e\u3059\u3002\r\n\r\n```python\r\n\r\n# \u53e4\u9f8d\u306e\u5fc3\u81d3 \u304c\u898b\u3064\u304b\u3063\u305f\u3089\u4f4d\u7f6e\u3092\u623b\u3059\u3002\r\n\r\nresult, x, y = aapo.chkImg2('./template/koryunosinzo.png')\r\n\r\nprint('result=' + str(result) + ', x=' + str(x) + ', y=' + str(y))\r\n\r\n\r\n\r\nif result:\r\n\r\n # \u898b\u3064\u304b\u3063\u305f\u4f4d\u7f6e\u304b\u3089\u6307\u5b9a\u30d4\u30af\u30bb\u30eb\u30ba\u30e9\u3057\u3066\u30ed\u30f3\u30b0\u30bf\u30c3\u30d7(5\u79d2)\r\n\r\n aapo.longTouchPos(x+50, y+50, 5000)\r\n\r\n```\r\n\r\n\u5f15\u6570_multi\u3092True\u306b\u3059\u308b\u3068\u3001\u8907\u6570\u306e\u7d50\u679c\u3092\u8fd4\u3057\u3066\u304f\u308c\u307e\u3059\u3002\r\n\r\n```Python\r\n\r\nret, poss = aapo.chkImg2('tenpure.png',_multi = True)\r\n\r\nif ret:\r\n\r\n for i in range(len(poss)):\r\n\r\n pos = poss[i]\r\n\r\n print(f'X={pos[0]}, Y={pos[1]}')\r\n\r\n pass\r\n\r\n pass\r\n\r\n```\r\n\r\n### touchImg\r\n\r\n[`screencap`](#screencap) \u3067\u53d6\u5f97\u3057\u305f\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\u306b\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u753b\u50cf\u304c\u3042\u308c\u3070\u30bf\u30c3\u30d7\u3057\u307e\u3059\u3002\u30bf\u30c3\u30d7\u7d50\u679c\u3092\u8fd4\u3057\u3066\u304f\u308c\u307e\u3059\u3002\r\n\r\n```python\r\n\r\naapo.touchImg('./template/stage_clear.png')\r\n\r\n```\r\n\r\n\r\n\r\n### touchPos\r\n\r\n\u6307\u5b9a\u4f4d\u7f6e\u3092\u30bf\u30c3\u30d7\u3057\u307e\u3059\u3002\r\n\r\n```python\r\n\r\n# X=750\u3001Y=400 \u306e\u4f4d\u7f6e\u3092\u30bf\u30c3\u30d7\u3059\u308b.\r\n\r\naapo.touchPos(750, 400)\r\n\r\n```\r\n\r\n\u7b2c3\u5f15\u6570\u3092\u6307\u5b9a\u3059\u308b\u3068\u3001\u30ed\u30f3\u30b0\u30bf\u30c3\u30d7\u3057\u307e\u3059\u3002\r\n\r\n```python\r\n\r\n# X=750\u3001Y=400 \u306e\u4f4d\u7f6e\u30925\u79d2\u9593\u30bf\u30c3\u30d7\u3059\u308b.\r\n\r\naapo.longTouchPos(750, 400, 5000)\r\n\r\n```\r\n\r\n\r\n\r\n### swipeTouchPos\r\n\r\n\u6307\u5b9a\u4f4d\u7f6e\u3092\u30b9\u30ef\u30a4\u30d7\u3057\u307e\u3059\u3002\r\n\r\n```python\r\n\r\n# X=750\u3001Y=800 \u304b\u3089\u3001X=750\u3001Y=400 \u307e\u3067\u30011\u79d2\u304b\u3051\u3066\u30b9\u30ef\u30a4\u30d7\u3059\u308b.\r\n\r\naapo.swipeTouchPos(750, 800, 750, 400, 1000)\r\n\r\n```\r\n\r\n\r\n\r\n### inputtext\r\n\r\n\u6587\u5b57\u3092\u5165\u529b\u3057\u307e\u3059\u3002\r\n\r\n```python\r\n\r\n# abc \u3092\u5165\u529b\u3059\u308b.\r\n\r\naapo.inputtext('abc')\r\n\r\n```\r\n\r\n\r\n\r\n### inputkeyevent\r\n\r\nHOME\u30ad\u30fc\u3084\u30d0\u30c3\u30af\u30ad\u30fc\u3092\u9001\u308a\u307e\u3059\u3002\r\n\r\n```python\r\n\r\n# \u30db\u30fc\u30e0\u30ad\u30fc\u3092\u62bc\u3059.\r\n\r\naapo.inputkeyevent(3)\r\n\r\n# \u30d0\u30c3\u30af\u30ad\u30fc\u3092\u62bc\u3059.\r\n\r\naapo.inputkeyevent(4)\r\n\r\n```\r\n\r\n\r\n\r\n### inputkeyevent\r\n\r\n[`screencap`](#screencap) \u3067\u53d6\u5f97\u3057\u305f\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\u3092\u4fdd\u5b58\u3057\u307e\u3059\u3002\r\n\r\n```python\r\n\r\n# \u30ad\u30e3\u30d7\u30c1\u30e3\u753b\u50cf\u3092\u4fdd\u5b58\r\n\r\naapo.imgSave('screenshot.png')\r\n\r\n\r\n\r\n# \u73fe\u5728\u306e\u65e5\u6642\u3067\u30ad\u30e3\u30d7\u30c1\u30e3\u753b\u50cf\u3092\u4fdd\u5b58\r\n\r\naapo.imgSave('img/screenshot_' + datetime.datetime.now().strftime('%Y%m%d%H%M%S') + '.png')\r\n\r\n# \u2191\u3092\u3059\u308b\u5834\u5408\u300cimport datetime\u300d\u3092\u30d5\u30a1\u30a4\u30eb\u306e\u5148\u982d\u306b\u66f8\u304f\u3053\u3068\u3002\r\n\r\n```\r\n\r\n\r\n\r\n### \u30c7\u30d0\u30a4\u30b9\u9078\u629e\r\n\r\n\u8907\u6570\u306e\u7aef\u672b\u3067\u540c\u6642\u5b9f\u884c\u3067\u304d\u307e\u3059\u3002\r\n\r\n```python\r\n\r\nimport inquirer # pip install inquirer\r\n\r\naapo = am.AapoManager('C:\\\\Program Files\\\\Nox\\\\bin\\\\')\r\n\r\ndevicesselect = [\r\n\r\n inquirer.List(\r\n\r\n \"device\",\r\n\r\n message=\"\u30c7\u30d0\u30a4\u30b9\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\u3002\",\r\n\r\n choices=aapo.adbl.devices\r\n\r\n )\r\n\r\n]\r\n\r\nselected = inquirer.prompt(devicesselect)\r\n\r\naapo.adbl.setdevice(selected['device'])\r\n\r\naapo.screencap()\r\n\r\n```\r\n\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Operate Android using OpenCV.",
"version": "1.0.9",
"project_urls": {
"Homepage": "https://github.com/noitaro/android-auto-play-opencv"
},
"split_keywords": [
"android",
"auto",
"play",
"opencv"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "b3b6dc4f17ceec98a64678920e49229727d34d4ee9f0c5b2a58601584c2e765c",
"md5": "dc7eacb9462d0773dd5ce4184bc90b7f",
"sha256": "3fc9717abfaa64ed5ed7f316cc4f46765402ecc3e66cf5aaa660ee2c5f28de2b"
},
"downloads": -1,
"filename": "android_auto_play_opencv-1.0.9-py3-none-any.whl",
"has_sig": false,
"md5_digest": "dc7eacb9462d0773dd5ce4184bc90b7f",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 8572,
"upload_time": "2024-07-14T05:37:11",
"upload_time_iso_8601": "2024-07-14T05:37:11.439142Z",
"url": "https://files.pythonhosted.org/packages/b3/b6/dc4f17ceec98a64678920e49229727d34d4ee9f0c5b2a58601584c2e765c/android_auto_play_opencv-1.0.9-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-07-14 05:37:11",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "noitaro",
"github_project": "android-auto-play-opencv",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "android-auto-play-opencv"
}