Пишемо бота для браузерної гри

браузерної

Все вже напевно в курсі про таку чудову веб-гра, як agar.io. У черговий раз програвши в ній щасливішому супернику, я тихо вилаявся про себе і вирішив якось зламати цю іграшку, щоб отримати нарешті в ній перевагу! В результаті мені вдалося створити собі загін ігрових ботів, які прагнуть знайти мене на карті, щоб влитися в мою ігрову клітку.

Влазимо в клієнт гри

Спершу треба було зрозуміти, як усе працює. Гра написана на JavaScript і спілкується з ігровим сервером через веб-сокет.

Основний ігровий скрипт лежить у файлі main_out.js. Код там звичайно ж обфусцований і всіляко намагається не давати себе запускати, звідки не слід:

Розгорнувши файл у читаний вигляд через дебаггер Хрома, постало питання: яким чином вклинитися в логіку гри?

Спочатку я вирішив створити локальну копію файлів і з'єднуватись із сервером, відключивши в браузері перевірку на кросдомен:

Це заробило для AJAX запитів ігрових регіонів, але подальші спроби з'єднатися по веб-сокету були відхилені. Потрібен був інший підхід.

Підмінюємо файли по урлу

Робочим рішенням стало завантаження справжнього ігрового клієнта, але заміна для браузера необхідних файлів на свої. Для цього встановлюємо чудову програму Fiddler Web Debugger і вказуємо потрібні шляхи у AutoResponder:

ботів

Такий підхід, очевидно, вимагає тримати Fiddler запущеним під час ігрової сесії.

Намагаємося обдурити сервер

Сервер своєю чергою не надсилає клієнту «зайвих» йому даних. Наприклад, коли я збільшив масштаб ігрової карти, то сервер все одно надсилав лише вікно об'єктів, яке я мав бачити в рамках своєї клітинки:

ботів

Здавалося б, всі шляхи закриті: сервер не довіряєклієнтам ніякої важливої ​​інформації все прораховує самостійно.

Але тоді можна обдурити сервер у межах його правил: створити зграю ботів, які постійно жертвуватимуть собою, збільшуючи мою масу. Але як же ботам знаходити мою клітку на карті? Виручило саме API сервера: якщо постійно відправляти йому наприклад координати (0, 0), то ігрова клітина завжди слідуватиме в цю частину карти без зупинки, поки не досягне мети. Замість нулів треба лише відправляти ботам мої поточні координати і вони самі приходитимуть до мене на вечерю!

Пишемо ботів у поточному вікні

Код клієнта одночасно отримує дані та перемальовує об'єкти на екрані. Можна було б відкрити 20 табів, керованих ботами та один мій ігровий таб. Але тоді треба було б передавати мої координати в сусідні таби. Плюс малювання кожного таба гальмувало б весь браузер (я пробував так і є). Тому було вирішено створювати нові ігрові сесії прямо в поточному тобі, але вимкнути для них зв'язок із відображенням:

Так само потрібно було дописати код, щоб при смерті бота він автоматично починав нову сесію.

Результати роботи

Боти створюються. І знаходять мене на карті!

пишемо

Однак, все не так райдужно.

По-перше, сервер розкидає гравців за ігровими кімнатами. Тому зі мною на карту із 50 ботів потрапляють 2-3. Інші «грають» в інших кімнатах, слідуючи за координатами із сусіднього Всесвіту.

По-друге, ботів може з'їсти хтось інший! Тому їм вдається прийти до мене десь кілька разів на хвилину.

І, нарешті, по-третє, боти маленькі. Йдучи до мене, вони не набирають особливої ​​маси. Тому, з певного етапу, їхній внесок у мою перемогу стає мінімальним.

Авторам гри вдалося створити чудовий мережевий код, якийне ламається від банального хакінгу. Однак гра не захищена від ботівництва і трохи розібравшись у коді клієнта, можна створити собі невелику технічну перевагу перед рештою.

Якщо ж вирішити питання про те, щоб боти підключалися на потрібну карту, тоді є можливість серйозно потіснити своїх менш технічно-підкованих суперників.

Я ж своєї маленької мети досяг:

пишемо
Можливо завдяки ботам, можливо мені пощастило самому.

Дякуємо за увагу та удачі в грі!

Ви можете допомогти і перевести небагато коштів на розвиток сайту

Коментарі (30):

Мені єдиному здається, що у цій грі не можна виграти завдяки якомусь плану. Зростання у розмірах відбувається лише завдяки великому рандому і він глобально не залежить від твоїх дій.

Залежить. Можна підкрадатися і з'їдати конкурентів поділом. Можна кидати приманки, можна вирощувати зелені рослини, щоб вони ділилися і розривали більшого конкурента на частини ... Шахи прям :)

