前言
最近喜欢玩公主连结,之前也喜欢玩阴阳师之类的游戏。 此类游戏将具有诸如初始编号之类的东西,或者可以发行的东西。
其实作为程序员,这些事情完全可以通过写代码的形式,手动帮我们完成。 游戏脚本似乎并不难。 最简单的体验方式就是下载一个Airtest,直接拍几张图,写几层代码,然后就可以按照自己的逻辑玩游戏了。
其实这篇文章不是讲如何使用Airtest,而是用原来的python+opencv来实现里面的操作。
这三天写了一个刷公主连结初始号的程序,算不上游戏脚本的老手。 本文主要是分享一些基础技术和使用中的经验。
计划工作
首先,我们必须完成以下计划。
这里我把adb和tesseract放在了百度云盘里,顺便放了一个录制的疗效视频。
链接:pan.baidu.com/s/1edTPu2o7... 提取码:33aw
python库安装
pip install pillow pytesseract opencv-python
复制代码
另外,如果需要,可以安装uiautomator2,本文不做介绍。
使用 adb 获取 Android 设备
这里主要涉及到单个Android设备的ADB连接操作。 首先,我们打开模拟器。
然后我们调用adbdevices获取当前的Android设备,这里是一个模拟器。
收到后可以调用adbshell测试是否可以进入Android设备的shell环境,确认可以输入exit退出。
如果有时候进不了shell,可以先调用adbkill-server,再调用adbdevices。
可能常用的 ADBShell 命令
然后是一些ADB命令操作。 通过adb命令辅助卡盟,我们可以使用python来操作Android设备。
截图
最常见的操作是截屏。 首先调用screencap进行截图并放置到Android设备上,然后将截图下拉到笔记本中。
def take_screenshot():
os.system("adb shell screencap -p /data/screenshot.png")
os.system("adb pull /data/screenshot.png ./tmp.png")
复制代码
下拉文件
下拉文件就是刚才的adb pull。 以公主连结为例bat执行python脚本,下面的代码可以导入账号信息的xml,然后就可以通过xml进行登录了。
os.system(f"adb pull /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml ./user_info.xml")
复制代码
上传文件
有了下拉,自然会有上传,可以通过adbpush来完成。 以公主连结为例,以下代码即可完成账号切换。
# 切换账号1
os.system("adb push ./user_info1.xml /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml")
# 切换账号2
os.system("adb push ./user_info2.xml /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml")
复制代码
单击屏幕上的某个位置
def adb_click(center, offset=(0, 0)):
(x, y) = center
x += offset[0]
y += offset[1]
os.system(f"adb shell input tap {x} {y}")
复制代码
输入文字
text = "YourPassword"
os.system(f"adb shell input text {text}")
复制代码
删除字符
有时候输入框会有输入缓存,我们需要删除字符。
# 删除10个字符
for i in range(10):
os.system("adb shell input keyevent 67")
复制代码
查询当前运行的包名和Activity
通过下面的代码可以查询当前运行程序的Activity,也可以顺便查看包名。
adb shell dumpsys activity activities
复制代码
停止应用程序
有时需要停止一个应用程序,需要提供应用程序的包名。
adb shell am force-stop tw.sonet.princessconnect
复制代码
打开应用程序
要打开应用程序,您需要提供包名称和 Activity。
adb shell am start -W -n tw.sonet.princessconnect/jp.co.cygames.activity.OverrideUnityActivity
复制代码
图像处理
处理图像的第一件事是搜索图像。 比如Airtest提供的,无非就是判断截图里有没有图片,有的话在什么地方。
此外,还需要一些切口。 比如我们要获取账号id和账号级别,就需要截取一部分图片,然后进行OCR操作。
图片搜索
图片搜索好像是先获取两张图片,然后调用cv2.matchTemplate方法判断是否存在以及位置。 这里的匹配是比较模糊的匹配,会有相似的概率,最高为1。我们设置一个阈值来判断模板是否在截图中。
截图如下,文件名为tmp.png:
模板如下:
代码如下:
import cv2
def image_to_position(screen, template):
image_x, image_y = template.shape[:2]
result = cv2.matchTemplate(screen, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
print("prob:", max_val)
if max_val > 0.98:
global center
center = (max_loc[0] + image_y / 2, max_loc[1] + image_x / 2)
return center
else:
return False
if __name__ == "__main__":
screen = cv2.imread('tmp.png')
template = cv2.imread('Xuandan.png')
print(image_to_position(screen, template))
复制代码
运行上面的代码后,可以看到模板匹配的概率为0.9977,位置为(1165,693)。 对于一张图片,左上角是原点。 由于我的帧率是1280*720,所以右下角的坐标是(1280,720)。 你可以看到我们的菜单似乎就在右下角。
如何快速裁剪模板? (win10)
游戏脚本虽然不难写,但是需要切很多图,而且这个图的码率必须和原图一样。我发现如果在win10中打开图片为图片
可以保证使用QQ截图的帧率与图片本身的帧率一致。
这时候QQ直接抓取的模板就可以直接用于识别了。
图像裁剪
然后发现有时需要裁剪一些图像。 其实我们的模板图片也可以通过裁剪图片得到。 这样的模板图片是最准确的。
裁剪当然是需要裁剪的位置,还有需要的高度和长度。 说白了,就是一个长方形的区域。 下面的代码是使用 PIL 库实现的。
from PIL import Image
def crop_screenshot(img_file, pos_x, pos_y, width, height, out_file):
img = Image.open(img_file)
region = (pos_x, pos_y, pos_x + width, pos_y + height)
cropImg = img.crop(region)
cropImg.save(out_file)
print("exported:", out_file)
if __name__ == "__main__":
crop_screenshot("tmp.png", 817,556, 190, 24, "test_id.png")
复制代码
里面的代码以拦截玩家id为例。
运行代码后,截图如下:
简单的文字识别
得到上述图像信息后,进行OCR,即光学字符识别。 这里的代码很简单,调用API即可。
from PIL import Image
import pytesseract
image = Image.open('test_id.png')
content = pytesseract.image_to_string(image) # 识别图片
print(content)
复制代码
不过需要注意一点,pytesseract识别出来的结果会带有空格符、换行符等符号。 当你确实需要使用它们时bat执行python脚本,你可以过滤一些字符。
结束
本篇到这里就结束了,主要介绍ADB和images相关的一些基本操作。 感谢您的收看。
本文文字和图片来源于网络加上本人的观点。 它们仅用于学习和交流。 它们没有任何商业用途。 版权归原作者所有。 如有任何问题,请及时联系我们解决。