托纳姆编程补充篇——AirScript
1.前言
最近偷偷看哔哩哔哩的时候发现,一个用python专门写脚的平台,发现做的相当让我满意,集成的功能和我以前写的几乎一样,它支持python几乎所有的标准库并且他还集成了openCV,yolov5,ocr,和我前面讲的不谋而合,而且对这些功能也做了一些比较方便的封装,最主要的是,他是在安卓手机上本地运行的,意味着就算没有电脑也可以用来写python代码,就算不写脚用来学习也非常方便,从脚的方面看他也不强制需要root,主要还是集成度高了上手难度低了,测试了一下运行速度也不错,兼容性也很好,真的做的很不错。
2.环境安装
这个我就不讲了,几乎没什么好讲的,而且这个平台社区环境感觉还勉强算可以,可以在b站上找到一些相关教程,官网也是全中文的文档
3.代码
主要还是稍微讲一下代码,说实话我前面写的几乎可以直接放到这个平台上用,只有微小的差别,主要是我以前写的是通过电脑发送adb指令给手机或模拟器,而现在,这个平台的是主要是脱离电脑离线运行,所有在和手机交互的代码需要小小的更改一下,然后ocr,yolo也不需要我们那么辛苦的配置环境了,他集成封装的很好。
1.首先是获取蓝量
获取蓝量这个函数基本没什么变化,只是加了一个比色的函数,我原本写的函数,当我们满状态是,会隐藏血条和蓝量,这个时候,因此就找不到蓝条,就会代码会以为我们蓝量为零。现在稍微修改一下,如果没有血条就返回满蓝。
所有函数都可以在文档里找到
2.然后是技能释放
几乎没有什么变化,就是前面说的和手机交互的代码变了一下
3.最后是清理背包
其实已经没什么了把点击,滑动和截图改一下就可以了
然后这个ocr,用起来也比原来方便很多了,封装的很不错
然后以前我清理背包是一个一个删,稍微修改了下改成了多选
__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