В этой статье я рас­ска­жу о том, как я изу­чал воз­можность авто­мати­зации стре­митель­но набира­ющей популяр­ность игры Hamster Kombat. Не все испро­бован­ные так­тики ока­зались удач­ными, но, воз­можно, ты най­дешь мои методы полез­ными в иных ситу­ациях.

Рас­ска­зывать под­робно о самой игре не буду, о ней слы­шали, навер­ное, даже те, у кого нет мобиль­ного телефо­на. Нач­нем сра­зу с инте­рес­ного.

warning

Ре­дак­ция не рекомен­дует рас­смат­ривать Hamster Kombat как потен­циаль­ный источник заработ­ка: почему — есть под­робная статья на «Хаб­рахаб­ре». Мы будем под­разуме­вать, что име­ем дело с обыч­ной игрой, и исполь­зуем ее как популяр­ный при­мер, на котором мож­но про­демонс­три­ровать тех­ники авто­мати­зации.

 

Задача

Иг­ра запус­кает­ся через бота в Telegram, смысл зак­люча­ется в наращи­вании пас­сивно­го дохода с бир­жи. Уве­личи­вать доход мож­но с помощью покуп­ки кар­точек, каж­дая кар­точка дает опре­делен­ную при­бав­ку к доходу. День­ги для покуп­ки кар­точек добыва­ются дву­мя путями: из того самого пас­сивно­го дохода и нажима­нием боль­шой кноп­ки в цен­тре экра­на.

В про­цес­се игры у меня быс­тро появи­лось желание авто­мати­зиро­вать две вещи: нажатие на кноп­ку и выбор опти­маль­ных кар­точек для покуп­ки. У каж­дой кар­точки две основные харак­терис­тики: раз­мер при­бав­ки к доходу и цена. Одни кар­точки дают неболь­шую при­бав­ку и дорого сто­ят, дру­гие, наобо­рот, очень выгод­ны. Для прос­тоты ана­лиза я ввел понятие удель­ного дохода, ну или его еще мож­но наз­вать «цена при­бав­ки». Допус­тим, если кар­точка сто­ит мил­лион монет и дает при­бав­ку к доходу 4000 монет, зна­чит, цена при­бав­ки будет 1 000 000 / 4000 = 250 монет. Чем мень­ше цена при­бав­ки, тем целесо­образнее покуп­ка монеты.

Ха­рак­терис­тики кар­точки меня­ются пос­ле каж­дой покуп­ки, поэто­му на глаз все про­ана­лизи­ровать и выб­рать наибо­лее выгод­ную кар­точку по цене при­бав­ки прак­тичес­ки нере­аль­но. Для начала я сос­тавил таб­личку, добавил в нее все кар­точки и отсорти­ровал их по удель­ной доход­ности (цена/добав­ка). Все бы хорошо, но это не отме­няет необ­ходимос­ти пос­ле каж­дой покуп­ки вруч­ную обновлять изме­нив­шиеся харак­терис­тики кар­точки. Что ж, поп­робу­ем авто­мати­зиро­вать.

С ходу в голову при­шел оче­вид­ный спо­соб вза­имо­дей­ствия с игрой — ана­лиз изоб­ражения на экра­не и эму­ляция нажатий на экран с исполь­зовани­ем Android Debug Bridge (ADB). Конеч­но, в иде­але бы все сде­лать на зап­росах, вооб­ще без телефо­на, но для это­го надо ана­лизи­ровать тра­фик, а с уче­том того, что игра запус­кает­ся толь­ко на телефо­не, внут­ри Telegram, ана­лиз тра­фика мне показал­ся весь­ма тру­доем­кой задачей, поэто­му я решил начать с более оче­вид­ной реали­зации.

 

Автоматизация через ADB

 

Тапаем на экран

На­деюсь, что уста­нав­ливать ADB и вза­имо­дей­ство­вать через него с телефо­ном все уме­ют, поэто­му не буду лить воду про это, перей­дем сра­зу к делу. Попыт­ки запус­тить игру в Windows закон­чились неуда­чей, пос­коль­ку игра каким‑то обра­зом опре­деля­ет, что запуще­на не на телефо­не, и выводит сооб­щение об этом. Что ж, телефон — зна­чит, телефон. Воору­жаем­ся телефо­ном с Android, рас­чехля­ем ADB. Воп­рос с тапань­ем по кноп­ке лег­ко реша­ется одной коман­дой:

e:\Android\sdk\platform-tools\adb.exe shell input tap 540 1800

540 и 1800 — это коор­динаты точ­ки на экра­не, в которую мы хотим «ткнуть паль­цем». Что­бы не воз­вра­щать­ся к это­му вто­рой раз, сра­зу хочу ска­зать про так называ­емую мор­зянку. В игре каж­дый день есть воз­можность получить допол­нитель­ный мил­лион монет, вве­дя с помощью азбу­ки Мор­зе опре­делен­ный код. Точ­ка кодиру­ется корот­ким нажати­ем, тире — длин­ным. Делать корот­кое нажатие мы уже уме­ем, длин­ное же дела­ется вот такой коман­дой:

e:\Android\sdk\platform-tools\adb.exe shell input swipe 500 1500 500 1500 555

Пер­вые четыре чис­ла — коор­динаты начала и кон­ца дви­жения, а 555 — вре­мя дви­жения. В нашем слу­чае начало и конец сов­пада­ют.

Что­бы миними­зиро­вать руч­ную работу, мож­но написать на Python скрипт, который будет при­нимать на вход сло­во, переко­диро­вать его в пос­ледова­тель­ность точек и тире и через нажатия вво­дить в игру. При­веду основные фун­кции, которые понадо­бят­ся.

Фун­кция, которая эму­лиру­ет ввод точ­ки:

def tochka():
cmd = "adb.exe shell input tap 500 1500"
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, creationflags=0x08000000)
process.wait()

Фун­кция, эму­лиру­ющая ввод тире:

def tire():
cmd = "adb.exe shell input swipe 500 1500 500 1500 500"
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, creationflags=0x08000000)
process.wait()

Фун­кция, которая раз­бира­ет пос­ледова­тель­ность точек и тире и отправ­ляет ее в телефон (про­бел озна­чает паузу в три секун­ды, необ­ходимую для отде­ления букв друг от дру­га):

def mz2tap(morze):
for simvol in morze:
match simvol:
case ".":
tochka()
case "-":
tire()
case " ":
time.sleep(3)

Пе­рево­да тек­ста в азбу­ку Мор­зе касать­ся не буду, не ради это­го мы тут соб­рались. При­мер исполь­зования:

mz2tap(".--")
mz2tap(".")
mz2tap("-...")
mz2tap("...--")

С пер­вой задачей по авто­мати­зации тапов разоб­рались, теперь самое вре­мя занять­ся ана­лизом кар­точек, что­бы выбирать луч­шую.

 

Распознаём карточки

С кар­точка­ми приш­лось повозить­ся. К задаче я решил подой­ти в лоб — про­лис­тывать кар­точки и делать скрин­шоты, затем обре­зать лиш­нее и рас­позна­вать то, что оста­лось.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии