当前位置:   article > 正文

基于Python的安卓模拟器的控制脚本_安卓 模拟器 app 控制

安卓 模拟器 app 控制

用于课堂展示,渣作勿喷。并没有优化运行时间,简单任务不如自己上手(不过这一点,脚本应该都一样,指简单任务不如自己上),代码从我自己的程序中摘选(应该可以跑,但我懒得试了,我的完整代码是可以完成任务的,也就删了一点点击的步骤)

基本思路:利用图像识别识别特定界面,再通过adb,或者雷电模拟器自带软件执行点击指令。其他模拟器改端口号就行,ld和console处全换adb就好。
图像识别借鉴于:Python 五种图片相似度比较方法:http://t.csdnimg.cn/WYIbA
雷电模拟器操作借鉴于:基于雷电模拟器的python脚本(乱斗西游2自动收礼包):http://t.csdnimg.cn/Ak7cG

途中可能会出现adb环境路径问题、编码格式问题等,请自行解决。

图像识别,出于某些游戏开场动画会变,所以请自行选择不变的范围去识别。

  1. import cv2
  2. from check import pHash
  3. #此函数引用自开头提及的图像识别文章中的感知哈希,请移步#http://t.csdnimg.cn/0pGkY
  4. from check import cmpHash #同上
  5. import numpy as np
  6. def cv_show(name, image):
  7. cv2.imshow(name, image) #opencv 函数自行查找,不做过多解释
  8. cv2.waitKey(0)
  9. cv2.destoryAllWindows()
  10. def compare(a,b,c,d,n,str):
  11. if str == 'enter':
  12. a = 1200; b = 1280 ; c = 300 ; d = 600 #选择图片识别范围
  13. elif str == 'mainscreen':
  14. a = 1500 ; b = 1580 ; c = 50 ; d = 850
  15. image = cv2.imread('{x}.png'.format(x=str))
  16. sample = image[a:b, c:d] #//enter
  17. #cv2.imshow("1",sample)
  18. #cv2.waitKey(0)
  19. image = cv2.imread('screengap.png')
  20. screen_cap = image[a:b, c:d] # compare with sample
  21. #cv2.imshow("2",screen_cap)
  22. #cv2.waitKey(0)
  23. hash1 = pHash(sample)
  24. hash2 = pHash(screen_cap)
  25. n = cmpHash(hash1, hash2)
  26. print('感知哈希算法相似度:', n)
  27. return n
  28. def check(a,b,c,d):
  29. image = cv2.imread('mainscreen.png')
  30. mainscreen = image[a:b, c:d]
  31. cv2.imshow('wah', mainscreen)
  32. cv2.waitKey(0)
  33. #check(1500,1580,50,850) #//bar
  34. if __name__=="__main__":
  35. compare(0,0,0,0,0,'enter')

