托纳姆编程补充篇——AirScript

2024/08/10533 浏览整活专区

1.前言

最近偷偷看哔哩哔哩的时候发现,一个用python专门写脚的平台,发现做的相当让我满意,集成的功能和我以前写的几乎一样,它支持python几乎所有的标准库并且他还集成了openCVyolov5ocr,和我前面讲的不谋而合,而且对这些功能也做了一些比较方便的封装,最主要的是,他是在安卓手机上本地运行的,意味着就算没有电脑也可以用来写python代码,就算不写脚用来学习也非常方便,从脚的方面看他也不强制需要root,主要还是集成度高了上手难度低了,测试了一下运行速度也不错,兼容性也很好,真的做的很不错。

2.环境安装

这个我就不讲了,几乎没什么好讲的,而且这个平台社区环境感觉还勉强算可以,可以在b站上找到一些相关教程,官网也是全中文的文档

3.代码

主要还是稍微讲一下代码,说实话我前面写的几乎可以直接放到这个平台上用,只有微小的差别,主要是我以前写的是通过电脑发送adb指令给手机或模拟器,而现在,这个平台的是主要是脱离电脑离线运行,所有在和手机交互的代码需要小小的更改一下,然后ocr,yolo也不需要我们那么辛苦的配置环境了,他集成封装的很好。
1.首先是获取蓝量
TapTap
#
获取蓝量这个函数基本没什么变化,只是加了一个比色的函数,我原本写的函数,当我们满状态是,会隐藏血条和蓝量,这个时候,因此就找不到蓝条,就会代码会以为我们蓝量为零。现在稍微修改一下,如果没有血条就返回满蓝。
TapTap
所有函数都可以在文档里找到
2.然后是技能释放
TapTap
几乎没有什么变化,就是前面说的和手机交互的代码变了一下
TapTap
TapTap
3.最后是清理背包
TapTap
TapTap
其实已经没什么了把点击,滑动和截图改一下就可以了
TapTap
然后这个ocr,用起来也比原来方便很多了,封装的很不错
TapTap
然后以前我清理背包是一个一个删,稍微修改了下改成了多选
__init__.py
import time
from .tool import release_skill, clear_backpack
clear_list = ['蝙蝠耳朵', "柔软围巾"]   # 要删除的物品
a = time.time()
while True:
    release_skill()
    if time.time() - a > 2 * 60:    # 多少分钟后清理背包
        clear_backpack(clear_list)
        a = time.time()
