«Взлом» Клавогонок или первый опыт кодинга под OS X 13.11.2012 http://bafoed.net/post/12648/ Содержимое статьи несет в себе исключительно информационный характер и не принуждает вас к нечестной игре. Слово «Взлом» в названии статьи не совсем соответствует определению, разумеется, что никто не находил SQL-инъекций и не дампал базы данных, все гораздо (чуть больше, чем на 100%) законнее, плюс к этому обвинять вас не в чем, т.к. ничего недоказуемо. Начать, пожалуй, следует с того, что есть «Клавогонки». Вообщем-то это простая браузерная игрушка, которая позволяет демонстрировать свое превосходство над другими более изощреным методом, чем убиванием боссов, фарма, и крафтинга реликтового оружия, говоря конкретнее, это не ММОРПГ. Суть в следующем: напечатать текст как можно быстрее, быстрее, чем это сделают остальные участники. Из основной идеи вытекают рюшки и плюшки, типа различных режимов, уникальных машин и т.п., но в результате, все равно все сводится к одному – ДАВИ КНОПКИ печатай текст. Проехав около 10 гонок это слегка начинает надоедать, потому что в этой игре в топе находятся только офисные секретарши, которых ты не обгонишь печатанием на 10 клавиатурах одновременно. В результате было принято решение: ради общего развития и повышения ЧСВ написать программу, которая смогла бы хоть что-то противопоставить прокачанным игрокам. В этом меня поддержала пони-пегас Rainbow Dash, по совместительству Юра. Хоть в результате мы пошли разными путями, можно с гордостью сказать, что умение писать простые программы в некоторых ситуациях превосходит умение быстро ДАВИТЬ КНОПКИ набирать текст. Что получилось в итоге: -Юра написал скрипт, который с помощью определенных манипуляций заставлял сервер неправильно считать (?) скорость. Плюс этого метода в том, что прокачка аккаунта может быть совершена без участия пользователя, т.е. на удаленном сервере, например по крону. К минусам я бы отнес «палевность» — при желании по логам очень просто спалить наличие автоматизированного игрока. -Я написал десктопную-прогу, которая просто печатает текст в поле для ввода. Ко всему этому был прикручен интерфейс и намеренный допуск ошибок (по желанию пользователя, разумеется). Плюсы и минусы прямо противоположны скрипту – невозможность автоматизации, но меньшая заметность. Честно говоря, мое решение мне нравится больше, потому что можно видеть как все происходит, как автоматически набирается текст, а руки лежат не на клавиатуре. Скрипт Юры я описывать не буду, потому что если он захочет, то сможет сделать это сам , а еще я в нем ничего не понял, но опустим этот факт. Расскажу только про свой. Изначально скрипт был написан на чистом AppleScript (первое, что попалось под руку). Скажу, что язык неплохой, хоть в нем и мало функционала, но есть крутые возможности манипуляции с окнами, которые очень пригодились. Также он умеет получать результаты функций, который может выполнять в фоновом терминале, говоря проще — может создать невидимый фоновый терминал, выполнить в нем команду, а полученный результат сунуть в переменную. Например, таким образом у меня реализована работа с HTTP, которой нету в комплекте. Синтаксис проблем не вызывает, врубился в него очень быстро. В качестве примера приведу функцию plural и её аналог на JS (с которого она писалась). В них есть небольшое отличие, внимательный читатель должен его заметить. Javascript: Code: 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: Code: on plural(n, str1, str2, str3) if ((n mod 10 = 1) and (n mod 100 ≠ 11)) then ¬ return ("" & n & " " & str1) if ((n mod 10 ≥ 2) and (n mod 10 ≤ 4) and (n mod 100 < 10 or n mod 100 ≥ 20)) then ¬ return ("" & n & " " & str2) return ("" & n & " " & str3) end plural Как видно, разница небольшая. div и mod напомнили о паскале, а вот отсутствие && и || для меня оказалось менее приятными. Дополнили картину юникодовские ≥ и ≠ вместо привычных >= и !=, хотя кстати это добавляет наглядности коду и смотрится неплохо. В процессе написания, я нашел небольшой баг, на котором держится вся программа, публиковать его не буду, потому что начнется хаос. Вместо этого лучше подарю вам кусок, который отвечает за ввод текста в браузер: Code: 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 + добавлено несколько рюшек. В результате получилось то, что показано на этом видео: http://youtu.be/jNVNTd0raZY После этого видео логичнее всего было бы дать ссылку на исходники или на компилированный вариант, но хочу вас обломать: мы договорились с Юрой не портить жизнь создателям игры, потому что с их стороны для защиты приложения сделано все возможное, в нашем случае нам помогла кое-какая случайность, которую мы тоже не хотим афишировать. Напоследок скажу, что AppleScript, разумеется, не запустится под Windows, так что даже если бы я выложил тут что-то — большинство людей не могло бы это использовать. Если бы мне надо было сделать под Windows — я бы делал на C#, т.к. этим языком я более-менее владею. На 90% уверен, что все это можно запросто реализовать на ahk, но его я не знаю. Всем удачи, спасибо, если кому-то хватило лишнего времени это прочитать. P.S. Для тех, кому интересно, откуда у меня OS X — отвечаю: никаких яблочных компьютеров у меня нет, стоит хакинтош, в планах есть написать статью, в которой бы поделился опытом и которая бы, надеюсь, избавила вас от некоторых вопросов, которых лично у меня, при установке хакинтоша, возникло большое количество.