Писать игровые скрипты на питоне оказалось так просто

Python Идентификация изображения

предисловие

Недавно я играл в Princess Link и раньше играл в такие игры, как Onmyoji.В таких играх будет что-то вроде начального числа или что-то, что может быть полезным для печени.

Конечно, как программист, такие вещи, как печень, можно делать автоматически, написав код. Сценарий игры не очень продвинутый.Самый простой способ испытать это — загрузить Airtest, напрямую вырезать несколько картинок, написать несколько слоев кода, а затем вы можете играть в игру в соответствии со своей собственной логикой.

Конечно, в этой статье речь пойдет не о том, как использовать Airtest, а об использовании оригинального python+opencv для реализации вышеуказанных операций.

За последние два дня я написал программу для обновления начального номера Princess Link, и я не ветеран написания игровых сценариев.Эта статья в основном предназначена для того, чтобы поделиться некоторыми основными методами и опытом.

Готов к работе

Во-первых, нам нужно завершить следующие приготовления.

  • Android-устройствоО: Можно использовать эмулятор или реальную машину.
  • УстановитьADBи добавить в системуPATHгде: adb используется для
  • Установитьtesseract-ocrи добавить в системуPATHЛи: Помогите нам добиться простого распознавания символов
  • Установитьpython3.7версия выше

Вот я вставил adb и tesseract в сетевой диск Baidu, и кстати есть записанное видео с эффектом.

Ссылка на сайт:Disk.Baidu.com/Yes/1Ed TPU2Oh 7…Код извлечения: 33aw

установка библиотеки питона

pip install pillow pytesseract opencv-python

Кроме того, при необходимости можно установитьuiautomator2, эта статья не охватывает эти знания.

использоватьadbПолучить Android-устройство

Здесь мы в основном задействуем операцию подключения ADB одного устройства Android.Сначала мы открываем эмулятор.

Затем мы звонимadb devicesЧтобы получить текущее устройство Android, я здесь эмулятор.

Далее вы можете позвонитьadb shellПроверьте, можете ли вы войти в среду оболочки устройства Android, и подтвердите, что вы можете войтиexitПросто выйдите.

Если вы иногда не можете войти в оболочку, вы можете сначала вызвать ееadb kill-server, а затем позвонитеadb devices.

Возможные общие команды ADB Shell

Далее приведены некоторые командные операции 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Теперь, взяв в качестве примера ссылку принцессы, следующий код может экспортировать xml информации об учетной записи, а затем вы можете войти в систему через xml.

os.system(f"adb pull /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml ./user_info.xml")

загрузить файлы

В раскрывающемся списке будет загрузка, черезadb pushзавершить. Взяв в качестве примера Princess Link, следующий код может завершить переключение учетной записи.

# 切换账号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")

Запрос текущего имени пакета и активности

С помощью следующего кода вы можете запросить активность текущей программы, а также, кстати, проверить имя пакета.

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). Вы можете видеть, что наше меню на самом деле находится в правом нижнем углу.

Как быстро обрезать шаблон? (победа 10)

Сценарий игры на самом деле не то чтобы код писать сложно, но картинок нужно много вырезать, и эти картинки должны быть такого же разрешения, как и оригинал. Обнаружил, что в 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")

В приведенном выше коде в качестве примера используется перехват идентификатора игрока.

После запуска кода скриншоты выглядят следующим образом:

Простое распознавание текста

После получения вышеуказанной информации об изображении выполняется OCR, то есть оптическое распознавание символов. Код здесь очень простой, достаточно вызвать API.

from PIL import Image
import pytesseract

image = Image.open('test_id.png')
content = pytesseract.image_to_string(image)   # 识别图片
print(content)

Однако следует отметить, что результат, распознаваемый pytesseract, будет содержать такие символы, как пробелы и символы новой строки, а некоторые символы можно фильтровать, когда они действительно используются.

The End

Эта статья заканчивается здесь. В основном она знакомит с некоторыми основными операциями, связанными с ADB и изображениями. Некоторое содержание, такое как мульти-открытие и uiautomator2, не написано, потому что я пока не использовал их. Baidu не должно быть сложным. Код относительно уродлив и не доведен до совершенства, так что давайте не будем от него отказываться.