суббота, 2 мая 2015 г.

Акция Cheetos - лох это судьба

UPD: Я не лох - ссылка

Решил я поучаствовать в акции от Cheetos, купил аж 2 коробки этих палочек, ввёл первый код и увидел игру. Играл я в неё днями и ночами, но больше 20 тысяч не набирал. Что же это такое!? Мой мозг взрывался, но я продолжал хотеть этот убогий телефон!


И вот тут на помощь мне пришёл Delphi.



Решил я написать бота, вариантов реализации было несколько - начиная с браузера и заканчивая поиском карт по скриншоту. Но я решил остановиться на стандартном решение - обычные HTTP запросы.
Запросы никак не подписываются, нет CSRF токенов и естественно всё это дело отправляется на API что ещё больше облегчает нам задачу! Спасибо кодерам этой игры, теперь их можно уволить за криворукость и распи разгильдяйство о котором я расскажу ниже.

Давайте для начала изучим их API:

Игра создаётся следующим запросом:

 

GET _cheetos.ru/api/game/new

В ответ приходит:

{"level":1,"card":12,"time":45}

Где:
level - текущий уровень
card - количество карт
time - время в секундах

Запуск игры:

 

GET _cheetos.ru/api/users/code_is_activate

В ответ приходит статус:

{"activate":true}

Если True - игра началась, в противном случае будет False.


Получение карт:

 

GET _cheetos.ru/api/game/card_get?number={n}

Где {n} - номер ячейки

В ответ приходит:

{"number":1,"image":20,"success":null,"finish":false,"score":null}

Где:
number - номер выбранной карты
image - глобальный номер карты (всего их 40)
success - если предыдущая карта которую мы выбрали совпала с этой, значит это поле будет со значением True (пара найдена)
finish - значение True означает конец игры
score - общий счёт (переменная принимает значение только в конце игры).

Пишем бота 

 

Как видите - ничего сложного, разработчики упростили нам задачу. Осталось написать бота, тут опять же всё просто! Для наглядности писать бота я буду в виде консольного приложения, перенести в GUI не составит особых проблем.

Представляю блок схему алгоритма действий:

Исходный код бота: http://pastebin.com/VybRshsj 
Ctrl+C => Ctrl+V => F9 и Вы мэгокрутой кодер с огромным шансом получить мобилу.


Модифицируем бота



Бот работал медленно из-за однопоточной загрузки картинок, но сделать многопоточную загрузку невозможно, ведь надо посылать 2 запроса друг за другом что бы карты совпали. Пойдём другим путём - модифицируем алгоритм работы, будем во время загрузки проверять: есть ли текущая карта у нас в массиве или же нет. Если есть - выбираем её. 

Исходный код модифицированного бота: http://pastebin.com/dZGuJ8Ww

Но к сожалению это дало малый прирост скорости, раньше было 52 тысячи, сейчас 52800 но это можно списать на погрешность.


Это не баг, это фича

 

В самом начале статьи я написал про криворукость и разгильдяйство(в этом слове явно ошибка!) разработчиков, его тут много, очень много. Но я решил пойти честным путём и написал бота, работал этот бот С САМОГО НАЧАЛА АКЦИИ и я получал призы под разными аккаунтами, потом модифицировал его и уже под конец, когда я увидел как другие просекли фишку описанную ниже - решил тоже ей воспользоваться.

Как мы знаем - надо послать 2 запроса и что бы карты в них совпали. Но что будет если мы пошёлм 2 одинаковых запроса?

Пробуем:
_cheetos.ru/api/game/card_get?number=0
_cheetos.ru/api/game/card_get?number=0

В ответ приходит: 

{"number":0,"image":5,"success":true,"finish":false,"score":null} 

О чудо! Теперь модифицируем бота ещё разок:

Ссылка на часть кода: http://pastebin.com/QuVmcuJX

Вот таким незамысловатым способом мы нагнули крупную контору и теперь можно ожидать посылку с мобильником как нагнут нас.

Видео работы бота

 


(извиняюсь за качество видео)

Подытожим

 

Вот и подвели итоги розыгрыша, естественно меня спалили и ничего не дали, жестоко обломав мои надежды на "мэгокрутой пацанский телефон для чётких понтов перед одноклассниками". Но моим коллегам телефоны всё таки дали, но пока они их не получили ибо акция закончилась только вчера. Не надо думать что я делал это ради собственной выгоды, мои доходы позволяют мне купить весьма не дешёвые палочки (35р однако) в количестве двух коробок, а так же этот телефон. Я делал это ради just for fun и все телефоны которые получилось бы выиграть планировал отдать.

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

1 комментарий: