通过ADB来实现脚原来控制手机

打印 上一主题 下一主题

主题 890|帖子 890|积分 2670

ADB

简介

adb的全称为Android Debug Bridge,安卓调试桥,可以通过调试命令来控制手机,诸如开机,关机等按键控制;或者启动,关闭应用;异或举行触摸模拟.
通过学习adb,可以实现简单的脚本控制,最大的特点是不需要root,对于普通手机都可以举行,帮助我们完成一些简单的重复性事件,诸如刷资源,各种app的签到
环境设置

电脑端

将下面3个文件弄到一个文件夹里D:\android\adb,然后将其添加到path,adb环境就设置好了
  1. AdbWinUsbApi.dll
  2. AdbWinApi.dll
  3. adb.exe
复制代码
然后将这个文件夹添加到path中
cmd中 adb version检查是否添加成功
手机端

开发者选项
开启开发者选项 : 以小米手机为例,先辈入开发者设置,miui版本号点5下,更多设置->开发者选项->开启
打开usb调试 : 在开发者选项中,开启usb调试以便于实行adb指令,miui还需要开启usb调试(安全设置)
获取坐标 : 开发者选项中,开启指针位置以便于模拟触摸时获取位置
设备管理

长途调试

基于内网穿透实现长途调试,就可以不用占用那少得可怜的usb口了,下面是同一管理全部设备的命令
  1. 开启关闭服务,默认会自动开启,关闭服务可用于断开多个连接的设备
  2. adb start-server
  3. adb kill-server
  4. adb devices 查看设备列表,如果有模拟器一般会自动连接,所以如果想在开模拟器时断开设备就需要获取模拟器ip:port然后断开
复制代码
实现步骤
先利用内网穿透得到虚拟IP 如100.119.133.92
   保举tailscale或蒲公英
  手机通过usb调试设置监听端口adb tcpip 5555
断开手机后,电脑连接 如adb connect 100.119.133.92:5555
调试竣事后可以adb disconnect 100.119.133.92:5555  断开连接
长途控制

scrcpy 利用这个软件,在上面长途连接之后就可以举行长途控制,当然也可以直接连usb获得稳固的投屏
手机adb

Local ADB


  • 先连接任意一个 Wi-Fi,就算没有接入互联网都可以;
  • 然后打开 LADB,将它调整为小窗模式(或分屏模式)——因为无线调试的配对码等信息每次点击都会动态天生,所以才需要小窗模式同时打开本应用和开发者选项;
  • 进入开发者选项,开启无线调试,初次利用需要配对设备,将配对码和端口填入本应用即可;
  • 开心利用adb
安卓模拟器adb

如利用mumu模拟器,可以在题目诊断里面检察adb端口
找到端口后直接connect,如下是默认端口
  1. adb connect 127.0.0.1:16384
复制代码
应用管理

常见命令中常见pm和am的缩写
pm package manager
am activity manager
一个package下有多个activity(界面)
检察应用列表

  1. adb shell pm list packages                    查看所有应用
  2. adb shell pm list packages -s                查看系统应用
  3. adb shell pm list packages -3                查看第三方应用
  4. adb shell pm list packages vivo                 查看带关键词vivo的应用
复制代码
安装应用

  1. adb install [-r] [-d] [-g] <apk-file>
  2. -r覆盖 -d降级覆盖 -g授予所有运行权限
复制代码
比方 adb install "D:\android\apk\com.supercell.clashofclans.apk"
卸载应用

  1. adb uninstall [-k] <package-name>
  2. -k 表示卸载应用但保留数据和缓存目录。
复制代码
比方adb uninstall com.supercell.clashofclans
获取activity和package

由adb shell dumpsys window w | findstr mCurrent
得到 mCurrentFocus=Window{8554b85 u0 com.supercell.clashofclans/com.supercell.titan.GameApp}
然后可以得到
activity : com.supercell.clashofclans/com.supercell.titan.GameApp
package : com.supercell.clashofclans
可以通过下面cmd代码获取
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. rem 先查询window w mCurrent属性,如果为空,则查询window w imeControlTarget属性
  4. for /f "delims=" %%a in ('adb shell dumpsys window w ^| findstr mCurrent') do set activity=%%a
  5. if "!activity!"=="" (
  6. for /f "delims=" %%a in ('adb shell dumpsys window w ^| findstr imeControlTarget') do set activity=%%a )
  7. rem 然后对获得的结果进行处理提取得到activity和package,先去除},然后取空格分隔的最后一部分,即activity,之后再得到package
  8. for /f "delims=}" %%a in ("!activity!") do set activity=%%a
  9. rem for /f "tokens=3 delims= " %%a in ("!activity!") do set activity=%%a
  10. for %%I in (!activity!) do (set activity=%%I)
  11. for /f "tokens=1 delims=/" %%a in ("!activity!") do set package=%%a
  12. echo activity  :  !activity!
  13. echo package   :  !package!
  14. endlocal
复制代码
提取安装包

获取了安装路径后pull到指定目录里并重命名为com.supercell.clashofclans.apk
  1. adb shell pm path com.supercell.clashofclans
  2. adb pull /data/app/com.supercell.clashofclans-HyrIPsbKlOHBjZwM4LnczA==/base.apk D:\android\com.supercell.clashofclans.apk
复制代码
用cmd实现批量操作
  1. @echo off
  2. rem 获取安装包
  3. set outputpath=D:\android\apk\
  4. set package=com.supercell.clashofclans
  5. for /f "delims=" %%a in ( 'adb shell pm path %package%' ) do set originalString=%%a
  6. for /f "tokens=2 delims=:" %%a in ("%originalString%") do set apkpath=%%a
  7. adb pull %apkpath% %outputpath%%package%.apk
复制代码
启动和停止应用

  1. rem 启动
  2. adb shell am start -n com.supercell.clashofclans/com.supercell.titan.GameApp>nul
  3. rem 强行停止
  4. adb shell am force-stop com.supercell.clashofclans
复制代码
举动模拟

延时

延时1s,以免过场动画影响操作,利用选择默认耽误来实现
  1. choice /t 1 /d y  >nul
复制代码
按键模拟

按键模拟都是像下面这种格式,差别的按键对应差别的id
  1. rem 模拟主页键
  2. adb shell input keyevent 3
复制代码
下面是常用id-按键表
id按键3home4返回187多任务24增加音量25减小音量26电源键164静音220进步亮度221降低亮度 详细的见官网 KeyEvent | Android Developers
触摸模拟

  1. rem 单击 (1200,70)为x,y坐标
  2. adb shell input tap 1200 70
  3. rem 滑动 从(600,700)滑动到(600,900)经历1000ms
  4. adb shell input swipe 600 700 600 900 1000
  5. rem 长按 用滑动实现
  6. adb shell input swipe 100 100 100 100 1000
复制代码
系统控制

  1. rem 执行关机命令
  2. adb shell reboot -p
  3. rem 执行重启命令
  4. adb shell reboot
  5. rem 进入Recovery
  6. adb reboot recovery
  7. rem 进入Fastboot
  8. adb reboot fastboot
复制代码
实战

获取当前运动的activity和package

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. rem 先查询window w mCurrent属性
  4. for /f "delims=" %%a in ('adb shell dumpsys window w ^| findstr mCurrent') do set activity=%%a
  5. if "!activity!"=="" ( REM 如果没有查询到,则查询window w imeControlTarget属性,此处只试了两款手机,其他的可以自己打印出window w再找
  6. for /f "delims=" %%a in ('adb shell dumpsys window w ^| findstr imeControlTarget') do set activity=%%a )
  7. rem 然后对获得的结果进行处理提取得到activity和package,先去除},然后取空格分隔的最后一部分,即activity,之后再得到package
  8. for /f "delims=}" %%a in ("!activity!") do set activity=%%a
  9. rem 通过循环得到空格的最后一段,因为不同的指令输出的我们所需的信息都在最后
  10. for %%I in (!activity!) do (set activity=%%I)  
  11. for /f "tokens=1 delims=/" %%a in ("!activity!") do set package=%%a
  12. echo activity  :  !activity!
  13. echo package   :  !package!
  14. endlocal
复制代码
coc辅助刷夜世界资源

坐标需要根据屏幕分辨率自行调整
  1. chcp 65001
  2. @echo off
  3. set m=7
  4. :m
  5. set /a m+=1
  6. adb shell am start -n com.supercell.clashofclans/com.supercell.titan.GameApp > nul
  7. choice /t 12 /d y  >nul
  8. set  /a n = %m% %% 8
  9. if %n% == 0  (
  10. echo 圣水已收集
  11. adb shell input swipe 600 700 600 900 1000
  12. adb shell input tap 1060 80
  13. adb shell input tap 1100 600
  14. adb shell input tap 1200 70
  15. )
  16. rem 皮卡一字滑
  17. adb shell input tap 120 650
  18. adb shell input tap 1035 500
  19. choice /t 5 /d y  >nul
  20. adb shell input tap 360 650
  21. FOR /L %%i in (1,1,2) DO (
  22. adb shell input tap 200 100
  23. adb shell input tap 200 450
  24. adb shell input tap 1200 100
  25. adb shell input tap 1200 450
  26. )
  27. adb shell am force-stop com.supercell.clashofclans
  28. goto m