接下来是雷电模拟器控制的部分,完成任务就多些点击函数就好了

  1. import os
  2. import time
  3. from compare import compare #上一段代码我存为了compare.py
  4. class Ldconsole: #请根据自己软件的路径来
  5. console = r'F:\leidian\LDPlayer9\dnconsole.exe '
  6. ld = r'F:\leidian\LDPlayer9\ld.exe'
  7. adb = r'F:\leidian\LDPlayer9\adb.exe'
  8. #这个类其实不用写的(个人意见),参照于http://t.csdnimg.cn/rkTDh,下面使用ld和console的也是基于此博客
  9. def launch(self,index: int): #启动函数
  10. cmd = Ldconsole.console + 'launch --index ' + str(index)
  11. #可以去雷电官方论坛看console和ld的使用格式和函数用途
  12. process = os.popen(cmd) #os是python向cmd发送指令的库
  13. result = process.read() #结果读取
  14. process.close()
  15. return result #结果显示
  16. def app_star(self,index: int, package: str):
  17. #启动app,等会函数内填的是应用名,自行查app调用名(例如:com.bilibili.umamusu(赛马娘,启动!),应该是和安装包同名)
  18. cmd = Ldconsole.console + 'runapp --index %d --packagename %s' % (index, package)
  19. process = os.popen(cmd)
  20. result = process.read()
  21. process.close()
  22. print(result)
  23. return result
  24. def adb_start(self,index: int): #启动adb的函数,这段里面注释掉的是本来应该写在这,但是不注释就报错,但为了纪念我去查资料的时间,所以我留着了ᕕ(◠ڼ◠)ᕗ
  25. #cmd1 ='adb kill-server' 本来在启动要结束之前启动的adb的
  26. #process = os.popen(cmd1)
  27. #result = process.read()
  28. #process.close()
  29. #print(result)
  30. #return result
  31. cmd2 = 'adb start-server'
  32. process = os.popen(cmd2)
  33. process.close()
  34. cmd3 = Ldconsole.adb + ' connect 127.0.0.1:5555' #连接到雷电模拟器的端口号,第一次应该连接不上(我也不知为什么,第一次会自动连接到 emulator-5554),cmd可查此时连接上adb的模拟器的端口号,自行学习
  35. process = os.popen(cmd3)
  36. process.close()
  37. #return result
  38. def tap(self, a, b):#用于点击的函数
  39. cmd = Ldconsole.adb + ' -s emulator-5554 shell input tap {x} {y}'.format(x=a,y=b)
  40. process = os.popen(cmd)
  41. result = process.read()
  42. process.close()
  43. print(result)
  44. return result
  45. def screencap(self,index: int,str): #截屏
  46. cmd = (Ldconsole.adb +
  47. ' -s emulator-5554 shell /system/bin/screencap -p /sdcard/{name}.png'.format(name=str))
  48. process = os.popen(cmd)
  49. result = process.read()
  50. process.close()
  51. print(result)
  52. return result
  53. def screenget(self,index: int,str): #将截屏存放到F:\python\pythonProject(这是我的路径,记得自行更改)
  54. cmd = (Ldconsole.adb +
  55. ' -s emulator-5554 pull /sdcard/{name}.png F:\python\pythonProject'.format(name=str))
  56. process = os.popen(cmd)
  57. result = process.read()
  58. process.close()
  59. print(result)
  60. return result
  61. def kill_self(self,index: int): #写到这我才发现还是写了个结束进程的函数。。
  62. cmd ='adb kill-server'
  63. process = os.popen(cmd)
  64. result = process.read()
  65. process.close()
  66. print(result)
  67. return result
  68. def main():
  69. a = Ldconsole()# 打开模拟器
  70. def competition():
  71. a.tap(646, 1524)
  72. print("competition")
  73. a.launch(0) #这里很多延时是因为响应速度问题,删除可能导致某一步没执行
  74. time.sleep(4)
  75. a.kill_self(0)
  76. time.sleep(4)
  77. a.adb_start(0)
  78. time.sleep(4)
  79. #time.sleep(3)
  80. a.app_star(0,'com.bilibili.umamusu')
  81. #time.sleep(10)
  82. #a.tap(590,250) #启动应用的坐标
  83. time.sleep(18)
  84. a.screencap(0,'screengap')
  85. time.sleep(1)
  86. a.screenget(0,'screengap')
  87. time.sleep(2)
  88. x=compare(0,0,0,0,0,"enter") #基于compare.py见上一段
  89. if x>0.82:
  90. a.tap(590,250)
  91. time.sleep(30)
  92. a.screencap(0,'screengap')
  93. time.sleep(2)
  94. a.screenget(0,'screengap')
  95. x=compare(0,0,0,0,0,"mainscreen")
  96. if x >= 0.82:
  97. competition()
  98. else:
  99. print("error")
  100. exit(0)
  101. #a.kill_self(0)
  102. #a.quit(0)
  103. if __name__ == '__main__':
  104. main()

人懒,一般不回消息,有问题自行网上搜资料(毕竟我就这么过来的)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/537845
推荐阅读
相关标签
  

闽ICP备14008679号