Боты для браузерных игр на AutoIT

Вместо предисловия

Сегодня я получил ссылочку на статью на хабре о технологии создания «макроса-бота для браузерной игры». Там же было написано с сожалением, что AutoIT мало представлен на хабре. Со штуками, описанными в статье я баловался год-два назад. В последнее время использую библиотеку IE.au3, которая позволяет творить с браузерными игрушками просто чудеса.Собственно информацией об этом и хотел бы поделиться. Только сразу предупреждаю — речь идет только работе под MS-Internet Explorer. Фанатам других браузеров скажу сразу — можно тоже самое делать наверное под любым браузером, только нужно искать соответствующую библиотеку и как они работают я сказать не могу. Скажу только о библиотеке IE.au3 — она входит в комплект стандартной установки AutoIT-а, достаточно хорошо протестирована, снабжена комментариями и примерами, описанные в ней функции удобно подсвечиваются и предлагаются к завершению при наборе с соответствующими подсказками, как стандартные функции пакета (или как там назвать этот самый AutoIT).

Выбор жертвы

В качестве примера работы AutoIT-а с браузерными играми предлагаю игру «Моя деревня» (оригинальное название игры “My Free Farm”) — http://www.mojaderewnja.ru/.Игра реально напрашивается на автоматизацию, потому что заставляет выполнять слишком много рутинных действий. Например, если Вы не будите платить в проект около 180 рублей ежемесячно, то посадку и поливку растений Вам нужно будет делать вручную. А это обычно 120 кликов по полю, только чтобы посадить растения, затем 120 кликов чтобы полить. Полей может быть не один и не два, а до десятка. А некоторые растения растут минут 10, так что такие кликанья либо отбивают желание играть либо заставляют платить за казуальную игрушку ежемесячно сумму, за которую можно иметь месяц скромного интернета или хорошее кабельное телевидение. Так что автоматизировать «Мою деревню» — это просто то, что нам нужно.Выглядит поле для обтыкивания так:
image

Вариант №1 — примитивный вариант

Ищем на экране куда тыкать, и тыкаем «мышей» куда надо. Сразу скажу – это вариант неправильный, но для общей эрудиции я приведу текст скрипта с пояснениями.Кусок №1: ищем на экране «точку отсчета», за которую можно будет зацепиться и от неё считать местоположение квадратиков куда будем обтыкивать поле.
Func GetTopLeftCorner($window)
 Global $x = 0, $y = 0
 WinActivate($window, "")
 If WinActive($window) Then
  $size = WinGetPos("[active]")
  For $i = 1 To $size[3]
   If CheckRGB(PixelGetColor($x + $i, $y + $i), Dec("402215"), Dec("5A352A")) Then
    If CheckRGB(PixelGetColor($x + $i - 259, $y + $i), Dec("331A0D"), Dec("624232")) Then
     For $j = $i To 1 Step -1
      If not CheckRGB(PixelGetColor($i + 1, $j), Dec("000000"), Dec("3A301D")) Then
       $x = $i
       $y = $j
       ExitLoop(2)
      EndIf
     Next
     ExitLoop
    EndIf
   EndIf
  Next
 EndIf
