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

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

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

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

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

import cv2
from check import pHash 
#此函数引用自开头提及的图像识别文章中的感知哈希,请移步#http://t.csdnimg.cn/0pGkY
from check import cmpHash #同上
import numpy as np


def cv_show(name, image):
    cv2.imshow(name, image) #opencv 函数自行查找,不做过多解释
    cv2.waitKey(0)
    cv2.destoryAllWindows()

def compare(a,b,c,d,n,str):
    if str == 'enter':
        a = 1200; b = 1280 ; c = 300 ; d = 600 #选择图片识别范围
    elif str == 'mainscreen':
        a = 1500 ; b = 1580 ; c = 50 ; d = 850
    image = cv2.imread('{x}.png'.format(x=str))
    sample = image[a:b, c:d] #//enter
    #cv2.imshow("1",sample)
    #cv2.waitKey(0)
    image = cv2.imread('screengap.png')
    screen_cap = image[a:b, c:d]  # compare with sample
    #cv2.imshow("2",screen_cap)
    #cv2.waitKey(0)
    hash1 = pHash(sample)
    hash2 = pHash(screen_cap)
    n = cmpHash(hash1, hash2)
    print('感知哈希算法相似度:', n)
    return n

def check(a,b,c,d):
    image = cv2.imread('mainscreen.png')
    mainscreen = image[a:b, c:d]
    cv2.imshow('wah', mainscreen)
    cv2.waitKey(0)

#check(1500,1580,50,850) #//bar
if __name__=="__main__":
    compare(0,0,0,0,0,'enter')

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

import os
import time
from compare import compare #上一段代码我存为了compare.py

class Ldconsole: #请根据自己软件的路径来
    console = r'F:\leidian\LDPlayer9\dnconsole.exe '
    ld = r'F:\leidian\LDPlayer9\ld.exe'
    adb = r'F:\leidian\LDPlayer9\adb.exe'  
#这个类其实不用写的(个人意见),参照于http://t.csdnimg.cn/rkTDh,下面使用ld和console的也是基于此博客

    def launch(self,index: int): #启动函数
        cmd = Ldconsole.console + 'launch --index ' + str(index)
 #可以去雷电官方论坛看console和ld的使用格式和函数用途
        process = os.popen(cmd) #os是python向cmd发送指令的库
        result = process.read() #结果读取
        process.close()
        return result #结果显示

    def app_star(self,index: int, package: str):
#启动app,等会函数内填的是应用名,自行查app调用名(例如:com.bilibili.umamusu(赛马娘,启动!),应该是和安装包同名)
        cmd = Ldconsole.console + 'runapp --index %d --packagename %s' % (index, package)
        process = os.popen(cmd)
        result = process.read()
        process.close()
        print(result)
        return result


    def adb_start(self,index: int): #启动adb的函数,这段里面注释掉的是本来应该写在这,但是不注释就报错,但为了纪念我去查资料的时间,所以我留着了ᕕ(◠ڼ◠)ᕗ
        #cmd1 ='adb kill-server' 本来在启动要结束之前启动的adb的
        #process = os.popen(cmd1)
        #result = process.read()
        #process.close()
        #print(result)
        #return result
        cmd2 = 'adb start-server'
        process = os.popen(cmd2)
        process.close()
        cmd3 = Ldconsole.adb + ' connect 127.0.0.1:5555' #连接到雷电模拟器的端口号,第一次应该连接不上(我也不知为什么,第一次会自动连接到 emulator-5554),cmd可查此时连接上adb的模拟器的端口号,自行学习
        process = os.popen(cmd3)
        process.close()
        #return result

    def tap(self, a, b):#用于点击的函数
        cmd = Ldconsole.adb + ' -s emulator-5554  shell input tap {x} {y}'.format(x=a,y=b)
        process = os.popen(cmd)
        result = process.read()
        process.close()
        print(result)
        return result

    def screencap(self,index: int,str): #截屏
        cmd = (Ldconsole.adb +
        ' -s emulator-5554 shell /system/bin/screencap -p /sdcard/{name}.png'.format(name=str))
        process = os.popen(cmd)
        result = process.read()
        process.close()
        print(result)
        return result

    def screenget(self,index: int,str): #将截屏存放到F:\python\pythonProject(这是我的路径,记得自行更改)
        cmd = (Ldconsole.adb +
        ' -s emulator-5554  pull /sdcard/{name}.png F:\python\pythonProject'.format(name=str))
        process = os.popen(cmd)
        result = process.read()
        process.close()
        print(result)
        return result

   def kill_self(self,index: int): #写到这我才发现还是写了个结束进程的函数。。
        cmd ='adb kill-server'
        process = os.popen(cmd)
        result = process.read()
        process.close()
        print(result)
        return result

def main():
    a = Ldconsole()# 打开模拟器
        def competition():
        a.tap(646, 1524)  
        print("competition")
    a.launch(0) #这里很多延时是因为响应速度问题,删除可能导致某一步没执行
    time.sleep(4)
    a.kill_self(0)
    time.sleep(4)
    a.adb_start(0)
    time.sleep(4)
    #time.sleep(3)
    a.app_star(0,'com.bilibili.umamusu')
    #time.sleep(10)
    #a.tap(590,250) #启动应用的坐标
    time.sleep(18)
    a.screencap(0,'screengap')
    time.sleep(1)
    a.screenget(0,'screengap')
    time.sleep(2)
    x=compare(0,0,0,0,0,"enter") #基于compare.py见上一段
    if x>0.82:
        a.tap(590,250)
    time.sleep(30)
    a.screencap(0,'screengap')
    time.sleep(2)
    a.screenget(0,'screengap')
    x=compare(0,0,0,0,0,"mainscreen")
    if x >= 0.82:
        competition()
    else:
        print("error")
        exit(0)


    #a.kill_self(0)
    #a.quit(0)

if __name__ == '__main__':
    main()

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

Python安卓模拟器是指使用Python编程语言,结合Appium框架和Android模拟器来实现对安卓设备的自动化测试和操作。通过PythonAppium库(Appium-Python-Client),可以编写脚本来模拟用户在安卓设备上的操作,如启动应用、点击按钮、输入文本等。 要使用Python进行安卓模拟器操作,首先需要安装JDK、Pycharm(版本要求3.8以上)、Android Studio、Appium桌面版以及安装一个安卓模拟器。安装Android Studio后,可以从其中下载安卓模拟器。安装完成后,需要配置Android Studio和Appium桌面版的相关设置。 在编写Python脚本时,可以使用Appium-Python-Client库来调用Appium提供的方法,实现对安卓模拟器控制。例如,可以使用脚本打开模拟器上的Chrome浏览器,并在输入框中输入关键词进行搜索。 需要注意的是,Python安卓模拟器只能模拟设备上的操作,无法截取通信和内存信息。此外,操作安卓模拟器需要一些准备工作,包括安装相应的软件和配置环境变量等。详细的安装和配置步骤可以参考相关文档或教程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [用pythonappium写一个在安卓模拟器上的操作](https://blog.csdn.net/weixin_43770110/article/details/109404342)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值