python+adb+orc实现安卓模拟器脚本编写

python+adb+orc实现安卓模拟器脚本编写

最近在玩一个手游,一个功能操作十分繁琐耗时,所以想用py写一个手游脚本。

1.采用py调用adb来实现控制安卓模拟器点击,截图,滑动等操作。

#1.连接模拟器
import os
# 第一种方法
os.system('adb devices')
# 第二种方法
os.popen('adb devices')
#2.点击
#order如果只有一个模拟器可不填写,如果存在多个模拟器则需要填写模拟器的ip
order=127.0.0.1:5555
p=(100,100)
str=f'adb -s {order} shell input tap {p[0]} {p[1]}'
os.system(str)
#3.滑动
#从p1滑动到p2,滑动时间time毫秒
p1=(100,100),p2=(200,200)
time=500
str=f'adb -s {order} shell input swipe {p1[0]} {p1[1]} {p2[0]} {p2[1]} {time}'
os.system(str)
#4.截屏
#android_path和img表示截图存放的位置,雷电模拟器有一个特殊的路径模拟器和pc文件互通
order=127.0.0.1:5555
android_path=r'/storage/emulated/0/Pictures/Screenshots/'
img='py01.png'
str=f"adb -s {order} shell screencap -p {android_path}{img}"
os.system(str)

2.py通过与安卓互通目录拿到截图然后再进行识图或者orc识别或其他处理。

#自己尝试了一下pytesseract的文字识别,奈何效率和准确度实在感人,
#自己训练字库也十分麻烦,索性用了百度orc,真香
@tryagin
def baiduorc(image):
	# 百度ai上注册orc应用获得3个key,每天免费调用5W次
    appid='xxx'
    aipkey='xxx'
    secretkey='xxx'

    client=AipOcr(appid,aipkey,secretkey)
    """ 读取图片 """
    # def get_file_content(filePath):
    #     with open(filePath, 'rb') as fp:
    #         return fp.read()

    # image = get_file_content(filePath)

    """ 调用通用文字识别, 图片参数为本地图片 """
    result=client.basicGeneral(image)
    # 拿到识别的数据后可以验证是否是自己需要的数据
    word=result['words_result']
    try:
        list1=list(map(lambda x:x['words'],word))
        str=''.join(list1)
    except:
        raise Exception(f'文字识别错误,response:{result}')

    try:
        k = re.findall('[\u4e00-\u9fa5]+', str)[0]
        v = re.findall('\d+', str)[0]
        return (k,int(v))
    except:
        raise Exception(f'文字识别错误,word_str:{str}')

# 考虑到可能识别有误,写了个校验的装饰器,在这里跟大家分享一下
def tryagin(fun):
    num_=0
    def inner(*args,**kwargs):
        nonlocal num_
        try:
            result=fun(*args,**kwargs)
            # print(result)
            num_ = 0
        except Exception as e:
            num_ += 1
            if num_ <= 3:
                print(f'文字识别出现错误,正在尝试第{num_}次')
                result=inner(*args,**kwargs)
            else:
                raise Exception(f'文字识别失败,已尝试{num_}次')
        return result
    return inner

from PIL import Image
![在这里插入图片描述](https://img-blog.csdnimg.cn/202102161751378.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4MzgxMDQ1,size_16,color_FFFFFF,t_70)

pc_path=r'..\leidian\Pictures\Screenshots'
# orc之前进行灰度处理提高准确度和效率
image=Image.open(pc_path).convert('L')
# 对图片进行切割,再orc识别
boxlist=[
        image.crop(p1 + p5),
        image.crop(p2 + p6),
        image.crop(p4 + p8),
        image.crop(p5 + p9),
        image.crop(p7 + p11),
        image.crop(p8 + p12),
        image.crop(p10 + p14),
        image.crop(p11 + p15),
        ]
dic={
     }
for box in boxlist:
     fake_file = io.BytesIO()
     box.save(fake_file,format='png')
     k,v=baiduocr(fake_file.getvalue())
     dic.setdefault(k,v)
# 读取到想要的内容后就可以进行后续的脚本处理,在这里就不在赘述

你可能感兴趣的:(python,ocr)