EndFunc
Функция проверяет цвета точек, пробегая по диагонали, ищет левый край окна игры в браузере. Затем просматривает цвета точек, пробегая вверх, ищет верхнюю границу окна игры. Найденную точку я буду считать «точкой отсчета». Расстояние от неё до каждой клетки на поле игры фиксированное и легко вычисляется по индексу.Результат работы функции возвращается в глобальных переменных $x и $y, которые соответствуют координатам точки по горизонтали и вертикали соответственно.При вызове функции в качестве параметра нужно указать заголовок окна программы. Его можно задать вручную, определив предварительно с помощью утилиты AutoIt Window Info, которая устанавливается вместе с AutoIt-ом.Приведенный выше скрипт использует самодельную функцию CheckRGB:
Func CheckRGB($color, $min, $max)
 Local $rgb[3][3]
 $res = True
 $rgb[2][0] = BitAND($min, Dec("FF0000")) / Dec("10000")
 $rgb[1][0] = BitAND($min, Dec("00FF00")) / Dec("100")
 $rgb[0][0] = BitAND($min, Dec("0000FF"))
 $rgb[2][1] = BitAND($color, Dec("FF0000")) / Dec("10000")
 $rgb[1][1] = BitAND($color, Dec("00FF00")) / Dec("100")
 $rgb[0][1] = BitAND($color, Dec("0000FF"))
 $rgb[2][2] = BitAND($max, Dec("FF0000")) / Dec("10000")
 $rgb[1][2] = BitAND($max, Dec("00FF00")) / Dec("100")
 $rgb[0][2] = BitAND($max, Dec("0000FF"))
 For $i = 0 To 2
  If $rgb[$i][0] > $rgb[$i][1] Or $rgb[$i][1] > $rgb[$i][2] Then
   $res = False
   ExitLoop
  EndIf
 Next
 Return $res
EndFunc
— Функция проверяет цвет точки, передаваемой в качестве первого параметра $color на то, чтобы она находилась в цветовом диапазоне от $min до $max, с учетом трех составляющих цвета точки (RGB). Возвращает, соответственно True или False.

Непосредственно процедура обтыкивания всех клеток на поле выглядит так:
For $i = 1 To 12
 For $j = 1 To 10
  MouseClick("left", $x + ($i * 40) + 103, $y + ($j * 40) + 172, 1, 1)
  Sleep(25)
 Next
Next
Тут все понятно. 10 и 12 в заголовках цикла это размер поля в клетках. Константы в параметрах MouseClick вычислены с помощью той же утилиты AutoIt Window Info, относительно определенной ранее «точки отсчета». Значение задержки в Sleep можно менять по своему желанию – это будет влиять на скорость обтыкивания, но слишком быстрое может приводить к ошибкам выполнения скрипта игры.

Преимущество этого метода – он работает в любом браузере. Везде где можно открыть окно игры так, чтобы была видна вся пашня.Недостаток – окно игры должно быть всегда открыто, нужно подбирать скорость обтыкивания и во время работы скрипта нельзя трогать мышь (иначе тыкнет не там где надо).

Вариант №2 — правильный вариант

Мы не используем указатель мыши вообще. Вместо этого, мы тыкаем на нужном объекте, загруженном в браузере IE по его ID. (ID этих клеток можно посмотреть в HTML коде загруженной страницы, они имеют названия f1-f120 соотвественно).
Local $i, $j, $n
Local $oIE = _IEAttach($gamewindowname)
For $i = 1 To 12
 For $j = 0 To 9
  $obj = _IEGetObjById($oIE, "f" & (12 * $j + $i))
  If $obj <> 0 Then $obj.click()
 Next
Next


Вариант №3 — самый правильный вариант

Недостатком предыдущего варианта является то, что когда нам нужно обтыкать поле, нам нужно переключиться из игры и запустить скрипт. Это неудобно. По-настоящему удобный скрипт не должен заставлять выполнять дополнительные действия в целях экономии на других рутинных операциях. Поэтому, я просто заменяю стандартное действие в игре «посадить одну семачку» на «засадить все поле выбранными семенами». Выглядит этот так:
$obj = _IEGetObjById($oIE, "anpflanzen")
If $obj <> 0  Then _
 $obj.outerHTML = "… тут кусок HTML кода, который для удобства привожу отдельно “
Вот этот кусок HTML-кода для вставки в предыдущий фрагмент:
<SPAN id=anpflanzen class=link onclick="
 selectMode(0,true,selected);
 var i, j, s, n = 0;
 for (i = 1; i < 13; i = i + rackElement[selected].x)
  for (j = 0; j < 10; j = j + rackElement[selected].y) {
   s = 12 * j + i; cache_me(" & $zone & ", s, garten_prod[s], garten_kategorie[s], n++);}">