复制代码
冲杯
  1. chcp 65001
  2. @echo off
  3. if "%1" == "h" goto begin
  4. mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
  5. :begin
  6. set m=7
  7. :m
  8. set /a m+=1
  9. adb shell am start -n com.supercell.clashofclans/com.supercell.titan.GameApp > nul
  10. choice /t 12 /d y  >nul
  11. set  /a n = %m% %% 8
  12. if %n% == 0  (
  13. echo 圣水已收集
  14. adb shell input swipe 600 700 600 900 1000
  15. adb shell input tap 1000 200
  16. adb shell input tap 1100 600
  17. adb shell input tap 1200 70
  18. )
  19. adb shell input tap 120 650
  20. adb shell input tap 1035 500
  21. choice /t 5 /d y  >nul
  22. adb shell input tap 260 650
  23. adb shell input tap 200 450
  24. adb shell input tap 1200 100
  25. adb shell input tap 360 650
  26. FOR /L %%i in (1,1,2) DO (
  27. adb shell input tap 200 100
  28. adb shell input tap 200 450
  29. adb shell input tap 1200 100
  30. adb shell input tap 1200 450
  31. )
  32. choice /t 80 /d y  >nul
  33. adb shell input tap 260 650
  34. adb shell input tap 200 450
  35. adb shell input tap 1200 100
  36. adb shell input tap 1100 660
  37. FOR /L %%i in (1,1,3) DO (
  38. adb shell input tap 200 100
  39. adb shell input tap 200 450
  40. adb shell input tap 1200 100
  41. adb shell input tap 1200 450
  42. )
  43. adb shell am force-stop com.supercell.clashofclans
  44. goto m
复制代码
利用python模拟adb

下面是基于图像处置处罚控制流程的coc辅助脚本
里面的图片可以自己截取故乡界面和战斗界面的元素用于定位
留意截图不能直接截,应该利用模拟器截图之后,再在截取的图片上面截
因为模拟器的显示有缩放
  1. import cv2
  2. import numpy as np
  3. from PIL import Image
  4. import io
  5. import time
  6. import subprocess
  7. from adb_shell.adb_device import AdbDeviceTcp
  8. class AndroidDeviceController:
  9.     def __init__(self, ip, port):
  10.         self.device = AdbDeviceTcp(ip, port)
  11.         self.device.connect(auth_timeout_s=0.1)
  12.     def start_app(self, package_name, activity_name):
  13.         self.device.shell(f"am start -n {package_name}/{activity_name}")
  14.     def stop_app(self, package_name):
  15.         self.device.shell(f"am force-stop {package_name}")
  16.     def tap_screen(self, x, y):
  17.         self.device.shell(f"input tap {x} {y}")
  18.     def screen_shot(self):
  19.         img_data = self.device.shell('screencap -p', decode=False)  # decode=False 保证是原始二进制数据
  20.         image = Image.open(io.BytesIO(img_data))
  21.         return np.array(image)
  22.     def wait_scene(self, target_image_path, callback):
  23.         target_image_path = "./img/"+target_image_path
  24.         target_image = cv2.imread(target_image_path, cv2.IMREAD_GRAYSCALE)
  25.         while True:
  26.             screen = self.screen_shot()
  27.             gray_screen = cv2.cvtColor(screen, cv2.COLOR_BGR2GRAY)
  28.             result = cv2.matchTemplate(gray_screen, target_image, cv2.TM_CCOEFF_NORMED)
  29.             min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
  30.             threshold = 0.8   # 设置一个匹配的阈值
  31.             if max_val >= threshold:
  32.                 # match_loc = max_loc
  33.                 # print(f"目标图像匹配位置: x={match_loc[0]}, y={match_loc[1]}")
  34.                 callback()
  35.                 break
  36.             # else:
  37.             #    print("未识别到目标")
  38.             time.sleep(0.5)  # 每0.5秒进行一次截图进行匹配
  39. class GameController:
  40.     def __init__(self, ip, port):
  41.         self.controller = AndroidDeviceController(ip, port)
  42.         self.round = 0
  43.     def collect_elixir(self):
  44.         if self.round % 5 == 0:
  45.             self.round += 1
  46.             self.controller.tap_screen(840, 10)
  47.             time.sleep(0.5)
  48.             self.controller.tap_screen(950, 600)
  49.             self.controller.tap_screen(1070, 70)
  50.             print("圣水已收集")
  51.             time.sleep(1)
  52.         else:
  53.             self.round += 1
  54.     def search_opponent(self):
  55.         self.controller.tap_screen(120, 650)
  56.         time.sleep(0.5)
  57.         self.controller.tap_screen(1035, 500)
  58.     def attack(self):
  59.         self.controller.tap_screen(360, 650)
  60.         for _ in range(2):
  61.             self.controller.tap_screen(200, 100)
  62.             self.controller.tap_screen(200, 450)
  63.             self.controller.tap_screen(1200, 100)
  64.             self.controller.tap_screen(1200, 450)
  65.             time.sleep(1)
  66.     def run(self):
  67.         print("开始运行")
  68.         while True:
  69.             print(f'当前轮次:{self.round + 1}')
  70.             self.controller.start_app('com.supercell.clashofclans', 'com.supercell.titan.GameApp')
  71.             self.controller.wait_scene('setting.png', self.collect_elixir)
  72.             self.search_opponent()
  73.             self.controller.wait_scene('swap.png', self.attack)
  74.             self.controller.stop_app('com.supercell.clashofclans')
  75. if __name__ == "__main__":
  76.     game_controller = GameController('127.0.0.1', 16384)
  77.     game_controller.run()
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

杀鸡焉用牛刀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表