Так. Насправді успіх у грі залежить насамперед від умінь гравця, а вже потім від удачі.

Для того, щоб стабільно вибиватися в лідери ніжно освоїти кілька прийомів: 1) розраховувати свою масу і масу противника, щоб при розподілі не опинитися в патової ситуації і не бути з'їденим; 2) розбивати лідерів за допомогою зубастих клітин; 3) обмінюватися масою між клітинами, що поділилися; 4) ретируватися поділом у разі загрози з боку лідерів;

їх можна вирощувати?

Так, стріляючи у них.

За допомогою кнопки W можна кидати масу в зелену рослину - від цього вона розпухає і в якийсь момент ділиться. Таким чином можна робити пастки для близьких до рослин суперників, розбиваючи їх на частини новим, що прилетіли до них.рослиною.

Круто, я теж користувався fiddler'ом, але хотів трохи інтелектуальнішого бота. Поділюсь своїм доробком трохи деобфусцованого скіпта, щоправда, однією з попередніх версій, gist.github.com/abby-sergz/65aad7682de388f14ee2.

Круто! Дякую! Вже є досягнення інтелекту бота?

Досягнень поки немає, основна причина - мало часу :)

По-перше, сервер розкидає гравців за ігровими кімнатами. Тому зі мною на карту із 50 ботів потрапляють 2-3. Інші «грають» в інших кімнатах, слідуючи за координатами із сусіднього Всесвіту.

Якщо я не помилився, сервер на одному ip містить багато ігрових кімнат. Тому що я підставляю один і той же IP для всіх ботів. Але до мене потрапляє лише частина. Інші крутяться з іншими гравцями. У результаті в кімнаті грає 15-20 гравців, на сервер може і 5000.

Хм, точно. Тестил із вкладками браузера. Якщо підключатися досить швидко, то потрапляю до однієї кімнати, якщо за деякий час, то вже кидає в іншу.

Кімнат там справді досить багато m.agar.io/info

в US-Fremont всього 3 кімнати на сервак)

Можна й простіше. Перед завантаженням видаляємо main_out зі сторінки та підвантажуємо свою копію. Приклад для GM або аналогів - pastebin.com/7ZhB5cVD

На жаль, працює не для всіх браузерів. «beforescriptexecute» було прибрано з Chrome.

Та й на youtube, до речі, такі самі боти-годувальники 8 днів як викладені: www.youtube.com/watch?v=XyLWCdnff2A

Я пішов іншим шляхом. Ботов не став робити, а розколупав оригінальну js і зробив пачку покращень код на githab

Круто, ще б межі поля зробити видимими та прапори повернути)

Ага про поля як дістануся, зроблю. А прапори країн працюють навіть із Enemy Types Hack, зараз перевірив.

Я пішовдалі і взагалі виключив гравця, залишивши лише ботів, які кооперуються для виживання.

Свій код я ін'єктую за допомогою відладчика. Достатньо зупинити його в будь-якій внутрішній функції і ми маємо повний доступ до внутрішніх змінних. Так що можна через консоль створити замикання, що викликається за таймером, і можна робити що завгодно.

Інфа про свої клітини знаходиться у хеші "m". Інфа про решту клітин лежить у словнику «v». Цього вже достатньо для гри. Пробігаємося в циклі своїми клітинами і чужими і складаємо обчислені для пар «я — не я» прискорення. Потім сіпаємо на машині, щоб повідомити двигун в який бік ми хочемо прискоритися.

Усі чужі клітини поділяються на такі групи:

1. Віруси – зелені пасивні клітини, які можуть підривати інших. У них стоїть прапорецьвірусу. Від них відштовхуємося назад квадратичному закону.

2. Друзі - дружні роботи, що діють у сусідніх вкладках. Їх визначаємо за префіксом у імені. До них притягуємось із константною силою. Це дозволяє їм знаходити один одного навіть якщо відреспаунилися у різних кінцях карти.

3. Вороги — клітини, які більші за максимальний розмір, що ми можемо з'їсти. Від них відштовхуємось як отвірус, але з іншим коефіцієнтом.

4. Їжа — всі інші клітини, значно менші за нашу. До них притягуємося за квадратним законом.

Крім того, щоб бота не затискали до стінки, додаємо відштовхування від них у перпендирулярних до них напрямках за тим самим законом зворотних квадратів.

Разом це дозволяє тікати від групи ворогів поїдаючи їжу, що трапляється по шляху, і зливатися з друзями утворюючи більшу особину. Однак люди все ще можуть хитрістю затиснути нашого бота в лещата або порвати його, прострілюючи через вірус.

Щобвідреспаунитися, достатньо викликати функцію setNick(string). Я її викликаю просто завжди під час виклику мого замикання.

Фото рекорду:

ботів