Давно, пару лет назад, я написал бот-клацалку на AutoIt к Безумию, из интереса что можно реализовать в подобной браузерке с помощью кликера. Вышло неудачно, работало не во всех версиях флеш плагина т.к. шрифты отображались немного по разному и поиск изображений часто сбивался.
Решил вернуться к этой теме, но написать нормально, без участия клиента. Но ребята из ПФ за это время существенно усложнили систему авторизации. В этой теме хочу попробовать с вашей помощью победить ее)
Итак, что у меня получилось на данный момент:
1. Авторизация вконтакте.
Тут все просто, логин-пароль авторизация через login.vk.com с редиректом на страницу игры.
2. Парсим страницу игры и канвас
Получаем реквизиты для VK API (пригодятся позже).
Вытаскиваем из страницы игры URL канваса.
Получаем канвас (canvas.php) с сервера ПФ. В канвасе содержится скрипт с flashvars для swfobject, который создает embed с URL прелоадера и ссылки на методы API серверов PF. В процессе получаем auth_key.
3. Инициализируемся
Вызываем метод init, получаем базовую информацию, ссылки на SWF игры, XML библиотеку и таймстамп сервера. Библиотеку парсить буду позже, это тонна информации (вес в несжатом виде больше 5 мбайт!), там вся инфа об игре (предметы, боссы, квесты, локации, сообщения).
Таймстамп сервера как я понял нужен для синхронизации внутренних часов флеша с временем сервера, т.к. он возвращается и передается с каждым запросом, и в декомпильнутой SWFке имеет вид
Код:
this._server_time = this._last_received_server_time + (getTimer() - this._last_server_time_sync_timestamp) * 0.001;
Т.е. с каждым запросом часы синхронизируются.
4. Тянем с ВК информацию о юзере
Все просто, несколько последовательных запросов к API ВК, получаем профиль, ID друзей, город, страну. Повторяем все как в клиенте.
5. Авторизачия в игре
Для следующего этапа нужно отправлять параметры sig и time. Как получить time я написал выше, процедура генерации sig аналогична таковой для VK API (массив пар "параметр=значение", отсортированные по алфавиту и склеенные в одну строку + secret, зашитый в SWF). sig проверял на примере реального запроса, все сходится. Сравнивал запросы на метод auth, сгеерированные мной и клиентом - идентично. Куки при этом не отправляются никакие, заголовки в CURL идентичны оригиналу. Но! На мой запрос приходит error. Или где-то еще что-то зарыто, или я ошибся. Помогите победить) Дальше интереснее, нужно будет победить параметр hi, который я пока не совсем понимаю как генерить.