<IMG onmouseover="this.src='http://mff.wavecdn.de/mff/garden_menue_seed.gif'; showDiv('tooltipseed')" onmouseout="this.src='http://mff.wavecdn.de/mff/leer.gif'; hideDiv('tooltipseed')" src="http://mff.wavecdn.de/mff/leer.gif" width=53 height=68>
<DIV style="DISPLAY: none" id=tooltipseed class=blackbox onmouseover="showDiv('tooltipseed')" onmouseout="hideDiv('tooltipseed')" src="http://mff.wavecdn.de/mff/leer.gif">посадить всё</DIV></SPAN>
Сам код и скрипты на JavaScript позаимствованы из оригинального HTML кода игры и подгружаемого вместе с ней файла скриптов, и немного переделаны с полива на посадку.
Поделиться публикацией

Похожие публикации

Комментарии 38
    +8
    Более того, видел интеллектуального бота для MMOGPG сделанного на AutoIT.

    Очень полезная штука. На работу удалось автоматизировать процесс на который у бухгалтера ушло бы месяца два, а AutoIt сделал за выходные.
    Ну или вот:
    habrastorage.org/storage1/020f1efa/a0a6dca6/ee62db42/91bbcfb9.png
      +1
      Я как-то очень давно делал бота, который при игре в сапёра не давал кликать по минам, а потом «вслепую» проходил сапёра на глазах у изумлённых друзей. Жаль исходники посеял 8(
        +1
        К саперу у меня особое отношение.
        Когда учился в универе, на 1 или 2 курсе по программированию нужно было для курсовой сделать игру на Паскале. Я делал сапера. Использовал все свои тогдашние познания, даже были ассемблерные вставки для отрисовки анимации. Но препод не поставил мне высший балл только из-за того, что не было зала славы. Ну как он сказал. Сейчас конечно понимаю, что возможно код был кривоват. Тяжело сейчас оценить, т.к. исходиники естественно потеряны. Но осадок остался.
        Вот и возникла идея таким образом отыграться, когда появилась возможность. :)
      +2
      Для браузерок намного полезнее использовать iMacros (особенно, если в связке с JS-движком его). Там такое навертеть можно, что «кликанье» будет казаться детским лепетом.
      Например, один из моих ботов собирал статистику по игрокам подходящего уровня. Потом из этой статистики выяснял кто когда активно играет. И в это время их атаковал (ага, привет клоны bitefight). Золота за победу давали 20-30% того, что есть на руках, так что я не бедствовал )
      Другой бот ходил в экспедиции, переодевался, лечился.
      Сейчас потихоньку всё то же самое пишу на баше, но времени не хватает.
        0
        насколько я понял iMacros для флеша беспомощен?
          0
          Можно кликать по координатам.
            +8
            Написать что делать с флешем (не AutoIt/iMacros)?
              +1
              давайте! было бы очень интересно.
              0
              конечно пишите!
                0
                Дизассемблировать и изучать протокол?
            0
            inkvizitor68sl, я пока с iMacros не знаком, но судя по тому что Вы пишите, хоту отметить, что у AutoIt-а другая идеалогия. Он позволяет создавать приложения, которые следят за действиями пользователя и помогают ему в разных приложениях.
            А на счет ботов — эти куски исходников из полноценного бота на AutoIt-е, который проверяет когда созреет урожай, устанавливает таймер, по таймеру убирает урожай, засеивает новыми семенами, поливает и устанавливает таймер заново. И все это незаметно для пользователя. Все что видит пользователь — значек в трее и может открыть небольшое окно управления ботом.
              0
              > Все что видит пользователь — значек в трее и может открыть небольшое окно управления ботом.
              А всё, что видит администратор игры — то, что к нему приходит не FireFox, right)?

              iMacros тоже может помогать действиям пользователя (там есть sleep, ожидание клика и прочее), нужно лишь правильно написать. В целом — да, на макросах тяжелее создать универсального бота, зато легче создать нечто сложное.
              А запустить его можно в отдельном окне ФФ (которое можно свернуть в трей) и спокойно пользоваться вторым окном.
              +1
              самое сложное в ботоводстве, когда бот уже умеет делать то что нужно — это ваять ему интеллект, продумывать на несколько шагов вперед
                0
                Согласен, но это справедливо только для игр, в которых присутствует хоть какоето принятие решений игроком. В «Моей деревни» такого нет — там просто механическая тыкалка :) и таких игр сейчас много. Я это называю «преобразование времени в игровые ресурсы». Тоесть все что нужно от игрока — просто вовремя совершать одни и те же действия. Справедливости ради добавлю, что в «Моей деревни» есть еще торговля и «зачаточная экономика», но эти действия лучше совершать вручную, «бот» только выдаёт справочную информацию по ценам на продукты и насколько выгодны сделки по их продаже.
                0
                Пользую AutoHotKey автор коей некогда отделился от проекта AutoIt ибо захотел внедрить несколько новых плюшек. Правда пользую исключительно в рабочих целях — времени сокращает тьму.
                  +2
                  Тру способ — это взять Qt, создать экземпляр WebKit и программно им управлять. При необходимоси можно анализировать как HTML структуру страницы так и картинки если там активно применяется флэш. Ну и нет необходимости показывать како-то «окно» или кликать реальной «мышкой» — приложение может быть вообще консольным :)
                    +1
                    Тру способ — написать userscripts…
                      0
                      Я в своё время так и сделал. Про AutoIt не знал, хотя, думаю сейчас, что хватило бы его.
                      +3
                      А собственно для чего все это? Пророщенные репки потом продавать можно? Если так не нравиться тыкать мышкой, то зачем себя насиловать? Настает новое поколение игр которые играют сами в себя. У меня жена играет в гоночки какие-то в одноклассниках где ты вообще никак не влияешь на процесс. Просто жахаешь «старт» и потом тебе сообщают выиграл ты или проиграл. Я не понимаю фана.
                        –1
                        боты хорошо продаются, правда они потом хорошо банятся :) но можно выпускать фиксы. я бы на месте игрописателей выпускал бы ботов вместе с игрой, расширяя рынок. игрокам без разницы как они получат СУПЕРМЕЧ за 10$ или купив бота за 10$ и оставив комп на ночь рубится.
                          +2
                          Не играл уже в онлайн игры год точно, раньше участвовал в нескольких проектах в качестве консультанта.
                          Действия примерно такие:
                          — создаётся игра
                          — делается реклама
                          — создаётся промо-сайт бота
                          — спам на официальном форуме про этого бота, типа «вот он играет с ботом я видел, я знаю!» при этом игроки банятся показательно, а эти игроки когда-то были тестовые акки разработчиков, они всегда были в топе и всех их знали как лучших игроков))
                          — все начинают понимать что в топе только боты
                          — поиск, покупка
                          — те кто им не нравятся или на кого поступают жалобы что он бот, банят, особенно интересно если человек вложил денег, чем больше, тем лучше, ведь он зарегистрируется заного скачает новую версию бота, вложит ещё денег.
                          — появляются боты конкуренты, разные самописные, порой лучше ботов разработчиков
                          — наступает война ботов…
                          К примеру одна из таких контор Destiny Development, у них много однотипных игр
                            +1
                            наступает война ботов…
                            а Сару Коннор сажают в психушку. мдя, видимо так и рождается скайнет…
                            +1
                            Не все боты вычисляются, особенно «кликеры», потому что они эмклируют действия человека. Программе очень сложно определить кто кликнул мышку человек или скрипт. Обычно «банят» уже за результаты, например — слишком резко вырвался вверх в рейтинге, но это не очевидный показатель и если в игре присутствует такая практика, то там страдает много невинных игроков.
                              0
                              Думаю, если бот продается, а значит, имеет шанс попасть в руки разработчиков игры, то можно ловить бота на основе поведения. Допустим, между какими-то двумя действиями бот всегда делает задержку ровно на 1 с (или всегда от 3 до 10 секунд, никогда больше и никогда меньше и т.п.) или постоянно перезагружает какую-нибудь страницу для мониторинга текущих игровых ресурсов. В общем, любые бехевиоральные характеристики, которые обычный человек воспроизвести не может или не может делать это несколько часов подряд.

                              Другое дело, при грамотном подходе к написанию бота у вас будут рандомные задержки (с настраиваемым пользователем интервалом) и прочие ухищрения, позволяющие максимально скопировать поведение рядового игрока.
                            0
                            Какая бы тупая игра не была, главное РЕЙТИНГ ИГРОКОВ!!! Все онлайн игры заключаются в первую очередь на помериться сами знаете чем :)
                              0
                              «Не все йогурты одинаково полезны». Аналогично, не все игры (даже онлайновые) одинаковые и тем более не все игроки едины в стремлении чем то меряться. Я знаю просто массу людей которые играют только в целях получения удовольствия, а не чем то «меряться». Возможно причиной является мой возраст, который определяет отсутствие «школоты» в списке моего общения.
                              Но статья не об этом, а о том, как на AutoIt-е автоматизированть рутинные процессы на конкретном примере. Хотел бы призвать обсуждение вернуться к теме.
                            +1
                            Что же, если вы хотеле показать, что AutoIT на это способен, то вам это определенно удалось. Молодцы за то что разобрались и потратили время на это. Но если же вы хотели показать инстрементарий с помощью которого можно автоматизировать действия по работе с браузерами, то определенно AutoIT не лучший инструментарий для этого. Для этих целей есть более мощные средства. Одним из которых будет связка Selenium + Java (не обязательно Java, можно также C#, PHP, Ruby etc). Selenium позволяет много вкусных плюшек реализовать для работы с браузером и все это будет кроссбраузерно.
                              +1
                              а я по старинке на старом uopilot читерю=)
                                0
                                + боты написанные в виде дополнений для хрома( при загрузке нужной страницы, с нужными данными выполняем на ней определенный javascript).
                                  0
                                  UOPilot навсегда в моем сердце.
                                    +1
                                    не выдержал, залогинился

                                    я был адептом EasyUO

                                    потом перешел в автоматизацию тестирования
                                      0
                                      фишка уопилота в том, что он может работать не только с УО, а вобще почти с любыми программами.
                                      а для УО конечно изиуо покруче будет. ну и еще гендальф, injection и прочие забавные штуки.
                                  +1
                                  Забавно. Как раз сейчас потихоньку доделываю бота, который в «Зомби-ферму» фермерствует. Причина банальна — игра бесконечно тупа, но хочется посмотреть на все постройки. В итоге бот круглосуточно сажает/собирает урожай и перерабатывает его для чуть большего профита.
                                  Сам бы такое не выдержал. При этом ведь есть те кто реально играет и не донатствует при этом. Ужас.
                                    0
                                    что такое «Зомби-ферма»? это оригинальное название или «слэнг»?
                                    +2
                                    Вот часть бота для Travian, написал в свободное время на шарпе неделю назад. Умеет торговать на аукционе, сейвить войска, детектить атаки с посылкой смс на телефон, фармить по расписанию, анализировать и посылать разведку, строить здания по расписанию ну и ещё пару мелких фич для себя
                                    хттп ://clip2net.com/clip/m61513/1314225014-clip-52kb.png?nocache=1

                                    Если кому интересно, можете плюсануть в карму до 5 — напишу в песочницу статью как реализовывал и как реализовал антибан.
                                      0
                                      Я для Ragnarok Online скрипт-кликалку писал на AutoHotKey. На серверах где была проблема с ботами была отличная замена. Он кормил гомункула, складывал вещи, отвечал на простенькую защиту от бездействия, умел выращивать растения и еще чего-то по мелочам.

                                      В гильдии на расхват шел.
                                        0
                                        тоже как то писал бота для игры в браузерную игру, bash+sed+grep+wget.
                                        в зависимости от наличия тех или иных значений в ответе сервера делал тот или иной запрос POST/GET.
                                        Да, конечно работало криво, но было скорее для разминки сделано чтобы навыки консоли не позабыть за виндузовыми интерфейсами работы…

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

                                        Самое читаемое