Как сделать мини-игру с Кузей с помощью голосового бота. Часть 1: Управление персонажем

Вот бывает же такое. Вроде еще вчера я поиграл в Dendy, обнял плюшевого мишку и закрыл глаза, а сегодня проснулся мужиком за тридцать.
И вокруг уже всё изменилось. Трава не такая зеленая, колбаса не по ГОСТу, по 2х2 Сейлор Мун не крутят с утра. Особенно жалко тех, кто и вправду крут, ведь они больше не смогут отведать «супер-батончик Финт».
Со всем можно смириться, но вот только одно не дает мне покоя. Не смогли мы с сестрой в 90-е дозвонится в передачу «Позвоните Кузе». Шансов поиграть у нас конечно же не было, но мечта осталась.
Но это же Хабр, а не клуб любителей ностальгировать. Поэтому сегодня мы напишем простейший веб сервис, затем вооружимся голосовым ботом VoiceBox. И в результате реализуем функции управления с телефона для простенькой игры на движке Godot.
Даже если вы не знакомы с продуктом от компании MTT, всё равно есть смысл почитать статью, ведь в следующем материале мы вместе с вами напишем нехитрую аркаду про Кузьму и подключим к ней управление с телефона.
- Пара слов про домовенка Кузю
- Что будем делать
- Веб-сервис
- Сценарий VoiceBox
Пара слов про домовенка Кузю
«Позвоните Кузе» — это телепередача выходящая в конце 90-х на телеканале РТР. По сути отечественная адаптаций датской передачи про телевизионного тролля Hugo, которая успешно разошлась во множестве стран.

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

Ведущие всячески подбадривали игроков, особенно когда у них были проблемы с управлением.
В детстве я думал, что игроки просто «тупят» и мы бы с сестрой справились бы куда, лучше. Однако, пересмотрев пару роликов в более осознанном возрасте, я стал подозревать, что скорее всего проблемы крылись в оборудовании и телефонных линиях.
Именно этот прекрасный эффект неотзывчивого управления с помощью тонального набора на телефоне мы сегодня повторим.
Что будем делать
На Хабре есть интересное интервью про то, как энтузиасты Кузю восстанавливали. Мы сегодня так делать не будем. Главная цель для меня: написать игру, в которой можно управлять персонажем с помощью обычного телефона, в том числе городского.
Поэтому вместо домовёнка Кузи у нас будет ничуть не менее обаятельный, собственноручно нарисованный кот по имени Кузьма. Который решил сбежать от бабы Яги в лучший мир на остров котов, где все котики живут в любви и сытости.

Да, это не совсем то, что вы могли ожидать, но я честно вложил душу в кота, ворон и облака.
В целом план такой:
- Написать простой веб-сервис для управления персонажем через запросы к API.
- Подготовить сценарий для VoiceBox, который будет по нажатию клавиш в тональном режиме, вызывать API и передавать в него команду для движения персонажа вверх или вниз.
- Написать мини-игру на движке Godot 4 и собрать всё вместе.
Я решил не раздувать материал до вселенских масштабов. Поэтому сегодня мы реализуем только первые два пункта плана, а с котом Кузьмой познакомимся поближе в следующей статье.

Как видите схема достаточно простая. Поэтому предлагаю перейти ближе к делу.
Веб-сервис
Как вы уже поняли из схемы, VoiceBox и наша игра будут общаться через веб-сервис.
Поскольку я не программист, мы напишем сервис по принципу «лишь бы работало», без обработки ошибок и прочих хороших практик. Вы всегда сможете его дописать самостоятельно.
Материалы для сервиса можно взять в GitHub.
Сервис состоит из следующих компонентов:
- command.php — скрипт, в котором реализованы GET и POST методы API
- control.db — база данных SQLite3
- log.txt — файл лога запросов к API создаётся после первого запроса к нему.
База данных
Состоит всего из одной таблицы commands:

- id — идентификатор записи
- key — команда up / down
- phone — телефон, с которого пришел запрос к API, нужно чтобы определить звонящего.
- timestamp — используем для поиска последнего запроса
- is_readed — флаг того, что команда прочитана.
Я оставил данный набор полей на случай, если вы решите доработать логику. В принципе если поставить задачу вырезать всё лишнее, то нам нужны только столбцы phone, key, is_readed.
Скрипт command.php
Простейший скрипт на языке PHP, будет работать практически на любом хостинге.
Полный листинг скрипта под спойлером:
querySingle($sql); // set other not not processed to processed // (in this simple case we use only last not processed command, but you can improve it) $sql = "UPDATE commands SET `is_readed`=1 WHERE `phone` = '$phone' AND `is_readed`=0 "; $result = $db->querySingle($sql, true); // set API response $response = array('key' => $result_key, 'phone'=> $phone ); break; // POST method case "POST": // add new not processed command in DB $sql = "INSERT INTO commands (`key`,`phone`, `timestamp`, `is_readed`) VALUES('$command','$phone','$dt',0)"; $result = $db->querySingle($sql); // set API response $response = array('key' => $command, 'phone'=> $phone ); break; default: echo ''; break; > //return response echo json_encode($response);
Поскольку код примитивный я не буду его отдельно разбирать.
Просто опишу методы API.
Метод [GET] command.php
Получает последнюю команду для перемещения персонажа и помечает её прочитанной.
Request Query params:
- phone (string) — номер телефона, с помощью которого управляем игрой (должен совпадать с тем, что будет прописан в конфигах игры).
Response
- key (string) — команда для перемещения персонажа (up / down);
- phone (string) — номер телефона, с помощью которого управляем игрой.
Example:
Пример успешного запроса (код 200 ОК)
URL: /command.php?phone=79001112233
Если есть необработанная команда:
Если нет необработанной команды:
- получаем телефон из запроса;
- ищем в БД все необработанные записи, у которых совпадает телефон и флаг is_readed = 0;
- возвращаем самую последнюю по времени запись;
- всем остальным проставляем is_readed = 1, чтобы больше не мешались.
Вы можете заменить логику, например, обрабатывать команды последовательно по одной, от самой первой пришедшей к самой последней.
Метод [POST] command.php
Записывает новую команду для перемещения персонажа.
Request Query params:
- phone (string) — номер телефона, с помощью которого управляем игрой;
- command (string) — up / down команда на перемещение персонажа.
Параметры лучше передать в теле запроса, но я не хотел усложнять код.
Response
- key (string) — команда для перемещения персонажа (up / down);
- phone (string) — номер телефона, с помощью которого управляем игрой.
Example:
Пример успешного запроса (код 200 ОК).
/command.php?phone=79001112233&command=up
Проверить сервис можно с помощью cURL или Postman, не обязательно сразу подключаться к VoiceBox.
- получаем телефон и команду из запроса:
- записываем их в БД с флагом is_readed = 0.
Логи — log.txt
Чтобы убедится, что сервис работает мы пишем логи.
Я пишу в логи телефон, команду, и дату+время запроса.
79001112233 up 2023-06-25T01:01:00+03:00 // POST 79001112233 2023-06-25T01:01:00+03:00 //GET
Сценарий VoiceBox
Я уже как-то писал туториал по работе со сценариями VoiceBox.
Кстати, с тех пор у сервиса появилась вполне себе достойная документация, поэтому в этой статье объяснять буду кратко и только то, что необходимо.
Для тех, кто не помнит: VoiceBox — это голосовой бот от компании МТТ. Бот может выполнять разные функции, от простого интерактивного меню, до сложных сценариев с голосовым управлением. Бот может как принимать так и совершать вызовы.
Прочитать этот раздел все же не будет лишним, ведь вы можете перенести похожую логику в какой-то другой инструмент.
Алгоритм действий предельно прост.
- обработать входящий вызов;
- поприветствовать пользователя;
- включить интерактивное меню — обработать нажатие клавиши на телефоне;
- Если нажата клавиша 2 или 8 отправить HTTPS запрос на метод [POST] command.php;
- если нажата 2 параметр command = up;
- если нажата 8 параметр command = down;
Если вы внимательно читали алгоритм, то заметили упоминание о лимите команд. Он действительно есть.
«Методом тыка» я понял, что независимо от того, используем мы «интерактивное меню» или связку с распознаванием ввода и последующей его обработкой, больше трех раз в один блок ввода данных войти нельзя (ну или я не нашел как это обойти). Предположу, что это защита от зацикливания.
Поэтому мне пришлось выкручиваться. Я решил что
640 КБ на самом деле хватит всем12 раз ввести команду вверх или вниз, достаточно, чтобы пройти игру. Так что я просто руками повторил 4 блока с интерактивным меню. В крайнем случае всегда можно перезвонить еще раз.Теперь вы готовы увидеть простой и одновременно запутанный алгоритм сценария, под название voicebox-godot.

Если не обращать внимания на вереницу связей, то все достаточно просто.
Давайте пробежимся по основным блокам:
Входящий сценарий
Определяет основные параметры вызова. Для меня было важно, что вызов входящий (то есть мы звоним работу).
Голос Филиппа мне показался вполне подходящим для этой игры. Хотя можно выбрать женский или другой мужской голос.
Из этого блока мы переходим в «Приветствие»

Приветствие
Это блок «Проигрыватель». В нашем случае он озвучивает записанный текст.
По совету Н. я решил процитировать знаменитый фильм.

Далее переходим в блок «Интерактивное меню»
Ввод данных (1 — 4)
Все блоки данных в целом одинаковые.
В блоках обрабатывается по 3 запроса на ввод.
Если нажата «2», переходим в блок «Send Up».
Если нажата «8», переходим в блок «Send Down».
Для блоков 1-3 после исчерпания лимита настроен переход в блок «Ввод данных» под следующим порядковым номером.
«Ввод данных 4» после исчерпания лимита посещений идёт в блок «Перезвоните».

Send Up / Send Down
Блоки для отправки https запроса к API. По сути одинаковые, различаются только параметром command (up / down).
Стоит обратить внимание на подстановку переменной > .
Это встроенная переменная, в которую записывается номер абонента звонящего голосовому боту. Вы можете нажать кнопку «проверить» и отправить пробный запрос.
В таком случае вам придется вручную ввести значение переменной > в модальном окне. Это логично, потому что в данном случае голосовому боту никто не звонит.

В случае успеха мы возвращаемся на самый первый «Ввод данных». Если там исчерпан лимит посещений, мы спустимся по цепочке.
В случае ошибки, завершаем вызов.
Перезвоните
Тоже проигрыватель. Произносит текст: «Перезвоните».
Конец
Блок отбоя вызова. У него нет параметров.
После создания сценария, не забудьте его сохранить.
Далее необходимо перейти в раздел кампаний и создать новую кампанию, к которой будет привязан наш сценарий.
Введите название, установите тип «Входящие звонки» выберите сценарий, выберите номер, на который будем звонить (его может быть необходимо приобрести).

Ну вот и всё, план на сегодня выполнен.
Осталось присоединить все что мы сегодня сделали к игре. Но это мы сделаем в следующий раз.
Во второй части статьи мы с вами создадим мини-игру на движке Godot 4, затем подключим к ней веб-сервис и сценарий VoiceBox.
В результате котом Кузьмой можно будет управлять не только с помощью клавиатуры, но и с помощью любого современного телефона, прямо как в знаменитой телепередаче.
Подписывайтесь, чтобы не пропустить вторую часть материала.
UPD: Вторая часть статьи уже вышла.

- voicebox
- голосовой бот
- godot
- api
- мини-игра
- голосовой движок
- распознавание речи
- сценарии голосовых роботов
Бот для онлайн игр
«Бот для онлайн игр» — в первую очередь это программа или своеобразный скрипт, отвечающий за последовательности действий и процессов, выполняемых в онлайн игре, для облегчения игры и экономии времени игрока. Наш ресурс за долгое время работы очень сильно продвинулся в создании подобного рода программ. У нас работает хороший коллектив программистов по созданию ботов на различных языках программирования. Мы поможем Вам не только создать качественную программу, но и будем заниматься её поддержкой на сколько это возможно. Для Вас только инновационные скрипты и программы, защищённые авторскими правами. Все программы создаются на индивидуальной основе, для каждого заказчика под его задание.
Преимущества заказа у нас:
- Соотношение цена качество;
- Разрабатываются программы под несколько окон;
- Выполняются обходы защиты любой сложности;
- Многофункциональные программы, эмитирующие действия игрока до 100% игрового процесса;
- Простейшие скрипты по минимальным ценам;
- Программы даже для мобильных устройств;
- Опытный персонал со стажем до 12 лет работы;
- Три года успешной торговли и создания программ на официальной основе;
- Безопасный заказ программы вплоть до полного контроля сделки гарантом сайта;
- Все программы и скрипты находятся на удалённых серверах под защитой;
- Детальная проработка даже самых сложных заданий;
- Не одной жалобы на созданный функционал, только довольные клиенты;
- Мы соблюдаем указанные сроки разработки;
- У наших разработчиков современное железо, которое позволяет разрабатывать программы сложного типа;
- Поддержка наших программ после покупки, дополнение и обновление;
Это далеко не все положительные моменты работы с нами, мы предоставляем качественный продукт на безопасной основе.
Виды программ:
- Бот для любых клиентских игр;
- Бот для браузерных игр;
- Программы для игр любых типов и жанров любой сложности;
- Программа бот для мобильных игр на android и ios;
- Многофункциональные программы под несколько игровых окон и режимов;
- Программы качеры и фармеры для игр;
- Программы анализирующие дроп, для фарма вещей и ценностей;
- Программные скрипты, как сложные, так и простые;
- Программы для гильдий и команд выполняющие различные макросы;
- Сложные функциональные программы, со сменой серверов и интеграцией ответов в игре;
- Программы, которые могут вычислять администраторов и модераторов в игре, когда те находятся рядом в режиме невидимости;
- Различные алгоритмы интегрированные в программы, для особо сложных заданий;
- Сложные программы с использованием нейронных сетей и запуском функций бота голосовым интерфейсом;
- Программы со сменой прокси серверов;
Мы занимаемся обширным спектром программ, пожалуйста спрашивайте, мы обязательно сможем Вам помочь.
Уникальная услуга! Создание хаков ESP, Wallhack для игр, видение через стены или отслеживание скрытых предметов, а именно подсветка всех предметов сквозь стены/преграды.
Основные принципы и моменты:
- Программа создаётся на одного человека, да она может быть создана например для небольшого количества людей, но передача её и выдача ключей для других пк осуществляется за отдельную плату;
- Передача программы запрещена третьим лицам, если другие люди хотят приобрести программу, им нужно обращаться к нам;
- Программа передаётся по железу и авторизация в ней имеет свой логин и пароль в 95% случаев заказов;
- Написание авторского кода, по желанию в ТЗ рассматриваем создание бота на готовых программах, не защищённых авторскими правами;
- Лояльное отношение к клиентам и индивидуальный подход;
- Отдельно хочу заметить, если Вы заказываете программу по одному заданию и делаете оплату, а после просите выполнить отдельные задания, которые не были указаны в первоначальном ТЗ, Вы должны осознавать, что каждое новое задание будет требовать дополнительной оплаты;
- Хочу отметить, что при использовании подобных программ, даже если они сделаны очень умными и заменяют максимум действий игрового процесса, всегда остаётся риск блокировки в игре, это к сожалению есть, поэтому зачастую после создания программы заказывают дополнительные задания, чтобы не быть замеченными в игре администраторами;
- Программы окупают себя в 90% случиев, например фармом игровой валютой и продажей её в дальнейшем;
- Мы стараемся сделать всё, чтобы минимизировать риски блокировки, программа делается максимально незаметной;
- Оплатить заказ на программу можно практически любым способом;
- Мы гарантируем, что программа делается индивидуально, если того хочет заказчик, но цена будет существенно выше;
Как заказать и сколько стоит:
- Вам нужно знать, для какой игры вы заказываете;
- Вам нужно осознавать, что конкретно будет делать программа, всё до мельчайших деталей;
- Вы можете подготовить ссылку, где видно игру в действии, как пример;
- После того, как Вы определились, что и как будет делать бот, Вам нужно передать всю информацию на оценку. Для этого воспользуйтесь формой обратной связи, и поясните все детали и мелочи заказа, а так же укажите предполагаемый бюджет;
- Обратная связь
- После Ваших пояснений мы свяжемся с Вами и поясним стоимость создания программы;
- Далее уже утверждаются сроки и моменты создания;
- Потом Вы оплачиваете программу, на удобный для Вас реквизит;
- Реквизиты гаранта gmzippo
- Далее администрация напрямую связывает Вас с программистом;
- В процессе создания будут мелкие уточнения, так же могут понадобиться тестовые аккаунты, для проверки программы;
- В кратчайшие сроки Вы получаете программу, которая будет выполнять все игровые процессы по Вашему заданию в нужной Вам игре;
- Вы так же можете оставить заказ на форуме в теме о создании программы;
- Обсудить на форуме
- Моменты, которые существенно увеличивают стоимость разработки: — Полностью открытый исходный код разработки;
— Закодированное шифрование игры для которой выполняется разработка;
— Возможность программы работать в фоновом режиме;
— Возможность бота работать для многих окон, а именно использование сразу нескольких игровых аккаунтов;
— Другие подводные камни по ходу создания, которые могут существенно увеличить время создания программы/разработки/бота;
— Количество файлов и их разбор, некоторые игры имеют огромное количество файлов, а они в свою очередь отвечают за те или иные игровые моменты, вот для написания сложных хаков для игры, например дополнительный функционал, требует отслежки и отбор нужных файлов, а так же их сортировка, всё это в совокупности может существенно увеличивать время работы создания программы/разработки/бота/хака/дополнения;
Для разработчиков:
- Если Вы являетесь разработчиком и знаете языки программирования;
- Умеете писать и создавать функционалы;
- Можете создать программу, скрипт для онлайн игры;
- Мы рассмотрим Вас, как нашего сотрудника и будем делиться с Вами заказами, после заключения договора;
- Разработчики получают более 90% прибыли от всех заказов;
- Связаться с администрацией и предложить свою кандидатуру;
- Обратная связь
Навыки и возможности наших разработчиков:
- Умение работать, через память с играми без особой защиты;
- Работа с играми, через цвета просто на экране;
- Работа с пакетными ботами в исключительных случаях;
- Работа разной сложности, создание эксклюзивного программного обеспечения;
- Опыт наших разработчиков с инжектами и написание программ;
- Работа через API приложений и автоматизация программ по API;
- Написание бот программ на языках c++/c#, autoit, delphi, Кибор, Upilot скрипты и многое другое;
- Работа в браузере открытие страниц, авторизация, регистрация, переходы и т.п;
- Автоматизация процессов для игр на ПК, Браузерных, Мобильных, Приложений из соц сетей;
- Работа с капчей и распознавание символьной капчи;
- Работа с мышью: — Плавное/мгновенное перемещение курсора по заданным координатам;
— Нажатие левой/средней/правой кнопки мыши;
— Прокручивание колесика мышки вверх/вниз;
— Зажатие левой/правой кнопки и перетаскивание на заданные координаты; - Работа с клавиатурой: — Нажатие любой клавиши на клавиатуре;
— Ввод текста;
— Ввод любых сочетаний клавиш Ctrl+C, Ctrl+V и т.п.;
— Смена языка ввода ENG/RU; - Работа с экраном: — Поиск изображений;
— Поиск заданного пикселя;
— Сохранение снимка экрана;
— Сохранение снимка области экрана;
— Анализ экрана сопровождается условием, в котором указываются дальнейшие действия, зависящие от результата анализа; - Работа с вычислениями: — Выбор случайного числа в заданном диапазоне;
— Выбор случайного числа из заданных вариантов;
— Выбор случайного символа/слова/набора слов и символов из заданных вариантов;
— Множество математических действий; - Возможность работы в несколько потоков;
- Работа с отправкой результатов на почту, icq, смс и другие сервисы, для оповещения выполненных действий;
- Работа с текстовыми файлами: — Запись/удаление/анализ/копирование/редактирование/сортировка/поиск нужных данных;
— Сохранение резервных копий; - Ведение логов работы скрипта;
- Воспроизведение звукового сигнала или всплывающие сообщения;
- Взаимодействие со скриптом через диалоговые окна, а именно настройка/управление/ввод данных;
- Работа с мобильными приложениями через эмулятор BlueStacks и другие эмуляторы;
- Открытие игры в нескольких окнах, зачастую в играх функция открытия в нескольких окнах закрыта, мы же можем разблокировать эту функцию и открыть любую игру на одном устройстве в нескольких окнах, для игры на нескольких аккаунтах;
Наши гарантии:
- Персональный+Продавца (возраст более 7 лет) с высоким уровнем BL и TL;
- Профессиональный и верифицированный счёт Яндекс Денег;
- Идентифицированный QIWI кошелек;
- Верифицированный счёт в МаилДеньгах;
- Верифицированный кошелёк LiqPay;
- Верифицированный кошелёк PayPal с полным подтверждением и максимальными лимитами;
- Идентифицированный Wallet One — Единый кошелёк;
- Верифицированный кошелёк Perfect Money;
- Работа через Биткойн;
- Верифицированный счёт Skrill;
- Верифицированный кошелёк PAYEER;
- Почтовая карта интернет переводов со счетом в банке Русский Стандарт;
- Карта Visa Plastic QIWI Wallet привязанная к идентифицированному счёту;
- Карта Деньги@Маил привязанная к счёту МаилДенег;
- Специальный счёт в банке Левобережный;
- Счета в различных банках;
- Вы не найдете ни одной жалобы;
- Множество отзывов от благодарных клиентов;
- Подробно Вы можете ознакомиться в разделе гарантий;
- Изучить гарантии ресурса
Пожалуйста обращайтесь, для Вас только качественная работа! С уважением, администрация GARANTMARKET.
Важно понимать , что разработка программ осуществляется только в рамках законодательства РФ, если правообладатели игровых проектов запрещают, или не согласовали автоматизацию игры, то программа на заказ для этих игр сделана не будет. Если же вы используете наши программы индивидуально для конкретных игр в которых есть запреты, вы должны понимать, что всю ответственность за это вы берёте на себя, кроме того аккаунт может быть заблокировать администрацией игры.
Покупателям/Продавцам
- Как купить аккаунт
- Как обменяться аккаунтами
- Как продать аккаунт
- Как разместить объявление
- Где проверить мошенника
- Как узнать цену на свой аккаунт
Программы для автоматизации действий на компьютере
Создание ботов для игр
Автоматизация игры в различных казино
Боты для бинарных опционов
Боты для букмекерских контор
Отслеживание изменений различных графиков с ответной реакцией
Автоматизация действий на сайтах и в различных программах
Двухсторонняя связь Бота с Телеграмом
Встроенный сервис выдачи Бесплатных Прокси
Боты для мобильных эмуляторовИ многое другое
Визуальное создание ботов
Визуальный редактор кода Кибор не требует от пользователей владения навыками программирования. Создание ботов происходит с помощью рисованных блоков и установлением связи между ними по принципу Истина/Ложь…
Распознавание текста OCR
Кибор имеет встроенный модуль оптического распознавания текста OCR, задействовать который можно вызовом одной функции как при создание кода, так и в Визуальном редакторе. Так же в наличие инструмент настройки и обучения данной функции…
Графический редактор
Графический редактор Кибор позволяет получить всю нужную информацию о происходящем на экране. Подобрать нужные параметры функций идентификации объектов и подготовить нужные материалы для использование их в скрипте…
Шпион
Инструмен для получения всех параметров по идентификации и управлению окнами и контролами приложений, где будет осуществляться автоматизация…
Продажа своих скриптов
Сервис распространения скриптов в Демо режиме позволяет разработчикам безопасно сдавать в аренду свои программы, удобно управляя лицензированием пользователей прямо из меню Кибор…
АнтиАнтиКликер
АнтиАнтиКликер восстанавливает работу программы Кибор в играх с защитой Frost, GameGuard и другими. При этом Кибор не вмешивается в работу игры или ее защиты…
Что такое бот программа автоматизации действий. Автоматизация действий на компьютере.

Создание бота в визуальном редакторе кода Кибор
Бот — программа выполняющая какие либо действия по заданному алгоритму.
В отличие от кликеров, боты умеют принимать решения и ветвить логику действий в зависимости от сложившейся ситуации.Самыми опасными в плане обнаружения администрацией игры являются сетевые боты пакетники, так как малейшее обновление игры и пакетов, которыми обменивается клиент с сервером приводит к тому, что бот посылает неверные пакеты. Не банятся быстро такие боты только там, где администрации все равно.
Вторые на очереди стоят боты работающие с памятью клиента.
Ну и последними в этом списке, самыми безопасными являются боты кликеры. анализирующие экран и берущие управление клавиатурой и мышью, так как при грамотной реализации алгоритма поведения программы, для сервера такой бот невидим.По реализации так же само.
Реализация бота пакетники и работающего с памятью процесса сложнее чем создание кликерного бота, так как требует от разработчика довольно длительного анализа игры (пакетов и памяти) и знание какого нибудь языка программирования.
Кликерные боты как правило проще для реализации для пользователя незнакомому, или плохо знакомому с программированием, так как работа происходит на более человеческом уровне и при наличие инструментария Кибор не требует специальных знаний. Самым сложным в процессе создания кликерного бота является правильный анализ экрана. Некоторые моменты для него практически недоступны, это прямая ориентировка на местности в полноценных 3D играх. В этом случае часто есть возможность использовать вспомогательные средства предоставляемые клиентом игры. такие как радар. миникарта, автотаргет и прочие. В более простых играх благодаря разнообразным, мощным функциям анализа экрана и их правильному комбинированию, как правило не возникает затруднений, которые не возможно было бы решить.Что бы создать качественный, устойчивый бот необходимо придерживаться некоторых правил.
Для успешной работы бота разработчик должен предусмотреть все возможные нюансы развития событий. Алгоритм работы должен всегда работать по принципу подтверждения правильности действий и отклика от программы в которой происходит автоматизация. Не должно быть тупиковых веток, попав в которые и не получив подтверждение правильного поведения, бот не знает что ему делать, или еще хуже продолжает выполнение алгоритма. Но бывают ситуации. когда предусмотреть все невозможно, или затратно. В этом случае бот должен уметь распознать нестандартную ситуацию. Один из способов это добиться — отследить работу бота по времени, затраченном на выполнение той или иной функции.То есть если после какого либо действия бота он не получил подтверждение об успешности выполнения (не появился какой либо элемент на экране или что нибудь подобное в определенное время) и данная ситуация не предусмотрена алгоритмом работы программы, бот должен следовать аварийному алгоритму работы. Один из таких вариантов может быть перезапуск игры (если это игровой бот).
Программа Кибор предназначена для разработки в основном кликерных ботов, хотя умеет работать с памятью процессов и трафиком и в Кибор можно писать и таких ботов. Почему в Кибор акцент идет именно на кликерные боты? Функции чтения записи в процесс игры в Кибор не намного проще для использования чем в любом другом языке. Поэтому особых преимуществ использовать Кибор в этом направление нет, хотя код получается компактнее и удобнее для использования.
Для работы с графикой в Кибор существует масса специализированного инструментария и разработанных функций.Кибор может идентифицировать на экране практически любой объект, имеет встроенный модуль распознавания текста, инструмент для анализа изображения, его динамики и изменения яркости и множества другого. Что делает работу с ним в этом направление увлекательным и продуктивным.
Кроме того Кибор подходит для использования как опытным программистом, поскольку Си образный скриптовый язык содержит в себе более 100 специально разработанных функций анализа экрана, распознавания текста, работы с трафиком и процессами, работы с окнами и контролами, манипулирования клавиатурой и мышью и т.д., плюс полный набор нужных операторов и возможность использовать WinApi. Так и интуитивно понятный Визуальный редактор кода, использовать который могут пользователи далекие от программирования.
Создание блок схем алгоритма работы программы происходит путем рисование блоков и соединения их по принципу Истина/Ложь. Так же возможно создавать блоки для Визуального редакторы путем простой записи действий, как в простейших атокликерах. При такой записи возможно создание блоков управления клавиатурой и мышью, анализа экрана и поиска на нем нужных объектов и распознавания текста. После создания схемы она транслируется в исполняемый Кибором программный код, который можно при желание изменять и корректировать как обычный скрипт, коим он и является.
Как пишут ботов для компьютерных игр? [закрыт]
Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.
Закрыт 5 лет назад .
Видел на YouTube видео в котором явно играет не человек, а бот. Как такое вообще возможно? Как можно написать бота, который будет с экрана «брать» элементы, расчитывать выгодные попадания, учитывать скорость? Как такие боты пишутся?
Отслеживать
задан 26 авг 2018 в 17:41
user194625 user194625Почему сразу с экрана, можно влезть в машинный код игры и подменить там что-нибудь, например. Хотя игры типа Zuma наверно действительно нетрудно (относительно) обманывать несложными методами обработки изображений
26 авг 2018 в 18:24
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Факт 1. Вы можете использовать WinApi чтобы посылать нажатия клавиш и щелчки/движения мышки в определённых координатах.
Факт 2. Вы можете свободно копаться в оперативной памяти чужих программ (используя более низкоуровневые языки), вы можете слушать соединение игры с игровым сервером: в котором все ключевые данные (положение игрока и соперников например) как-раз и передают регулярно.Так с простым ботом ничего сложного — перехватываете нужные данные, например положение деревьев и игрока в компьютерной игре. Ваш некий алгоритм определяет какие клавиши надо жать в текущий момент времени, куда двигать мышку. Выполняете, и дальше по кругу.
Некоторое время назад зарабатывал на ботах для браузерных игр. Так вот лично мои боты были расширениями браузеров написанные только на JS. Плюс расширения в этом деле в том, что есть DOM дерево: то есть очень просто достать исчерпывающую информацию о мире игры. Также интересно то, что можно «командовать» окном игры, вызывая из расширения любые скрипты в пространстве окна, а ещё в пространстве расширения можно подключать прямо из JS dll библиотеки, например WinApi .
Как пишут ботов для игр (или для программ с интерфейсом)?
Здравствуйте.
Интересует вопрос, как пишут ботов для игр (хоть самых простых) или для программ (у которых есть интерфейс).
Мне интересен сам принцип. Вот как заставить бота по сайтам лазить — это понятно (просто по ссылкам переходит и всё).
А как в приложениях, я вообще не понимаю (неужели просто программа мышку перемещает и щелкает по кнопкам вместо человека?)
p.s. Лучше на python-е.
Заранее спасибо!- Вопрос задан более трёх лет назад
- 66914 просмотров
1 комментарий
Оценить 1 комментарий
Есть программа для создания ботов Zennoposte.
Не требует знаний программирования. Похожа на конструктор.
Позволяет создать любого бота, автоматизировать любой процесс на компьютере.
— Боты для игр
— Боты для ВК, Одноклассников, Facebook, Instagram, бот для телеграмм, для авито.
— Онлайн боты для создания аккаунтов.
— Боты для всего
Не бесплатная, но есть тестовый период 14 дней.
www.zennolab.com/ru/products/zennoposter/pid/18bec.Решения вопроса 1
ты видел ботов на питоне?
Ответ написан более трёх лет назад
Алексей Мистин @Mistin Автор вопроса
На питоне ботов не пишут что ли?Я не встречал. Если сможете на питоне взаимодействовать напрямую с операционной системой — пожалуйста.
Алексей Мистин @Mistin Автор вопроса
Такие боты всегда взаимодействуют с ОС? И на каких языках тогда можно их писать? (более-менее популярных)
Алексей Мистин: на PHP. Извините за шутку
Алексей Мистин @Mistin Автор вопроса
на сколько я понял на assembler можно это сделать, а на таких как c++, java можно?А как вы собираетесь взаимодействовать с другими приложениями, не взаимодействуя с ОС?))
Delphi, C/C++, Assembler
Тут точно можно 🙂На java не знаю, я просто на ней никогда не кодил 🙂
Алексей Мистин @Mistin Автор вопросаА что Вы можете посоветовать изучать мне? (я молодой начинающий программист, который пока знает не много, но хочет это исправить)
А какие у вас цели в общем то?
Алексей Мистин @Mistin Автор вопросаЧестно говоря я сам не знаю чего хочу, но основной мой интерес в написании обычных прикладных приложений для пользователей (ну или сайтов разных).
Определитесь, вам нужно прикладное программирование, или веб-программирование.
Если под веб — php, html, css, js и какую-нибудь базу данных, желательно MySQL
Если прикладное — C++ или Delphi ( не рекомендую, а то большинство тех, кто кодил на делфи первым языком почему-то отрофируются из-за компонент ).
Есть еще системное программирование.
Python + selenium чем не веб-бот?
Что до языков программирования, начали с Python, освойте хорошенько Python, его применение нынче довольно широко и не ограничивается pandas, big data и ML, можно довольно спокойно и успешно писать те же самые прикладные программы. Из скриптовых языков, тот же Ruby не ограничивается рельсами и на нём довольно удобно писать прикладные программы, тем более что его стандартный набор превосходит Python, например Regular Expressions вшиты как стандарт и под них отведён отдельный синтаксис, в то время как в Python необходимо делать импорт.
Набейте руку на языке к которому лежит душа, который приятнее читать и на котором удобнее писать, порешайте задачки на hackerrank, там любую задачу можно выполнить на любом языке, что опять же подтверждает тот факт, что нет смысла сильно задумываться о выборе. Затем освоившись с алгоритмами которые от языка к языку повторяются, набьете руку и поймёте в чём силён ? слаб ваш выбранный язык и, возможно, ваши преференции сместятся к другому языку, который вы с удовольствием освоите.
Ответы на вопрос 6

от себя добавлю что основные методы это
1) простейший понятный способ — поиск нужного элемента на экране и кликание по экрану, или клик по указанным координатам. я в основном использую этот способ, так как вмешательство в игру минимальное — ее не надо ломать, для онлайн игр — меньше шансов получить бан. Подходит для простых игр, в основном те что 2D пошаговые.
Гуглить отправку событий мыши и клавиатуры на выбранном вами ЯП (java robots например).
Минусы — игра должна быть постоянно открыта на экране и иметь фокус (можно решить — запустив игру с ботом в виртуалке).2) для онлайн игр — изучение протокола обмена данными с сервером. нужно изучать куда отправляются/откуда получаются данные и в каком формате. пишем программу которая эмулирует клиент игры. очень хороший способ — для очень интерактивных игр — максимальная скорость. Способ довольно сложный надо реверсить протокол (гуглить wireshark) и возможно само приложение (гуглить дизассемблирование / декомпиляция). Если игра браузерная — то все может быть проще — запросы и ответы можно смотреть в консоли браузера. Очень перспективный способ — визуальный клиент не обязателен — можно делать армию ботов и размещать на серверах — скорее всего они будут потреблять немного памяти и процессора и возможности впечатляющие.
3) для десткопных игр — патчинг памяти запущенной игры. варианты от простых типа — поменять очки/деньги в игре (artmoney) это в основном для не онлайн игр, и до очень сложных — подменить адрес вызова системной функции — например функции отрисовки directx — то есть меняем адрес вызова на свою функци (недавно была серия статей на эту тему, к сожалению не нашел побыстрому). Либо как разновидность — декомпиляция игры — изменение логики — компиляция (гуглить все что связано с крекерством, создание кейгенов). Для этого варинта требуется довольно высокая квалификация, понимание того как работает игра. Также игры могут иметь защиту от этого.
Кстати понимание того как работают игры/программы — одно из главных в этом деле. Поэтому в первую очередь следует заняться тем чтобы понять как работает конкретная игра, а потом уже думать на каком этапе можно вмешаться в ее логику чтобы достичь нужного эффекта. Изучайте также средства тестирования игр/приложений — с помощью их также можно малой кровью добится хороших результатов.
Ответ написан более трёх лет назад
Нравится 7 5 комментариев
и да, я часто использую первый способ — многие популярные пошаговые игры оказывается легко решаются тупым кликанием по экрану, но люди все равно в них играют.
Но способ все равно интересный можно дойти до распознования образов на экране (компьютерное зрение). или обойтись более простыми функциями поиска картинки в картинке. я в свое время делал для одной игры простой вариант распознования текста (бот мог читать чат игры — находить нужные групповые события и присоединяться к групповой игре).чтобы понять этот способ — попробуйте с чего нибудь простого — например напишите бота для сапера.
Какая нафиг декомпиляция игры и последующая компиляция? Ты че, собрался из экзешника рабочие сорцы собрать? Че ты там у ся куришь, или у тебя версия HexRays Decompiler из далекого будущего?

Coderast: все игры на Unity состоят из «шлака» типа текстур объектов и т.п. и «игры» в виде пары тройки библиотек на .net, если автор игры не заморачивался с обфускацией этих библиотек (например ранние версии the forest) то код библиотеки легко раскрывался в сорцы (см Dot Peak), которые спокойно компилятся в студии обратно, естественно с нужными вам читами или ботами. Так что riky прав, хотя это не со всеми играми так легко сделать.

Coderast: разве речь только про exe? есть еще штуки которые можно декомпилить во вполне читаемый код, flash, андроид приложения например.
Бот для онлайн игр
«Бот для онлайн игр» — в первую очередь это программа или своеобразный скрипт, отвечающий за последовательности действий и процессов, выполняемых в онлайн игре, для облегчения игры и экономии времени игрока. Наш ресурс за долгое время работы очень сильно продвинулся в создании подобного рода программ. У нас работает хороший коллектив программистов по созданию ботов на различных языках программирования. Мы поможем Вам не только создать качественную программу, но и будем заниматься её поддержкой на сколько это возможно. Для Вас только инновационные скрипты и программы, защищённые авторскими правами. Все программы создаются на индивидуальной основе, для каждого заказчика под его задание.
Преимущества заказа у нас:
- Соотношение цена качество;
- Разрабатываются программы под несколько окон;
- Выполняются обходы защиты любой сложности;
- Многофункциональные программы, эмитирующие действия игрока до 100% игрового процесса;
- Простейшие скрипты по минимальным ценам;
- Программы даже для мобильных устройств;
- Опытный персонал со стажем до 12 лет работы;
- Три года успешной торговли и создания программ на официальной основе;
- Безопасный заказ программы вплоть до полного контроля сделки гарантом сайта;
- Все программы и скрипты находятся на удалённых серверах под защитой;
- Детальная проработка даже самых сложных заданий;
- Не одной жалобы на созданный функционал, только довольные клиенты;
- Мы соблюдаем указанные сроки разработки;
- У наших разработчиков современное железо, которое позволяет разрабатывать программы сложного типа;
- Поддержка наших программ после покупки, дополнение и обновление;
Это далеко не все положительные моменты работы с нами, мы предоставляем качественный продукт на безопасной основе.
Виды программ:
- Бот для любых клиентских игр;
- Бот для браузерных игр;
- Программы для игр любых типов и жанров любой сложности;
- Программа бот для мобильных игр на android и ios;
- Многофункциональные программы под несколько игровых окон и режимов;
- Программы качеры и фармеры для игр;
- Программы анализирующие дроп, для фарма вещей и ценностей;
- Программные скрипты, как сложные, так и простые;
- Программы для гильдий и команд выполняющие различные макросы;
- Сложные функциональные программы, со сменой серверов и интеграцией ответов в игре;
- Программы, которые могут вычислять администраторов и модераторов в игре, когда те находятся рядом в режиме невидимости;
- Различные алгоритмы интегрированные в программы, для особо сложных заданий;
- Сложные программы с использованием нейронных сетей и запуском функций бота голосовым интерфейсом;
- Программы со сменой прокси серверов;
Мы занимаемся обширным спектром программ, пожалуйста спрашивайте, мы обязательно сможем Вам помочь.
Уникальная услуга! Создание хаков ESP, Wallhack для игр, видение через стены или отслеживание скрытых предметов, а именно подсветка всех предметов сквозь стены/преграды.
Основные принципы и моменты:
- Программа создаётся на одного человека, да она может быть создана например для небольшого количества людей, но передача её и выдача ключей для других пк осуществляется за отдельную плату;
- Передача программы запрещена третьим лицам, если другие люди хотят приобрести программу, им нужно обращаться к нам;
- Программа передаётся по железу и авторизация в ней имеет свой логин и пароль в 95% случаев заказов;
- Написание авторского кода, по желанию в ТЗ рассматриваем создание бота на готовых программах, не защищённых авторскими правами;
- Лояльное отношение к клиентам и индивидуальный подход;
- Отдельно хочу заметить, если Вы заказываете программу по одному заданию и делаете оплату, а после просите выполнить отдельные задания, которые не были указаны в первоначальном ТЗ, Вы должны осознавать, что каждое новое задание будет требовать дополнительной оплаты;
- Хочу отметить, что при использовании подобных программ, даже если они сделаны очень умными и заменяют максимум действий игрового процесса, всегда остаётся риск блокировки в игре, это к сожалению есть, поэтому зачастую после создания программы заказывают дополнительные задания, чтобы не быть замеченными в игре администраторами;
- Программы окупают себя в 90% случиев, например фармом игровой валютой и продажей её в дальнейшем;
- Мы стараемся сделать всё, чтобы минимизировать риски блокировки, программа делается максимально незаметной;
- Оплатить заказ на программу можно практически любым способом;
- Мы гарантируем, что программа делается индивидуально, если того хочет заказчик, но цена будет существенно выше;
Как заказать и сколько стоит:
- Вам нужно знать, для какой игры вы заказываете;
- Вам нужно осознавать, что конкретно будет делать программа, всё до мельчайших деталей;
- Вы можете подготовить ссылку, где видно игру в действии, как пример;
- После того, как Вы определились, что и как будет делать бот, Вам нужно передать всю информацию на оценку. Для этого воспользуйтесь формой обратной связи, и поясните все детали и мелочи заказа, а так же укажите предполагаемый бюджет;
- Обратная связь
- После Ваших пояснений мы свяжемся с Вами и поясним стоимость создания программы;
- Далее уже утверждаются сроки и моменты создания;
- Потом Вы оплачиваете программу, на удобный для Вас реквизит;
- Реквизиты гаранта gmzippo
- Далее администрация напрямую связывает Вас с программистом;
- В процессе создания будут мелкие уточнения, так же могут понадобиться тестовые аккаунты, для проверки программы;
- В кратчайшие сроки Вы получаете программу, которая будет выполнять все игровые процессы по Вашему заданию в нужной Вам игре;
- Вы так же можете оставить заказ на форуме в теме о создании программы;
- Обсудить на форуме
- Моменты, которые существенно увеличивают стоимость разработки: — Полностью открытый исходный код разработки;
— Закодированное шифрование игры для которой выполняется разработка;
— Возможность программы работать в фоновом режиме;
— Возможность бота работать для многих окон, а именно использование сразу нескольких игровых аккаунтов;
— Другие подводные камни по ходу создания, которые могут существенно увеличить время создания программы/разработки/бота;
— Количество файлов и их разбор, некоторые игры имеют огромное количество файлов, а они в свою очередь отвечают за те или иные игровые моменты, вот для написания сложных хаков для игры, например дополнительный функционал, требует отслежки и отбор нужных файлов, а так же их сортировка, всё это в совокупности может существенно увеличивать время работы создания программы/разработки/бота/хака/дополнения;
Для разработчиков:
- Если Вы являетесь разработчиком и знаете языки программирования;
- Умеете писать и создавать функционалы;
- Можете создать программу, скрипт для онлайн игры;
- Мы рассмотрим Вас, как нашего сотрудника и будем делиться с Вами заказами, после заключения договора;
- Разработчики получают более 90% прибыли от всех заказов;
- Связаться с администрацией и предложить свою кандидатуру;
- Обратная связь
Навыки и возможности наших разработчиков:
- Умение работать, через память с играми без особой защиты;
- Работа с играми, через цвета просто на экране;
- Работа с пакетными ботами в исключительных случаях;
- Работа разной сложности, создание эксклюзивного программного обеспечения;
- Опыт наших разработчиков с инжектами и написание программ;
- Работа через API приложений и автоматизация программ по API;
- Написание бот программ на языках c++/c#, autoit, delphi, Кибор, Upilot скрипты и многое другое;
- Работа в браузере открытие страниц, авторизация, регистрация, переходы и т.п;
- Автоматизация процессов для игр на ПК, Браузерных, Мобильных, Приложений из соц сетей;
- Работа с капчей и распознавание символьной капчи;
- Работа с мышью: — Плавное/мгновенное перемещение курсора по заданным координатам;
— Нажатие левой/средней/правой кнопки мыши;
— Прокручивание колесика мышки вверх/вниз;
— Зажатие левой/правой кнопки и перетаскивание на заданные координаты; - Работа с клавиатурой: — Нажатие любой клавиши на клавиатуре;
— Ввод текста;
— Ввод любых сочетаний клавиш Ctrl+C, Ctrl+V и т.п.;
— Смена языка ввода ENG/RU; - Работа с экраном: — Поиск изображений;
— Поиск заданного пикселя;
— Сохранение снимка экрана;
— Сохранение снимка области экрана;
— Анализ экрана сопровождается условием, в котором указываются дальнейшие действия, зависящие от результата анализа; - Работа с вычислениями: — Выбор случайного числа в заданном диапазоне;
— Выбор случайного числа из заданных вариантов;
— Выбор случайного символа/слова/набора слов и символов из заданных вариантов;
— Множество математических действий; - Возможность работы в несколько потоков;
- Работа с отправкой результатов на почту, icq, смс и другие сервисы, для оповещения выполненных действий;
- Работа с текстовыми файлами: — Запись/удаление/анализ/копирование/редактирование/сортировка/поиск нужных данных;
— Сохранение резервных копий; - Ведение логов работы скрипта;
- Воспроизведение звукового сигнала или всплывающие сообщения;
- Взаимодействие со скриптом через диалоговые окна, а именно настройка/управление/ввод данных;
- Работа с мобильными приложениями через эмулятор BlueStacks и другие эмуляторы;
- Открытие игры в нескольких окнах, зачастую в играх функция открытия в нескольких окнах закрыта, мы же можем разблокировать эту функцию и открыть любую игру на одном устройстве в нескольких окнах, для игры на нескольких аккаунтах;
Наши гарантии:
- Персональный+Продавца (возраст более 7 лет) с высоким уровнем BL и TL;
- Профессиональный и верифицированный счёт Яндекс Денег;
- Идентифицированный QIWI кошелек;
- Верифицированный счёт в МаилДеньгах;
- Верифицированный кошелёк LiqPay;
- Верифицированный кошелёк PayPal с полным подтверждением и максимальными лимитами;
- Идентифицированный Wallet One — Единый кошелёк;
- Верифицированный кошелёк Perfect Money;
- Работа через Биткойн;
- Верифицированный счёт Skrill;
- Верифицированный кошелёк PAYEER;
- Почтовая карта интернет переводов со счетом в банке Русский Стандарт;
- Карта Visa Plastic QIWI Wallet привязанная к идентифицированному счёту;
- Карта Деньги@Маил привязанная к счёту МаилДенег;
- Специальный счёт в банке Левобережный;
- Счета в различных банках;
- Вы не найдете ни одной жалобы;
- Множество отзывов от благодарных клиентов;
- Подробно Вы можете ознакомиться в разделе гарантий;
- Изучить гарантии ресурса
Пожалуйста обращайтесь, для Вас только качественная работа! С уважением, администрация GARANTMARKET.
Важно понимать , что разработка программ осуществляется только в рамках законодательства РФ, если правообладатели игровых проектов запрещают, или не согласовали автоматизацию игры, то программа на заказ для этих игр сделана не будет. Если же вы используете наши программы индивидуально для конкретных игр в которых есть запреты, вы должны понимать, что всю ответственность за это вы берёте на себя, кроме того аккаунт может быть заблокировать администрацией игры.
Покупателям/Продавцам
- Как купить аккаунт
- Как обменяться аккаунтами
- Как продать аккаунт
- Как разместить объявление
- Где проверить мошенника
- Как узнать цену на свой аккаунт
Как написать игрового бота на Python для Web
Этот туториал, и код в нем, требует установки нескольких дополнительных библиотек для Python. Они обеспечивают обертку Python’а в кусок низкоуровневого C-кода, который значительно упрощает создание и скорость исполнения.
Некоторые библиотеки существуют только под Windows. У них могут быть эквиваленты под Mac или linux, но мы не будем их рассматривать.
Вам нужно скачать и установить следующие библиотеки:
Все представленные библиотеки комплектуются установщиками. Запуск их автоматически установит модуль в директорию \lib\site-packages и, теоретически, добавит соответствующий pythonPath . Однако, на практике это происходит не всегда. Если Вы получите сообщение об ошибке после установки, добавьте их вручную в переменные Path.
Последний инструмент это графический редактор. Я предлагаю использовать Paint.Net как лучший из бесплатных, но подойдет любая программа с линейками и измерениями в пикеслях.
Мы будем использовать несколько игр в качестве примеров.
Введение
Это руководство написано с целью дать базовое понимание основы разработки ботов для браузерных игр. Подход, который мы собираемся дать, вероятно немного отличается от того, что многие ожидают услышать говоря о ботах. Вместо того, чтобы сделать программу, вставляющую код между клиентом и сервером (как боты для Quake или CS), наш бот будет находиться чисто снаружи. Мы будем опираться на методы Компьютерного зрения и вызовы Windows API для сбора необходимой информации и выполнения движений.
С этим подходом мы теряем часть деталей и контроля, но сокращаем время разработки и получим простоту в использовании. Автоматизирование специфичных игровых функций может быть создано в несколько строк кода, и полноценный бот, от начала до конца (для простой игры) может быть собран за несколько часов.
Когда вы привыкните к тому, что компьютер может видеть, начнете смотреть на игры по-другому. Хороший пример это поиск в играх-пазлах. Обычное решение основывается на ограничении скорости игрока, что заставляет принимать не оптимальные решения. Интересно (и довольно легко) «взломать» их скриптами движений которые не повторить человеку.
Эти боты могут быть также очень полезны для тестирования простых игр — в отличии от реальных игроков, боту не надоест играть один сценарий снова и снова.
Исходники примеров из курса, а также одного законченного бота можно найти здесь.
Шаг 1: Создание проекта
В папке с проектом создайте текстовый файл quickGrab, измените расширение на ‘py’ и откройте его в редакторе кода.
Шаг 2: Создаем приложение, которое делает скриншот экрана
Начнем работу с изучения базовой функции, которая делает скриншот экрана. Один раз создав и запустив, мы будем строчка за строчкой, как эту функцию, создавать каркас нашего кода.
Вставим в наш файл с проектом quickGrab.py следующий код:
ImageGrab import os import time def screenGrab(): box = () im = ImageGrab.grab() im.save(os.getcwd() + '\\full_snap__' + str(int(time.time())) + '.png', 'PNG') def main(): screenGrab() if __name__ == '__main__': main()Запустив этот код, вы получите скриншот экрана:

Данный код забирает всю ширину и высоту области экрана и сохраняет в PNG файл в директорию проекта.
Давайте пошагово разберем код, чтобы понять как это работает. Первые три строки:
import ImageGrab import os import time. называются ‘import statements’. Они говорят Pytjon’у какие модули загружать во время выполнения. Это дает доступ к методам этих модулей через синтаксис module.attribute .
Первый модуль Python Image Library мы установили ранее. Как следует из названия, он дает нам функциональность взаимодействия с экраном на которую ссылается бот.
Вторая строка импортирует модуль операционной системы (OS — operating system). Он дает возможность простой навигации по директориям в операционной системе. Это пригодится, когда мы начинаем размещать файлы в разных папках.
Последний импорт создает модуль работы со временем. Мы используем его для установки текущей даты скриншота, также он может быть очень полезным как таймер для ботов, которые выполняют действие в течение заданного количества секунд.
Следующие четыре строки определяют функцию screenGrab() .
def screenGrab(): box = () im = ImageGrab.grab() im.save(os.getcwd() + '\\full_snap__' + str(int(time.time())) + '.png', 'PNG')Первая строка def screenGrab() определяет имя функции. Пустые скобки означают, что она не принимает аргументов.
Строка 2, box = () присваивает пустое значение переменной «box». Мы заполним это значение дальше.
Строка 3, im = ImageGrab.grab() создает полный скриншот экрана и возвращает RGB изображение в переменную im .
Строка 4, может быть немного сложнее если вы не очень хорошо знакомы с тем как работает Time module. Первая часть im.save( вызывает метод «save». Он принимает два аргумента. Первый это директория в которую нужно сохранить файл, а второй это формат файла.
Здесь мы устанавливаем директорию вызовом метода os.getcwd() . Функция получает текущую директорию в которой выполняется код и возвращает её как строку. Далее мы добавим «+». Сложение нужно использовать между каждым новым аргументом для соединения всех строк вместе.
Следующая часть ‘\\full_snap__ дает нам простое описание в имени файла. Обратный слеш является экранирующим символом в Python, и мы добавили два, чтобы избежать отмены одного из символов.
Далее идет эта сложная конструкция: str(int(time.time())). Она использует встроенные функции Питона. Мы рассмотрим работу этого куска кода изнутри:
time.time() возвращает количество секунд с начала Эпохи , тип данных Float (число с плавающей точкой). Так как мы используем дату для именования файлов, мы не можем использовать десятичное число, поэтому мы обернем выражение в int() , чтобы конвертировать в целое число (Integer). Это делает нас ближе к решению, но Python не может соединить тип Integer с типом String, поэтому следующим шагом мы обернем все в функцию str(). Далее остается только добавить расширение как часть строки + ‘.png’ и добавить вторым аргументом функции снова расширение: «PNG».
Последняя часть кода определяет функцию main() , которая вызывает функцию screenGrab(), когда исполняется.
И, наконец, условное обозначение, которое позволяет интерпретатору определить, какую функцию запускать в случае, если файл запущен как основной (а не просто импортирован в другой скрипт). В противном случае, если он загружен как модуль другого скрипта — он только передает доступ к этому методу, вместо выполнения.
def main(): screenGrab() if __name__ == '__main__': main()Шаг 3: Область видимости
Функция ImageGrab.grab() принимает один аргумент, который определяет область видимости. Это набор координат по шаблону (x,y,x,y), где
- Первая пара значение (x,y. определяет левый верхний угол рамки;
- Вторая пара . x,y) определяет правый нижний.
Это дает нам возможность скопировать только часть экрана, которая нам нужна.
Рассмотрим это на практике.
Для примера рассмотрим игру Sushi Go Round (Довольно увлекательная. Я Вас предупредил). Откройте игру в новой вкладке и сделайте скриншот использую существующий код screenGrab():

Шаг 4: Задание координат
Пришло время задания координат для нашей области видимости.
Откройте скриншот в редакторе картинок.
Координаты (0,0) это всегда левый верхний угол изображения. Мы хотим заполнить X и Y таким образом, чтобы нашему новому скриншоту функция установила координаты (0,0) в крайний левый угол игровой области.
Этому есть две причины. Во-первых, это упрощает нахождение координат, когда мы должны определять координаты относительно игровой области, по сравнению со всем экраном монитора. Во-вторых, захват меньшей части экрана уменьшает нагрузку на процессор. Полноэкранные скриншоты производят довольно много данных, чтобы их можно было циклично повторять несколько раз в секунду.

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

Наведите курсор на первый пиксель игровой области и запишите координаты на линейках. Это будут первые два значения для нашей функции. У меня получились значения (305, 243).
Затем следуйте к нижнему краю и запишите вторую пару координат. У меня получилось (945, 723). Вместе эти пары дают область с координатами (305,243,945,723).
Давайте добавим координаты в код:
import ImageGrab import os import time def screenGrab(): box = (305,243,945,723) im = ImageGrab.grab(box) im.save(os.getcwd() + '\\full_snap__' + str(int(time.time())) + '.png', 'PNG') def main(): screenGrab() if __name__ == '__main__': main()На строке 6 мы обновили массив для хранения координат игровой области.
Сохраните и запустите код. Откройте новое сохраненное изображение и вы увидите следующее:

Отлично! Это идеальный снимок игровой области. Нам не всегда будет требоваться эта напряженная охота за координатами. После того, как мы узнаем о win32api, мы рассмотрим более быстрые методы для установки координат, когда нам нужна идеальная точность.
Шаг 5: Перспективное планирование для гибкости
На данный момент, мы жестко прописали координаты по отношению к текущей настройке, исходя из нашего браузера и нашего разрешения монитора. Вообще, это плохая идея — жестко прописывать координаты таким образом. Если, например, мы хотим запустить код на другом компьютере, или, скажем, что-то на сайте немного сдвинет позицию игровой области — нам придется вручную скрупулезно фиксировать все наши координаты заново.
Давайте создадим две новые переменные: x_pad и y_pad. В них будет храниться расстояние между игровой областью и остальным экраном. Это поможет легко портировать код с места на место, так как каждая новая координата будет задаваться относительно двух глобальных переменных, которые мы создадим. Чтобы настроить изменения экрана нужно сбросить эти две переменные.
Так как мы уже сделали измерения, установить отступы для нашей текущей системы достаточно просто. Мы собираемся установить отступы, чтобы хранить положение первого пикселя за пределами игровой площадки. От первой пары координат нашего кортежа вычесть по 1. Получается 304 и 242.
Давайте добавим это в наш код:
# Globals # ------------------ x_pad = 304 y_pad = 242Теперь, когда они установлены, мы скорректируем координаты игровой области относительно них.
def screenGrab(): box = (x_pad+1, y_pad+1,945,723) im = ImageGrab.grab(box) im.save(os.getcwd() + '\\full_snap__' + str(int(time.time())) + '.png', 'PNG')Для второй пары значений мы собираемся сначала найти разницу между первой и второй парой координат, чтобы получить размер игрового окна, а затем использовать эти значения с нашими переменными.
def screenGrab(): box = (x_pad+1, y_pad+1, x_pad+641, y_pad+481) im = ImageGrab.grab(box) im.save(os.getcwd() + '\\full_snap__' + str(int(time.time())) + '.png', 'PNG')Для координаты x значение стало 945 — 304 = 641, а для y стало 723 — 242 = 481.
Сперва это может показаться излишним, но это дополнительный шаг к более легкому обслуживанию в будущем.
Шаг 6: Создание документации
Перед тем как перейти дальше, создадим документацию в начале нашего проекта. Так как большая часть нашего кода будет базироваться на особых координатах экрана и отношении к этим координатам, важно понимать окружение в котором всё будет работать правильно. Например, таких условия как разрешение монитора, браузер, включенная панель инструментов (так как это меняет размер окна браузера), и другие настройки необходимые для центровки игровой области на экране, все это влияет на относительные позиции координат. Документирование всего этого сильно помогает в решении проблем, когда код запускается на разных браузерах и компьютерах.
Напоследок, нужно следить за постоянно меняющимся рекламным пространством на популярных игровых сайтах. Если функция захвата экрана перестает себя вести, как ожидалось, стоит добавить координатам немного смещения.
Для примера, я обычно добавляю подобный комментарий в начало моего кода:
""" All coordinates assume a screen resolution of 1280x1024, and Chrome maximized with the Bookmarks Toolbar enabled. Down key has been hit 4 times to center play area in browser. x_pad = 156 y_pad = 345 Play area = x_pad+1, y_pad+1, 796, 825 """Добавление всей этой информации в начало файла позволяет быстро и легко перепроверить все настройки и выравнивание экрана без необходимости корпеть над кодом, пытаясь вспомнить, где вы сохранили конкретную x-координату.
Шаг 7: Делаем quickGrab.py удобным инструментом
Мы собираемся клонировать наш проект в этой точке, создавая два файла: один, чтобы писать код нашего бота, другой чтобы хранить функцию снимка экрана. Мы будем делать много снимков, поэтому с отдельным модулем работа пойдет быстрее.
Сохраните и закройте текущий проект.
Создайте копию проекта в этой же папке и переименуйте файл в code.py . Теперь добавление и редактирование всех изменений мы будем производить в code.py, а quickGrab.py оставим исключительно для скриншотов. Только добавим одно финальное изменение: изменим расширение на .pyw
Это расширение сообщает Питону, что нужно запускать скрипт без открытия консоли. Двойной клик по файлу и он быстро выполнится в фоне и сохранит скриншот в рабочую директорию.
Держите игру открытой в фоне (не забудьте отключить зацикленную музыку, иначе она сведет вас с ума); мы скоро к ней вернемся. У нас еще есть несколько инструментов для внедрения, прежде чем начать контролировать вещи на экране.
Шаг 8: win32api — краткий обзор
Работать с win32api может быть немного сложно на начальном этапе. Это обертка в низкоуровневый Windows C, которых хорошо задокументирован здесь, но навигация похожа на лабиринт, так что пару раз придется пройти по кругу.
Если при выполнении Вы видите ошибку «ImportError: No module named win32api», значит не установлен этот модуль. Выполните в консоли команду pip install pypiwin32
Прежде чем мы начнем писать код, давайте поближе познакомимся с некоторыми функциями API на которые далее мы будем опираться. После того как у нас появится четкое понимание каждого параметра, мы сможем легко настроить их для наших целей в игре.
win32api.mouse_event( dwFlags, dx, dy, dwData )Первый параметр dwFlags определяет «действия» мыши. Такие как перемещение, клик, скроллинг и т.п. Следующий список показывает распространенные параметры, используемые для программирования движений.
- win32con.MOUSEEVENTF_LEFTDOWN
- win32con.MOUSEEVENTF_LEFTUP
- win32con.MOUSEEVENTF_MIDDLEDOWN
- win32con.MOUSEEVENTF_MIDDLEUP
- win32con.MOUSEEVENTF_RIGHTDOWN
- win32con.MOUSEEVENTF_RIGHTUP
- win32con.MOUSEEVENTF_WHEEL
Имена говорят сами за себя. Если вы хотите выполнить виртуальный правый клик, нужно отправить параметр win32con.MOUSEEVENTF_RIGHTDOWN в dwFlags.
Следующие два параметра, dx и dy, описывают абсолютную позицию вдоль осей x и y. Пока мы будем использовать эти параметры для программирования движения мыши, они будут использовать систему координат отличную от той, которую мы использовали до этого. Мы зададим нули и будем опираться на другую часть API для движения мыши.
Четвертый параметр это dwData. Эта функция используется тогда и только тогда, когда dwFlags содержит MOUSEEVENTF_WHEEL. В других случаях она может быть опущена или установлена в 0. dwData скорость прокрутки колеса мыши.
Простой пример для закрепления
Если мы представим игру с переключением оружия как в Half-Life 2 (где оружие может быть выбрано вращением колеса) — мы можем использовать эту функцию для выбора оружия из списка:
def browseWeapons(): weaponList = ['crowbar','gravity gun','pistol'. ] for i in weaponList: win32api.mouse_event(win32con.MOUSEEVENTF_MOUSEEVENTF_WHEEL,0,0,120)Здесь мы хотим симулировать скроллинг колеса мыши для навигации по нашему теоретическому списку оружия, поэтому мы вносим . MOUSEEVENTF_WHEEL в dwFlag. Не нужно указывать позиционирование dx и dy, оставим эти значения 0, и нам нужен один скрол вперед для каждого оружия в списке, поэтому устанавливаем значение 120 для dwData, что соответствует одному скролу мыши.
Как вы видите, работа с mouse_event это просто вопрос подключения правильных аргументов в правильном порядке. Давайте перейдем к более полезным функциям.
Шаг 9: Клики мыши
Мы переходим к созданию трех новых функций. Одна общая функция нажатия левой кнопки мыши, и два обработчика состояний нажатия и отпускания.
Откройте code.py в редакторе и добавьте следующее выражение к списку импортов
import win32api, win32conКак и ранее, это дает нам доступ к содержимому модуля через синтаксис module.attribute
Далее создадим первую функцию клика мыши
def leftClick(): win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0) time.sleep(.1) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0) print "Click." #completely optional. But nice for debugging purposes.Напомню, что все, что мы делаем здесь это назначаем действие первому аргументу mouse_event. Мы не должны указывать никакую информацию о позиционировании, поэтому мы опускаем параметры координат (0,0), и мы не должны указывать дополнительную информацию, такую как dwData. Функция time.sleep(.1) говорит Питону приостановить выполнение на время указанное в скобках. Добавим это в наш код. Обычно это очень короткий промежуток времени. Без этого клик может получиться до того, как меню обновится.
Мы создали функцию для левого клика. Один раз нажать, один раз отпустить. Мы потратили много времени на нее, но давайте создадим еще две вариации. Это тоже самое, но теперь каждый шаг мы разобьем на отдельную функцию. Это можно использовать когда нам надо удерживать нажатой мышь в течение продолжительного времени (например, для перетаскивания предметов или стрельбы.)
def leftDown(): win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0) time.sleep(.1) print 'left Down' def leftUp(): win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0) time.sleep(.1) print 'left release'Шаг 10: Простые движения мышью
Все, что остается это движение мыши по экрану. Добавим следующие функции в файл code.py
def mousePos(cord): win32api.SetCursorPos((x_pad + cord[0], y_pad + cord[1]) def get_cords(): x,y = win32api.GetCursorPos() x = x - x_pad y = y - y_pad print x,yЭти две функции служат совершенно разным целям. Первая будет использоваться для задания движения в программе. Благодаря соглашению об именовании, тело функции делает именно то, что обозначает название SetCursorPos() . Вызов этой функции устанавливает координаты мыши по заданным (x,y). Обратите внимание, что мы добавили поправки x_pad и y_pad к координатам; это важно делать там, где координаты объявляются.
Вторая функция это простой инструмент который мы будем использовать в интерактивном режиме. Он выводит в консоль координаты текущей позиции мыши. Это сильно ускоряет процесс навигации в меню без необходимости делать скриншот и пользоваться линейками. Мы не хотим постоянно использовать эту функцию, так как некоторая активность мыши будет требовать точного позиционирования, но там где это возможно, это хорошо сэкономит нам время.
На следующем шаге мы применим эти техники для начала навигации в игровом меню. Но сначала надо удалить текущий контент у main() в сode.py и заменить его на тот, который мы написали. На следующем шаге мы будем работать с интерактивным режимом , поэтому функция screenGrab() нам пока не понадобиться.
Шаг 11: Навигация в меню
В этом и в следующих нескольких этапах мы попытаемся собрать координаты для разных событий используя метод get_cords(). Используя его мы сможем быстро построить код для таких вещей как навигация по меню, очистка столов, приготовление еды. После сбора мы встроим их в логику бота.
Давайте начнем. Сохраните и запустите код в Python Shell. С тех пор как на прошлом шаге мы заменили тело функции main() на pass , вы должны увидеть пустое окно после запуска Shell.

Теперь прежде чем перейти к игровой части, нужно пройти 4 начальных меню.
- Кнопка «Play»

- Кнопка «continue»

- Пропустить обучение «skip»

- Кнопка «continue»

Мы должны получить координаты каждой кнопки и добавить их в новую функцию startGame() . Расположите на экране Shell так, чтобы была видна игровая область. Нужно поставить мышь на кнопку, координаты которой нужно получить и выполнить в Shell функцию get_cords(). Убедитесь, что активным окном является Shell. Мы получим в Shell’е координаты текущей позиции мыши. Повторите это для остальных трех окон.
Оставьте Shell открытым и настройте экран так, чтобы видеть IDLE редактор. Добавим функцию startGame() и заполним новыми координатами.
def startGame(): #location of first menu mousePos((182, 225)) leftClick() time.sleep(.1) #location of second menu mousePos((193, 410)) leftClick() time.sleep(.1) #location of third menu mousePos((435, 470)) leftClick() time.sleep(.1) #location of fourth menu mousePos((167, 403)) leftClick() time.sleep(.1)Теперь у нас есть компактная функция, которую можно вызывать на старте каждой игры. Она устанавливает курсор на каждую позицию в меню, которую мы заранее определили и кликает. time.sleep(.1) говорит Питону остановить выполнение на 1/10 секунды между каждым кликом, чтобы меню успевало обновляться между кликами. Сохраните и запустите код.
У меня, как у медленного человека, прохождение меню вручную занимает больше секунды, тогда как наш бот может сделать это в течение примерно 0,4 секунд. Совсем неплохо!
Шаг 12: Зададим координаты еды
Давайте повторим процесс для каждой кнопки.

С помощью get_cords(), соберите координаты еды из меню. Еще раз в Python Shell напишите get_cords(), наведите мышь на еду и выполните команду.
Как вариант, для ускорения работы, если у вас есть второй монитор или вы можете организовать расположение таким образом, чтобы видеть браузер и окно Shell, можно не вводить каждый раз get_cords(), а сделать простой цикл for . Используйте метод time.sleep() чтобы успевать перемещать мышь между итерациями цикла.
for i in range(6): time.sleep(1.2) print get_cords()Нам нужно создать новый класс Cord , чтобы хранить в нем собранные координаты. Возможность вызова через Cord.f_rice дает большие преимущества, так как можно передававть координаты прямо в mousePos() . Как вариант, можно хранить всё в словарях, но я нахожу синтаксис классов более удобным.
class Cord: f_shrimp = (40,340) f_rice = (90, 340) f_nori = (40, 387) f_roe = (90, 387) f_salmon = (40, 440) f_unagi = (90, 440)Мы будем хранить много наших координат в этом классе, там будет некоторое дублирование, поэтому добавив префикс ‘f_’ мы будем знать, что это ссылка на еду, а не, скажем, на заказ еды по телефону.
Продолжим добавлять координаты.
Шаг 13: Координаты пустых мест
Каждый раз после еды посетители оставляют пустые тарелки, на которые нужно кликать, чтобы убрать. Поэтому нам нужно знать расположение тарелок.

Повторите действия из предыдущих шагов, чтобы получить координаты тарелок. Сохраните их пока в закомментированной строке.
""" Plate cords: 87, 208 194, 208 288, 208 395, 208 491, 208 591, 208Осталось всего несколько шагов до действительно интересных штук.
Шаг 14: Координаты телефона
Итак, это будет последняя часть координат. Здесь понадобиться намного больше действий, поэтому вы можете сделать это вручную функцией get_cords() , вместо цикла. Мы собираемся прокликать всё меню телефона, чтобы получить координаты каждого пункта.
Здесь есть сложности, так как нам нужно иметь достаточно денег, чтобы купить что-то. Поэтому нам нужно сделать несколько порций суши, прежде чем вбивать координаты телефонных сделок. Нам придется сделать два суши рола , чтобы купить немного риса.
Есть шесть меню, через которые нам надо пройти.
- Телефон

- Начальное меню

- Начинки

- Рис

- Доставка

Нам нужно получить координаты всех, кроме Саке (можете её тоже добавить, если хотите. На мой взгляд бот отлично работает и без нее).
class Cord: f_shrimp = (40,340) f_rice = (90, 340) f_nori = (40, 387) f_roe = (90, 387) f_salmon = (40, 440) f_unagi = (90, 440) #----------------------------------- phone = (574, 358) menu_toppings = (528, 273) t_shrimp = (495, 224) t_nori = (490, 287) t_roe = (574, 279) t_salmon = (494, 340) t_unagi = (576, 218) t_exit = (591, 342) menu_rice = (532, 293) buy_rice = (548, 281) delivery_norm = (490, 292)Окей! Мы наконец собрали все необходимые координаты. Давайте создадим что-нибудь полезное!
Шаг 15: Убираем со стола
Мы используем координаты собранные ранее для создания функции clear_tables().
def clear_tables(): mousePos((87, 208)) leftClick() mousePos((194, 208)) leftClick() mousePos((288, 208)) leftClick() mousePos((395, 208)) leftClick() mousePos((491, 208)) leftClick() mousePos((591, 208)) leftClick() time.sleep(1)Как вы можете видеть, это выглядит более менее похоже на нашу прошлую функцию startGame(). С одним небольшим отличием: нет функции time.sleep() между кликами. Нам не нужно ждать обновления меню, поэтому не нужно ждать задержку между кликами.
Однако, у нас есть функция time.sleep() в самом конце. Хотя это и не обязательно, лучше добавить паузы в выполнение кода, чтобы была возможность вручную завершить цикл, если это потребуется. В противном случае скрипт будет менять позицию мыши снова и снова и вы не будете в состоянии переместить фокус на Shell, чтобы остановить сценарий. Это прикольно первые два или три раза, но быстро теряет свое очарование.
Шаг 16: Создание суши
Сначала нужно понять как сделать суши. Кликните на книгу рецептов, чтобы открыть инструкции. Все виды суши, встречающиеся в игре, могут быть найдены на страницах этой книги. Оставлю первые три ниже, остальные вы можете найти в книге по ходу игры.

''' Recipes: onigiri 2 rice, 1 nori caliroll: 1 rice, 1 nori, 1 roe gunkan: 1 rice, 1 nori, 2 roe '''Теперь давайте создадим функцию, которая будет принимать в виде аргумента тип суши и затем собирать требуемые ингредиенты для переданного значения.
def makeFood(food): if food == 'caliroll': print 'Making a caliroll' mousePos(Cord.f_rice) leftClick() time.sleep(.05) mousePos(Cord.f_nori) leftClick() time.sleep(.05) mousePos(Cord.f_roe) leftClick() time.sleep(.1) foldMat() time.sleep(1.5) elif food == 'onigiri': print 'Making a onigiri' mousePos(Cord.f_rice) leftClick() time.sleep(.05) mousePos(Cord.f_rice) leftClick() time.sleep(.05) mousePos(Cord.f_nori) leftClick() time.sleep(.1) foldMat() time.sleep(.05) time.sleep(1.5) elif food == 'gunkan': mousePos(Cord.f_rice) leftClick() time.sleep(.05) mousePos(Cord.f_nori) leftClick() time.sleep(.05) mousePos(Cord.f_roe) leftClick() time.sleep(.05) mousePos(Cord.f_roe) leftClick() time.sleep(.1) foldMat() time.sleep(1.5)Эта функция такая же как и все остальные, но с одним небольшим отличием: мы не передаем координаты непосредственно, а вызываем их в качестве атрибутов класса Cord .
Функция foldMat() вызывается в конце каждого приготовления. Она кликает по циновке, чтобы завернуть суши, которое мы приготовили. Давайте зададим её:
def foldMat(): mousePos((Cord.f_rice[0]+40,Cord.f_rice[1])) leftClick() time.sleep(.1)Давайте кратко пройдемся по функции mousePos() . Мы обращаемся к первому значению f_rice через добавление [0] в конце атрибута. Напомню, что это координата x. Для клика по циновке нам необходимо добавить небольшое смещение по оси х, и мы прибавим 40 к значению координаты x и передадим f_price[1] в y. Это сдвинет нашу позицию по x достаточно, чтобы активировать циновку.
Обратите внимание, что после вызова foldMat() у нас идет длинный time.sleep() . Циновка будет закручиваться и ингредиенты будут не доступны для клика, поэтому придется подождать конца анимации.
Шаг 17: Навигация в телефонном меню
В этом шаге мы зададим все точки mousePos() для подходящий пунктов меню, координаты которых были оставлены для этого момента. Эта часть программы которая будет обернута и контролируема логикой бота. Мы вернемся к этой функции, после того как обзаведемся несколькими новыми техниками.
def buyFood(food): mousePos(Cord.phone) mousePos(Cord.menu_toppings) mousePos(Cord.t_shrimp) mousePos(Cord.t_nori) mousePos(Cord.t_roe) mousePos(Cord.t_salmon) mousePos(Cord.t_unagi) mousePos(Cord.t_exit) mousePos(Cord.menu_rice) mousePos(Cord.buy_rice) mousePos(Cord.delivery_norm)Краткое введение в компьютерное зрение
Сейчас в нашем распоряжении имеются очень интересные куски кода. Давайте рассмотрим как научить компьютер «видеть» события. Это очень увлекательная часть процесса.
Еще одна сторона построения бота заключается в том, что в конечном итоге бот может предоставить нам достаточное количество информации, что дальнейшем облегчит работу. Например, в случае суши-бота, как только мы пройдем первый уровень, бот будет предоставлять нам достаточное количество данных о том, что происходит на экране, и все что нам останется сделать это объяснить ему как реагировать на эти новые данные.
Другая большая часть в написании бота это обучение игре. Понимание какие значения нужно отслеживать в игре, а какие можно игнорировать. Например, можно не отслеживать деньги в кассе. Это то, что в конечном счете не имеет отношения к боту. Все, что ему надо знать это достаточно ли еды, чтобы продолжать работать. Таким образом, вместо того, чтобы мониторить количество денег, он просто проверяет, может ли бот что-то купить независимо от цены, потому что в игре это вопрос лишь нескольких секунд. Поэтому если бот не может что-то купить, он просто ждет несколько секунд.
Это подводит нас к финальной точке. Это брутфорс против элегантного решения. Алгоритмы зрения требуют значительного процессорного времени. Проверка нескольких точек во многих разных областях игровой области могут сильно снижать производительность. Таким образом все сводится к вопросу «должен бот узнать о том что что-то случилось или нет?»
Например, посетитель может проходить через четыре состояния: отсутствует, ожидает, ест и закончил есть. Когда закончил есть, он оставляет пустую тарелку. Мы могли бы затратить ресурсы на проверку всех мест просмотрев их, а затем кликнуть напротив ожидаемой тарелки (что может приводить к ошибкам, так как тарелки мигают, давая ложный сигнал). Или можно убирать их простым перебором, прокликивая все места через каждые несколько секунд. На практике прокликивание оказывается таким же эффективным, как и элегантное решение, позволяющее определить состояние клиента. Прокликать шесть мест занимает доли секунды, в то время как захват и обработка шести изображений сравнительно медленный способ. Мы можем использовать сэкономленное время для других более важных задач, связанных с обработкой изображений.
Шаг 18: Импорт библиотек Numpy и ImageOps
Добавим следующие выражения импорта
import ImageOps from numpy import *ImageOps это еще одна библиотека для работы с изображениями Python’а. Она используется для выполнения операций над изображениями (таких как перевод в черно-белый формат).
Я кратко поясню вторую строку для тех, кто близко не знаком с Питоном. Стандартное выражение импорта загружает пространство имен модуля (коллекцию имен переменных и функций). Таким образом, для доступа к элементам из области видимости мы используем синтаксис module.attribute . Однако, используя выражение from _ import мы наследуем имена в локальную область видимости. То есть синтаксис module.attribute больше не нужен. Это не верхний уровень, поэтому мы можем использовать их как встроенные функции Питона, как str() или list() . Импорт Numpy таким способом дает нам возможность просто вызвать array() вместо numpy.array().
Символ * означает импорт всего из модуля.
Шаг 19: Создаем компьютерное зрение
Первый метод сравнивает значения RGB у пикселей с ожидаемым значением. Этот метод отлично подходит для статичных объектов, таких как меню. Так как нужно иметь дело с конкретными пикселями, то метод не слишком надежен для движущихся объектов. Однако, это варьируется от случая к случаю. Иногда это отличная техника, а в другой раз приходится искать другой метод.
Запустите Sushi Go Round в браузере и начните новую игру. Откройте телефонное меню. Можете пока не обращать внимание на посетителей. Вы начинаете игру без денег, поэтому все пункты меню будут серыми как показано ниже. Это и будут те значения RGB, которые мы будем проверять.

В code.py перейдите к функции screenGrub() . Нужно внести следующие изменения:
def screenGrab(): b1 = (x_pad + 1,y_pad+1,x_pad+640,y_pad+480) im = ImageGrab.grab(b1) ##im.save(os.getcwd() + '\\Snap__' + str(int(time.time())) +'.png', 'PNG') return imМы сделали два небольших изменения. Во—первых, мы закомментировали строку, которая сохраняет скриншот. Во—вторых, на шестой строке мы возвращаем объект с изображением после выполнения функции.
Сохраните и запустите код.
Во время того как открыто телефонное меню и все пункты серые, выполните следующий код:
>>>im = screenGrab() >>>Это сохранит скриншот, который мы сделали с помощью функции screenGrub() в переменную im . Теперь мы можем вызвать функцию getpixel(xy) чтобы получить данные о заданных пикселях.
Теперь нам надо получить RGB значения для каждого серого элемента меню. Они нужны для сравнения со значениями, которые бот будет сравнивать с теми, которые он будет получать вызывая getpixel() .
Мы же имеем необходимые координаты после выполнения предыдущих шагов, поэтому просто передадим их в качестве аргументов в функцию getpixel() и запишем результаты.
>>> im = screenGrab() >>> im.getpixel(Cord.t_nori) (109, 123, 127) >>> im.getpixel(Cord.t_roe) (127, 61, 0) >>> im.getpixel(Cord.t_salmon) (127, 71, 47) >>> im.getpixel(Cord.t_shrimp) (127, 102, 90) >>> im.getpixel(Cord.t_unagi) (94, 49, 8) >>> im = screenGrab() >>> im.getpixel(Cord.buy_rice) (127, 127, 127) >>>Если мы добавим эти значения в функцию buyFood() , чтобы знать доступна покупка в данный момент или нет.
def buyFood(food): if food == 'rice': mousePos(Cord.phone) time.sleep(.1) leftClick() mousePos(Cord.menu_rice) time.sleep(.05) leftClick() s = screenGrab() if s.getpixel(Cord.buy_rice) != (109, 123, 127): print 'rice is available' mousePos(Cord.buy_rice) time.sleep(.1) leftClick() mousePos(Cord.delivery_norm) time.sleep(.1) leftClick() time.sleep(2.5) else: print 'rice is NOT available' mousePos(Cord.t_exit) leftClick() time.sleep(1) buyFood(food) if food == 'nori': mousePos(Cord.phone) time.sleep(.1) leftClick() mousePos(Cord.menu_toppings) time.sleep(.05) leftClick() s = screenGrab() print 'test' time.sleep(.1) if s.getpixel(Cord.t_nori) != (109, 123, 127): print 'nori is available' mousePos(Cord.t_nori) time.sleep(.1) leftClick() mousePos(Cord.delivery_norm) time.sleep(.1) leftClick() time.sleep(2.5) else: print 'nori is NOT available' mousePos(Cord.t_exit) leftClick() time.sleep(1) buyFood(food) if food == 'roe': mousePos(Cord.phone) time.sleep(.1) leftClick() mousePos(Cord.menu_toppings) time.sleep(.05) leftClick() s = screenGrab() time.sleep(.1) if s.getpixel(Cord.t_roe) != (127, 61, 0): print 'roe is available' mousePos(Cord.t_roe) time.sleep(.1) leftClick() mousePos(Cord.delivery_norm) time.sleep(.1) leftClick() time.sleep(2.5) else: print 'roe is NOT available' mousePos(Cord.t_exit) leftClick() time.sleep(1) buyFood(food)Мы передаем имя ингредиента в функцию buyFood() . Серия выражений if/else получает переданный параметр и дает соответствующий ответ. Каждая ветка следует одинаковой логике, поэтому мы рассмотрим только одну.
if food == 'rice': mousePos(Cord.phone) time.sleep(.1) leftClick() mousePos(Cord.menu_rice) time.sleep(.05) leftClick() s = screenGrab() time.sleep(.1)Первое, что мы должны сделать это кликнуть на телефон и открыть нужное меню. В этом случае меню с рисом.
s = screenGrab() if s.getpixel(Cord.buy_rice) != (109, 123, 127):Далее мы делаем скриншот области и вызываем getpixel() , чтобы получить RGB-значение пикселя у координат Cord.buy_rice . Мы сравниваем их с RGB-значением пикселя, полученного до этого на неактивном элементе. Если мы получаем в результате сравнения значение True , значит кнопка больше не серая и у нас достаточно денег для покупки. Соответственно, если получаем False , значит не можем себе это позволить.
print 'rice is available' mousePos(Cord.buy_rice) time.sleep(.1) leftClick() mousePos(Cord.delivery_norm) time.sleep(.1) leftClick() time.sleep(2.5)Если у нас достаточно денег, мы просто проходим через оставшиеся этапы, необходимые для покупки.
else: print 'rice is NOT available' mousePos(Cord.t_exit) leftClick() time.sleep(1) buyFood(food)Наконец, если нам не хватает денег, то мы говорим боту закрыть меню, подождать секунду и повторить все сначала. Обычно это вопрос секунд, когда нам снова становится доступна покупка. Довольно просто добавить дополнительную логику, чтобы бот мог решить, нужно ли продолжать ждать или заняться в это время чем-то полезным и вернуться позже.
Шаг 20: Следим за ингредиентами
Окей, до этого момента мы медленно продвигались шаг за шагом. Перепишем часть нашего кода, точнее внешний объект, обеспечивающий входящие данные и принятие решений посредством логики, которая может запускаться сама.
Мы должны придумать способ хранить информацию как много ингредиентов у нас сейчас на руках. Мы будем запрашивать экран в определенной области, или усредняя каждую ячейку ингредиента (к этой технике мы вернемся позже), но в дальнейшем, простой и наиболее быстрый способ просто хранить все элементы в словаре.
Количество каждого ингредиента остается постоянным на старте каждого уровня. Всегда начинаем с 10 обычных ингредиентов (рис, нори, икра), и по 5 дефицитных ингредиентов (креветки, лосось, угорь).

Давайте добавим информацию о них в массив.
foodOnHand =
Ключи массива содержат имена ингредиентов, по ним мы получаем доступ к значениям.
Шаг 21: Добавим отслеживание продуктов в код
Каждый раз, когда мы готовим, мы расходуем ингредиенты. И также пополняем их, когда делаем покупки. Давайте немного расширим нашу функцию makeFood()
def makeFood(food): if food == 'caliroll': print 'Making a caliroll' foodOnHand['rice'] -= 1 foodOnHand['nori'] -= 1 foodOnHand['roe'] -= 1 mousePos(Cord.f_rice) leftClick() time.sleep(.05) mousePos(Cord.f_nori) leftClick() time.sleep(.05) mousePos(Cord.f_roe) leftClick() time.sleep(.1) foldMat() time.sleep(1.5) elif food == 'onigiri': print 'Making a onigiri' foodOnHand['rice'] -= 2 foodOnHand['nori'] -= 1 mousePos(Cord.f_rice) leftClick() time.sleep(.05) mousePos(Cord.f_rice) leftClick() time.sleep(.05) mousePos(Cord.f_nori) leftClick() time.sleep(.1) foldMat() time.sleep(.05) time.sleep(1.5) elif food == 'gunkan': print 'Making a gunkan' foodOnHand['rice'] -= 1 foodOnHand['nori'] -= 1 foodOnHand['roe'] -= 2 mousePos(Cord.f_rice) leftClick() time.sleep(.05) mousePos(Cord.f_nori) leftClick() time.sleep(.05) mousePos(Cord.f_roe) leftClick() time.sleep(.05) mousePos(Cord.f_roe) leftClick() time.sleep(.1) foldMat() time.sleep(1.5)Теперь каждый раз при приготовлении Суши, мы уменьшаем значения наших ингредиентов на соответствующие значения. Теперь дополним код в функции buyFood()
def buyFood(food): if food == 'rice': mousePos(Cord.phone) time.sleep(.1) leftClick() mousePos(Cord.menu_rice) time.sleep(.05) leftClick() s = screenGrab() print 'test' time.sleep(.1) if s.getpixel(Cord.buy_rice) != (127, 127, 127): print 'rice is available' mousePos(Cord.buy_rice) time.sleep(.1) leftClick() mousePos(Cord.delivery_norm) foodOnHand['rice'] += 10 time.sleep(.1) leftClick() time.sleep(2.5) else: print 'rice is NOT available' mousePos(Cord.t_exit) leftClick() time.sleep(1) buyFood(food) if food == 'nori': mousePos(Cord.phone) time.sleep(.1) leftClick() mousePos(Cord.menu_toppings) time.sleep(.05) leftClick() s = screenGrab() print 'test' time.sleep(.1) if s.getpixel(Cord.t_nori) != (33, 30, 11): print 'nori is available' mousePos(Cord.t_nori) time.sleep(.1) leftClick() mousePos(Cord.delivery_norm) foodOnHand['nori'] += 10 time.sleep(.1) leftClick() time.sleep(2.5) else: print 'nori is NOT available' mousePos(Cord.t_exit) leftClick() time.sleep(1) buyFood(food) if food == 'roe': mousePos(Cord.phone) time.sleep(.1) leftClick() mousePos(Cord.menu_toppings) time.sleep(.05) leftClick() s = screenGrab() time.sleep(.1) if s.getpixel(Cord.t_roe) != (127, 61, 0): print 'roe is available' mousePos(Cord.t_roe) time.sleep(.1) leftClick() mousePos(Cord.delivery_norm) foodOnHand['roe'] += 10 time.sleep(.1) leftClick() time.sleep(2.5) else: print 'roe is NOT available' mousePos(Cord.t_exit) leftClick() time.sleep(1) buyFood(food)Шаг 22: Проверка запасов еды
Теперь когда функции makeFood() и buyFood() могут менять количество ингредиентов, нам нужно создать функцию, которая будет отслеживать что количество какого-то ингредиента стало ниже критического уровня.
def checkFood(): for i, j in foodOnHand.items(): if i == 'nori' or i == 'rice' or i == 'roe': if jМы будем циклом обходить пары ключ:значение в массиве с запасами ингредиентов. Если нори, риса или икры останется меньше 4, вызывается функция buyFood(), параметром в которую передается имя ингредиента.
Шаг 23: Перевод RGB значений - Установка
Для того, чтобы двигаться дальше, мы должны получать информацию о том, какой тип суши запрашивает клиент. Сделать это с помощью функции getpixel() было бы достаточно тяжело, так как нам пришлось бы искать область с уникальным значением RGB для каждого вида суши для каждого посетителя. Кроме того, для каждого нового типа суши, вам придется вручную осмотреть его, чтобы увидеть, есть ли у него уникальный RGB, который не найден ни в одном из других типов суши. Это значит, что нам пришлось бы хранить 6 мест, по 8 типов суши. Это 48 уникальных координат.
Очевидно, нам нужен метод попроще.
Метод номер два: усреднение изображения. Этот способ работает с набором RGB-значений, вместо конкретного пикселя. Для каждого скриншота, переведенного в оттенки серого, и загруженного в массив, мы просуммируем все пиксели. Эта сумма обрабатывается также как значение RGB в методе getpixel() .
Гибкость этого метода в том, что, когда он настроен, от нас больше ничего не требуется. По мере ввода новых суши, их значения RGB суммируются и выводятся для нашего использования. Нет необходимости искать конкретные координаты с помощью getpixel() .
Тем не менее, для этого метода требуется настройка. Нам нужно получать скрин только той области, в которой отображается желаемое суши конкретного клиента, а не всего игрового окна.
Найдите уже написанную функцию screenGrab() и скопируйте ее рядом. Переименуйте копию в grab() , и внесите следующие изменения:
def grab(): box = (x_pad + 1,y_pad+1,x_pad+641,y_pad+481) im = ImageOps.grayscale(ImageGrab.grab(box)) a = array(im.getcolors()) a = a.sum() print a return aНа второй строке мы переводим скриншот в оттенки серого и записываем в переменную im . Такой скриншот позволяет работать с ним намного быстрее, так как вместо 3 значений Красного, Зеленого и Голубого, каждый пиксель имеет только одно значение от 0 до 255.
На третьей строчке мы создаем массив значений цветов использую PIL метод getcolors() и записываем в переменную im .
На четвертой строке мы суммируем все точки и выводим их в консоль. Это число по которому мы будем сравнивать изображения.
Шаг 24: Зададим области для скринов заказов
Начните новую игру и дождитесь когда все посетители рассядутся по своим местам. Сделайте скрин двойным кликом по quickGrab.py .

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

Для каждого спич-бабла мы должны быть уверены что верхний левый край начинается в одном и том же месте. Для этого отступим два пикселя от внутреннего края спич-бабла. Первый белый пиксель на второй ступеньке будет началом отсчета.

Для создания пары координат, отсчитайте 63 по оси x и 16 по оси y. Это даст подобный прямоугольник:

Не беспокойтесь о том, что не весь рисунок с суши попал в прямоугольник. Когда мы просуммируем все пиксели, даже небольшие изменения в одном пикселе повлияют на сумму, и мы сможем отличить заказ посетителя.
Приступим к созданию 6 новых функций, каждая будет уточнением функции grab() и будет передавать аргументом координаты спич-баблов. Как только закончим, создадим функцию, запускающую их все сразу для тестирования.
def get_seat_one(): box = (45,427,45+63,427+16) im = ImageOps.grayscale(ImageGrab.grab(box)) a = array(im.getcolors()) a = a.sum() print a im.save(os.getcwd() + '\\seat_one__' + str(int(time.time())) + '.png', 'PNG') return a def get_seat_two(): box = (146,427,146+63,427+16) im = ImageOps.grayscale(ImageGrab.grab(box)) a = array(im.getcolors()) a = a.sum() print a im.save(os.getcwd() + '\\seat_two__' + str(int(time.time())) + '.png', 'PNG') return a def get_seat_three(): box = (247,427,247+63,427+16) im = ImageOps.grayscale(ImageGrab.grab(box)) a = array(im.getcolors()) a = a.sum() print a im.save(os.getcwd() + '\\seat_three__' + str(int(time.time())) + '.png', 'PNG') return a def get_seat_four(): box = (348,427,348+63,427+16) im = ImageOps.grayscale(ImageGrab.grab(box)) a = array(im.getcolors()) a = a.sum() print a im.save(os.getcwd() + '\\seat_four__' + str(int(time.time())) + '.png', 'PNG') return a def get_seat_five(): box = (449,427,449+63,427+16) im = ImageOps.grayscale(ImageGrab.grab(box)) a = array(im.getcolors()) a = a.sum() print a im.save(os.getcwd() + '\\seat_five__' + str(int(time.time())) + '.png', 'PNG') return a def get_seat_six(): box = (550,427,550+63,427+16) im = ImageOps.grayscale(ImageGrab.grab(box)) a = array(im.getcolors()) a = a.sum() print a im.save(os.getcwd() + '\\seat_six__' + str(int(time.time())) + '.png', 'PNG') return a def get_all_seats(): get_seat_one() get_seat_two() get_seat_three() get_seat_four() get_seat_five() get_seat_six()Отлично! Много кода, но это только вариации функции ImageGrab.Grab . Теперь нужно перейти в игру и протестировать. Нужно убедиться, что не зависимо от того в каком спич-бабле находится суши, один и тот же заказ отображает одну и ту же сумму.
Шаг 25: Создаем массив с типами Суши
Как только Вы убедились, что каждый тип суши дает одинаковое значение суммы пикселей, запишите эти суммы в массив:
sushiTypes =
Здесь значение стоит на месте ключа потому, что по нему будет осуществляться поиск.
Шаг 26: Создаем массив мест без спич-баблов
Для работы нам нужны значения сумм скриншотов мест под спич-баблами, чтобы понимать что посетитель отсутствует в данном месте.
Нужно начать игру и выполнить функцию get_all_seats() до того как придет первый посетитель. Полученные значения запишем в массив Blank .
class Blank: seat_1 = 8041 seat_2 = 5908 seat_3 = 10984 seat_4 = 10304 seat_5 = 6519 seat_6 = 8963Шаг 27: Соединяем все вместе
Время окончательно передать контроль нашему боту. Напишем скрипт, который позволит ему реагировать на клиентов, готовить еду и пополнять запасы.
Основа логики будет следующая: Проверка мест > Проверка заказов > Если не хватает ингредиентов, то купить > почистить столы > Повторить сначала
def check_bubs(): checkFood() s1 = get_seat_one() if s1 != Blank.seat_1: if sushiTypes.has_key(s1): print 'table 1 is occupied and needs %s' % sushiTypes[s1] makeFood(sushiTypes[s1]) else: print 'sushi not found!\n sushiType = %i' % s1 else: print 'Table 1 unoccupied' clear_tables() checkFood() s2 = get_seat_two() if s2 != Blank.seat_2: if sushiTypes.has_key(s2): print 'table 2 is occupied and needs %s' % sushiTypes[s2] makeFood(sushiTypes[s2]) else: print 'sushi not found!\n sushiType = %i' % s2 else: print 'Table 2 unoccupied' checkFood() s3 = get_seat_three() if s3 != Blank.seat_3: if sushiTypes.has_key(s3): print 'table 3 is occupied and needs %s' % sushiTypes[s3] makeFood(sushiTypes[s3]) else: print 'sushi not found!\n sushiType = %i' % s3 else: print 'Table 3 unoccupied' checkFood() s4 = get_seat_four() if s4 != Blank.seat_4: if sushiTypes.has_key(s4): print 'table 4 is occupied and needs %s' % sushiTypes[s4] makeFood(sushiTypes[s4]) else: print 'sushi not found!\n sushiType = %i' % s4 else: print 'Table 4 unoccupied' clear_tables() checkFood() s5 = get_seat_five() if s5 != Blank.seat_5: if sushiTypes.has_key(s5): print 'table 5 is occupied and needs %s' % sushiTypes[s5] makeFood(sushiTypes[s5]) else: print 'sushi not found!\n sushiType = %i' % s5 else: print 'Table 5 unoccupied' checkFood() s6 = get_seat_six() if s6 != Blank.seat_6: if sushiTypes.has_key(s6): print 'table 1 is occupied and needs %s' % sushiTypes[s6] makeFood(sushiTypes[s6]) else: print 'sushi not found!\n sushiType = %i' % s6 else: print 'Table 6 unoccupied' clear_tables()Первое что мы делаем — это проверяем запасы. Далее делаем скрин позиции заказа первого посетителя и записываем в s1. После этого проверяем скрин на неравенство пустому месту. Если они не равны, значит у нас есть посетитель. Далее проверяем массив sushiTypes чтобы определить какой заказ сделал посетитель и передаем этот аргумент в функцию makeFood() .
Clear_tables() выполняется через проверку каждых двух мест.
Теперь надо это зациклить.
Шаг 28: Главный цикл
Мы создаем цикл. Так как мы не задаем никакого условия выхода из цикла, то чтобы завершить игру, нужно в консоли нажать CTRL + C.
def main(): startGame() while True: check_bubs()Вот и все! Обновите страницу, дождитесь загрузки игры и запустите бота!
Бот немного неуклюжий и нуждается в доработках. Но это отличный скелет для того чтобы продолжить экспериментировать!
Программы для автоматизации действий на компьютере
Создание ботов для игр
Автоматизация игры в различных казино
Боты для бинарных опционов
Боты для букмекерских контор
Отслеживание изменений различных графиков с ответной реакцией
Автоматизация действий на сайтах и в различных программах
Двухсторонняя связь Бота с Телеграмом
Встроенный сервис выдачи Бесплатных Прокси
Боты для мобильных эмуляторовИ многое другое
Визуальное создание ботов
Визуальный редактор кода Кибор не требует от пользователей владения навыками программирования. Создание ботов происходит с помощью рисованных блоков и установлением связи между ними по принципу Истина/Ложь…
Распознавание текста OCR
Кибор имеет встроенный модуль оптического распознавания текста OCR, задействовать который можно вызовом одной функции как при создание кода, так и в Визуальном редакторе. Так же в наличие инструмент настройки и обучения данной функции…
Графический редактор
Графический редактор Кибор позволяет получить всю нужную информацию о происходящем на экране. Подобрать нужные параметры функций идентификации объектов и подготовить нужные материалы для использование их в скрипте…
Шпион
Инструмен для получения всех параметров по идентификации и управлению окнами и контролами приложений, где будет осуществляться автоматизация…
Продажа своих скриптов
Сервис распространения скриптов в Демо режиме позволяет разработчикам безопасно сдавать в аренду свои программы, удобно управляя лицензированием пользователей прямо из меню Кибор…
АнтиАнтиКликер
АнтиАнтиКликер восстанавливает работу программы Кибор в играх с защитой Frost, GameGuard и другими. При этом Кибор не вмешивается в работу игры или ее защиты…
Что такое бот программа автоматизации действий. Автоматизация действий на компьютере.

Создание бота в визуальном редакторе кода Кибор
Бот - программа выполняющая какие либо действия по заданному алгоритму.
В отличие от кликеров, боты умеют принимать решения и ветвить логику действий в зависимости от сложившейся ситуации.Самыми опасными в плане обнаружения администрацией игры являются сетевые боты пакетники, так как малейшее обновление игры и пакетов, которыми обменивается клиент с сервером приводит к тому, что бот посылает неверные пакеты. Не банятся быстро такие боты только там, где администрации все равно.
Вторые на очереди стоят боты работающие с памятью клиента.
Ну и последними в этом списке, самыми безопасными являются боты кликеры. анализирующие экран и берущие управление клавиатурой и мышью, так как при грамотной реализации алгоритма поведения программы, для сервера такой бот невидим.По реализации так же само.
Реализация бота пакетники и работающего с памятью процесса сложнее чем создание кликерного бота, так как требует от разработчика довольно длительного анализа игры (пакетов и памяти) и знание какого нибудь языка программирования.
Кликерные боты как правило проще для реализации для пользователя незнакомому, или плохо знакомому с программированием, так как работа происходит на более человеческом уровне и при наличие инструментария Кибор не требует специальных знаний. Самым сложным в процессе создания кликерного бота является правильный анализ экрана. Некоторые моменты для него практически недоступны, это прямая ориентировка на местности в полноценных 3D играх. В этом случае часто есть возможность использовать вспомогательные средства предоставляемые клиентом игры. такие как радар. миникарта, автотаргет и прочие. В более простых играх благодаря разнообразным, мощным функциям анализа экрана и их правильному комбинированию, как правило не возникает затруднений, которые не возможно было бы решить.Что бы создать качественный, устойчивый бот необходимо придерживаться некоторых правил.
Для успешной работы бота разработчик должен предусмотреть все возможные нюансы развития событий. Алгоритм работы должен всегда работать по принципу подтверждения правильности действий и отклика от программы в которой происходит автоматизация. Не должно быть тупиковых веток, попав в которые и не получив подтверждение правильного поведения, бот не знает что ему делать, или еще хуже продолжает выполнение алгоритма. Но бывают ситуации. когда предусмотреть все невозможно, или затратно. В этом случае бот должен уметь распознать нестандартную ситуацию. Один из способов это добиться - отследить работу бота по времени, затраченном на выполнение той или иной функции.То есть если после какого либо действия бота он не получил подтверждение об успешности выполнения (не появился какой либо элемент на экране или что нибудь подобное в определенное время) и данная ситуация не предусмотрена алгоритмом работы программы, бот должен следовать аварийному алгоритму работы. Один из таких вариантов может быть перезапуск игры (если это игровой бот).
Программа Кибор предназначена для разработки в основном кликерных ботов, хотя умеет работать с памятью процессов и трафиком и в Кибор можно писать и таких ботов. Почему в Кибор акцент идет именно на кликерные боты? Функции чтения записи в процесс игры в Кибор не намного проще для использования чем в любом другом языке. Поэтому особых преимуществ использовать Кибор в этом направление нет, хотя код получается компактнее и удобнее для использования.
Для работы с графикой в Кибор существует масса специализированного инструментария и разработанных функций.Кибор может идентифицировать на экране практически любой объект, имеет встроенный модуль распознавания текста, инструмент для анализа изображения, его динамики и изменения яркости и множества другого. Что делает работу с ним в этом направление увлекательным и продуктивным.
Кроме того Кибор подходит для использования как опытным программистом, поскольку Си образный скриптовый язык содержит в себе более 100 специально разработанных функций анализа экрана, распознавания текста, работы с трафиком и процессами, работы с окнами и контролами, манипулирования клавиатурой и мышью и т.д., плюс полный набор нужных операторов и возможность использовать WinApi. Так и интуитивно понятный Визуальный редактор кода, использовать который могут пользователи далекие от программирования.
Создание блок схем алгоритма работы программы происходит путем рисование блоков и соединения их по принципу Истина/Ложь. Так же возможно создавать блоки для Визуального редакторы путем простой записи действий, как в простейших атокликерах. При такой записи возможно создание блоков управления клавиатурой и мышью, анализа экрана и поиска на нем нужных объектов и распознавания текста. После создания схемы она транслируется в исполняемый Кибором программный код, который можно при желание изменять и корректировать как обычный скрипт, коим он и является.