too.py
import cv2 as cv
import numpy as np
from ascript.android.ui import ImageWindow
from ascript.android import screen
from ascript.android.ui import Dialog
from ascript.android import action
from ascript.android.screen import CompareColors
import time
# 谷歌OCR 识别中文,并使用自动分割
from ascript.android.screen import Ocr
# # 将内存截图Bitmap转换为cv img
# img = screen.bitmap_to_cvimage()
def getBule(img):
    if not CompareColors.compare('801,42,#6A4C13|802,49,#776634|806,55,#7D6B36', 0.9):
        return 20
    HSV = cv.cvtColor(img, cv.COLOR_BGR2HSV)  # 转换图像为HSV格式
    # 设置颜色阈值
    lowerColor = np.array([48, 100, 200])  # 取范围最低值
    upperColor = np.array([55, 220, 255])  # 取范围最高值
    # 提取指定部分(指定区域变白,其他变黑)
    binary = cv.inRange(HSV, lowerColor, upperColor)
    # 运用中值滤波去除噪声
    median = cv.medianBlur(binary, 9)
    # 这里使用轮廓检测cv2.findContours()的方法,并且返回contours轮廓信息,以及hierachy层级(这里用不到)。
    contours, hierachy = cv.findContours(median, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
    # cv.drawContours(img, contours, -1, (0, 0, 255), 3)
    # cv.imshow("img", img)
    # cv.waitKey(0)
    BlueAmount = 10 + len(contours)  # 绿色一格等于两格
    if len(contours) != 0:
        contours = sorted(contours, key=cv.contourArea)
        if cv.contourArea(contours[0], oriented=False) < 91:
            BlueAmount -= 1
    else:
        lowerColor = np.array([80, 220, 220])  # 取范围最低值
        upperColor = np.array([90, 240, 255])  # 取范围最高值
        binary = cv.inRange(HSV, lowerColor, upperColor)
        median = cv.medianBlur(binary, 9)
        contours, hierachy = cv.findContours(median, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
        BlueAmount = len(contours)
        if len(contours) != 0:
            contours = sorted(contours, key=cv.contourArea)
            if cv.contourArea(contours[0], oriented=False) < 71:
                BlueAmount -= 1
    return BlueAmount
def release_skill():
    img_screen = screen.bitmap_to_cvimage()
    if getBule(img_screen[47:64, 482:804]) < 4:
        action.click(1056, 139)
        time。sleep(6)
        action.click(1172, 184)
        time。sleep(1)
    action.click(932, 138)
    time。sleep(0.2)
    action.click(932, 138)
    time。sleep(0.2)
    action.click(932, 138)
    time。sleep(0.2)
    action.click(932, 138)
    time。sleep(2)
def clear_backpack(item_list):
    img_screen = screen.bitmap_to_cvimage()
    action.click(1048, 244)  # 打开背包
    time。sleep(0.5)
    action.click(473, 186)  # 打开多选
    while True:
        img_screen = screen.bitmap_to_cvimage()
        if img_screen[624, 1266][1] > 20:
            # 点删除
            action.click(349, 184)
            time。sleep(0.5)
            action.click(658, 601)
            time。sleep(2)
            action.click(1225, 60)  # 关闭
            break
        bpx, bpy, epx, epy = 630, 124, 1243, 640
        img = img_screen[bpy:epy, bpx:epx]
        HSV = cv.cvtColor(img, cv.COLOR_BGR2HSV)  # 转换图像为HSV格式
        # 设置颜色阈值
        lowerColor = np.array([18, 121, 100])  # 取范围最低值
        upperColor = np.array([19, 248, 156])  # 取范围最高值
        # 提取指定部分(指定区域变白,其他变黑)
        binary = cv.inRange(HSV, lowerColor, upperColor)
        # 高斯模糊
        median = cv.GaussianBlur(binary, (7, 7), 0, 0)
        # 边沿
        edges = cv.Canny(image=median, threshold1=100, threshold2=200)
        # 闭运算
        kernel = np.ones((5, 5), np.uint8)
        edges = cv.dilate(edges, kernel)
        edges = cv.erode(edges, kernel)
        contours, hierachy = cv.findContours(edges, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
        # 后两个为轮廓检索模式和轮廓逼近模式
        if len(contours) == 0:
            # 点删除
            action.click(349, 184)
            time。sleep(0.5)
            action.click(658, 601)
            time。sleep(2)
            action.click(1225, 60)  # 关闭
            break
        # 计算每个轮廓的面积并保存到字典中
        contour_areas = {i: cv.contourArea(contour) for i, contour in enumerate(contours)}
        # 根据面积对字典进行排序
        sorted_contour_areas = dict(sorted(contour_areas.items(), key=lambda item: item[1], reverse=True))
        # 获取排序后的轮廓索引
        sorted_contour_indices = list(sorted_contour_areas.keys())
        for i in sorted_contour_indices:
            if contour_areas[i] < 13000:
                break
            M = cv.moments(contours[i])
            if M["m00"] != 0:
                cX = int(M["m10"] / M["m00"])
                cY = int(M["m01"] / M["m00"])
                action.click(cX + bpx, cY + bpy)
                time。sleep(1)
                texts = Ocr.mlkitocr_v2([47, 429, 441, 463])
                if texts:
                    if texts[0].text not in item_list:
                        action.click(cX + bpx, cY + bpy)
                # 删除
                # if text.text in item_list:
                #     d.click(349, 184)
                #     time。sleep(0.5)
                #     d.click(658, 601)
                #     time。sleep(0.5)
        # 下翻
        action.swipe(1118, 500, 1118, 117, 800)
        time。sleep(1)
环境是雷神模拟器,分辨率1280*720,dpi240
15
17
8