Ноя 132012
 

Содержимое статьи несет в себе исключительно информационный характер и не принуждает вас к нечестной игре.
Слово «Взлом» в названии статьи не совсем соответствует определению, разумеется, что никто не находил SQL-инъекций и не дампал базы данных, все гораздо (чуть больше, чем на 100%) законнее, плюс к этому обвинять вас не в чем, т.к. ничего недоказуемо.

Начать, пожалуй, следует с того, что есть «Клавогонки». Вообщем-то это простая браузерная игрушка, которая позволяет демонстрировать свое превосходство над другими более изощреным методом, чем убиванием боссов, фарма, и крафтинга реликтового оружия, говоря конкретнее, это не ММОРПГ. Суть в следующем: напечатать текст как можно быстрее, быстрее, чем это сделают остальные участники. Из основной идеи вытекают рюшки и плюшки, типа различных режимов, уникальных машин и т.п., но в результате, все равно все сводится к одному — ДАВИ КНОПКИ печатай текст.

Проехав около 10 гонок это слегка начинает надоедать, потому что в этой игре в топе находятся только офисные секретарши, которых ты не обгонишь печатанием на 10 клавиатурах одновременно. В результате было принято решение: ради общего развития и повышения ЧСВ написать программу, которая смогла бы хоть что-то противопоставить прокачанным игрокам. В этом меня поддержала пони-пегас Rainbow Dash, по совместительству Юра. Хоть в результате мы пошли разными путями, можно с гордостью сказать, что умение писать простые программы в некоторых ситуациях превосходит умение быстро ДАВИТЬ КНОПКИ набирать текст.

Что получилось в итоге:

  • Юра написал скрипт, который с помощью определенных манипуляций заставлял сервер неправильно считать (?) скорость. Плюс этого метода в том, что прокачка аккаунта может быть совершена без участия пользователя, т.е. на удаленном сервере, например по крону. К минусам я бы отнес «палевность» — при желании по логам очень просто спалить наличие автоматизированного игрока.
  • Я написал десктопную-прогу, которая просто печатает текст в поле для ввода. Ко всему этому был прикручен интерфейс и намеренный допуск ошибок (по желанию пользователя, разумеется). Плюсы и минусы прямо противоположны скрипту — невозможность автоматизации, но меньшая заметность. Честно говоря, мое решение мне нравится больше, потому что можно видеть как все происходит, как автоматически набирается текст, а руки лежат не на клавиатуре.

Скрипт Юры я описывать не буду, потому что если он захочет, то сможет сделать это сам , а еще я в нем ничего не понял, но опустим этот факт. Расскажу только про свой.

Изначально скрипт был написан на чистом AppleScript (первое, что попалось под руку). Скажу, что язык неплохой, хоть в нем и мало функционала, но есть крутые возможности манипуляции с окнами, которые очень пригодились. Также он умеет получать результаты функций, который может выполнять в фоновом терминале, говоря проще — может создать невидимый фоновый терминал, выполнить в нем команду, а полученный результат сунуть в переменную. Например, таким образом у меня реализована работа с HTTP, которой нету в комплекте. Синтаксис проблем не вызывает, врубился в него очень быстро. В качестве примера приведу функцию plural и её аналог на JS (с которого она писалась). В них есть небольшое отличие, внимательный читатель должен его заметить.

Javascript:

  plural = function(a, str1, str2, str3) {
    if (a % 10 === 1 && a % 100 !== 11) {
      return str1;
    }
    if (a % 10 >= 2 && a % 10 <= 4 && (a % 100 < 10 || a % 100 >= 20)) {
      return str2;
    }
    return str3;
  };

AppleScript:

    on plural(n, str1, str2, str3)
        if ((n mod 10 = 1) and (n mod 10011)) then ¬
            return ("" & n & " " & str1)
 
        if ((n mod 102) and (n mod 104) and (n mod 100 < 10 or n mod 10020)) then ¬
            return ("" & n & " " & str2)
 
        return ("" & n & " " & str3)
    end plural

Как видно, разница небольшая. div и mod напомнили о паскале, а вот отсутствие && и || для меня оказалось менее приятными. Дополнили картину юникодовские ≥ и ≠ вместо привычных >= и !=, хотя кстати это добавляет наглядности коду и смотрится неплохо.

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

        tell application "Google Chrome" to activate
        tell application "System Events"
            repeat len times -- len - сколько раз повторить (длина текста)
                keystroke character a of input -- a - счетчик цикла, input - текст, keystroke - функция отправки клавиши
                delay delayt -- delayt - время ожидания перед вводом другой части 
                set rand to random number from 1 to 100 -- а этот кусок отвечает за допускание ошибок
                if rand ≤ errors then -- errors это шанс в процентах
                    keystroke "а" -- mad skillz в части допуска ошибок, просто пишет букву а
                    delay 0.5 
                    keystroke (ASCII character 8) -- после этого отправить клавишу backspace, не нашел другого способа
                end if
                set a to a + 1 -- счетчик цикла
            end repeat
        end tell

Очень понравилось написание кода в стиле «книжки», например: set rand to random number from 1 to 100
После написания AppleScript’a нему был приделан GUI, это не вызвало особых проблем, потому что Xcode предлагает доступ к Cocoa и через него. Потратив пару часов на разборки с самой IDE (привязку элементов и получение свойств), был набросан такой интерфейс:

Затем старый скрипт был натянут под этот GUI + добавлено несколько рюшек.
В результате получилось то, что показано на этом видео:

После этого видео логичнее всего было бы дать ссылку на исходники или на компилированный вариант, но хочу вас обломать: мы договорились с Юрой не портить жизнь создателям игры, потому что с их стороны для защиты приложения сделано все возможное, в нашем случае нам помогла кое-какая случайность, которую мы тоже не хотим афишировать.

Напоследок скажу, что AppleScript, разумеется, не запустится под Windows, так что даже если бы я выложил тут что-то — большинство людей не могло бы это использовать. Если бы мне надо было сделать под Windows — я бы делал на C#, т.к. этим языком я более-менее владею. На 90% уверен, что все это можно запросто реализовать на ahk, но его я не знаю.

Всем удачи, спасибо, если кому-то хватило лишнего времени это прочитать.

P.S. Для тех, кому интересно, откуда у меня OS X — отвечаю: никаких яблочных компьютеров у меня нет, стоит хакинтош, в планах есть написать статью, в которой бы поделился опытом и которая бы, надеюсь, избавила вас от некоторых вопросов, которых лично у меня, при установке хакинтоша, возникло большое количество.