Новости из Блогов «Взлом» Клавогонок или первый опыт кодинга под OS X

Discussion in 'Мировые новости. Обсуждения.' started by Suicide, 15 Nov 2012.

  1. Suicide

    Suicide Super Moderator
    Staff Member

    Joined:
    24 Apr 2009
    Messages:
    2,373
    Likes Received:
    6,619
    Reputations:
    693
    «Взлом» Клавогонок или первый опыт кодинга под 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 (привязку элементов и получение свойств), был набросан такой интерфейс:

    [​IMG]

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

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

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

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

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