Для клиентов: обработка запросов (получение бесплатного ключа, просмотр текущего ключа и периода его действия)
Для администратора: выдача ключей пользователю по ID страницы VK (как для бота, так и для анти-капчи), просмотр информации о пользователе из базы данных, аннулирование подписок у пользователя, сброс HWID пользователя
Работа в свернутом режиме. Бот полностью функционален в таком режиме, вы можете запустить его, свернуть игру и заниматься своими делами, все оповещения о его работе вы увидите в меню
Автодетект сумки
Автоматическое перекладывание рыбы из инвентаря в сумку при заполнении инвентаря
Автодетект удочки и приманки, вам не нужно класть их в определенные слоты, бот найдет их сам
Автоматическое восстановление голода (при наличии еды в инвентаре, в список можно добавить любую еду, которая у вас есть)
Автоматическое восстановление настроения (бот сам определит, сколько сигарет вам нужно выкурить для того, чтобы удочка не сломалась из-за плохого настроения)
Звуковые оповещения при появлении капчи или при перегрузе сумки/инвентаря
Уведомления в ВК при появлении капчи или при перегрузе сумки/инвентаря
Автоматическое выбрасывание любой рыбы (список указывается в конфиге, по умолчанию - Стерлядь) при перегрузе инвентаря
Счетчик прибыли: бот определяет, какую рыбу вы поймали и увеличивает вашу прибыль за вычетом стоимости приманки. Цены на рыбу можно поменять в файле настроек, как минимальную, так и максимальную. При нажатии на счетчик прибыли бот пересчитает ваш доход как в максимум, так и в минимум. Прибыль можно обнулить, если хотите считать заново
Останавливаться, если рыба сорвалась. Функция не особо нужна, за время тестов рыба не срывалась, но если такое и произойдет, то бот остановит свою работу
Пауза между подходами: после каждого вылова рыбы бот будет останавливаться на время (стандарт: 1 секунда, можно поменять в файле настроек или выключить вообще)
Задержка между кликами при вылове рыбы. Вы можете изменить это значение, если у вас проблемы с пингом, хотя за время тестов нужды в этом не было
Меню. Вы можете изменить прозрачность меню, либо же свернуть его, чтобы оно вам не мешало
О рыбалке на проекте
Составляющие механики рыбалки на данном проекте:
У нас есть удочка (их 3 вида, все содержат в своем названии слово Удочка)
У нас есть приманка (цена - 35$)
На сервере есть лишь несколько мест, где разрешено рыбачить, при входе в нужную нам зону появляется соответствующий индикатор желтого цвета в левом нижнем углу окна игры
На сервере присутствует механика голода и настроения. Соответствующие индикаторы о плохом настроении и голоде располагаются в том же месте, что и индикатор места для рыбалки
Плохое настроение (появление индикатора фиолетового цвета) добавляет шанс на то, что во время рыбалки удочка сломается
Голод (появление индикатора оранжевого цвета) постепенно уменьшает кол-во здоровья персонажа
Есть множество видов рыб, у каждой свой шанс вылова и своя цена
Каждая рыба имеет вес, поэтому инвентарь (максимум 10 кг) заполняется, на проекте так же существуют сумки и рюкзаки, при наличии которых, наш бот будет перекладывать всю рыбу в них при перегрузе инвентаря
Принцип самого процесса рыбалки на данном проекте:
Открываем инвентарь в игре и закидываем удочку (ПКМ по ней)
Ждем появления соответсвующего индикатора красного цвета о том, что настало время быстро нажимать на ПКМ до появления индикатора остановки белого цвета (и так циклично, пока не выловим)
Когда мы успешно вылавливаем рыбу, внизу экрана появляется сообщение с названием данной рыбы
Выловленная рыба оказывается у нас в инвентаре и хранится в следующем виде
Раз в 20 выловленных рыб появляется сообщение о необходимости пройти капчу (Google reCaptcha v2), если мы откажемся и нажмем на кнопку Я робот, то мы не сможем рыбачить 10-20-30-40 и т.д. минут
Как все работает?
Принцип работы нашего бота:
Аутентификация пользователя (схематично, без подробностей)
В отдельном потоке детектим процесс с игрой и получаем IntPtr ее окна
При нажатии на кнопку F4 бот ищет цвет индикатора места, разрешенного для рыбалки, в определенной области окна игры, и, если он найден, бот начинает свою работу
То же самое выполняется для индикаторов настроения и голода, если соответствующие настройки включены в меню бота
Бот отправляет нажатие клавиши I в окно с игрой, открывается инвентарь
Бот считывает вес инвентаря с определенной области и определяет, есть на вас сумка или же нет. В соответствии с этим выводом, он сканирует область инвентаря (если есть сумка, то инвентарь располагается выше, чем если ее нет) и получает координаты найденых вещей, которые он может использовать
Мы разбиваем сетку инвентаря (или сумки) на одинаковые квадраты, циклично проходимся по всем квадратам и обрабатываем их через Tesseract, который возвращает текст, найденный в каждом из квадратиков. Местонахождение предмета - точка середины квадрата, в котором был найден текст, идентифицирующий данный предмет
Если ваш инвентарь забит (n >= 9.6, т.к. средний вес рыбы - 0.4 кг.) и при этом у вас есть сумка, то бот сам переложит имеющеюся рыбу в сумку. Если ее нет, то бот выдаст ошибку и отправит уведомление о перегрузе в ВКонтакте
При наличии удочки/приманки бот просто нажмет ЛКМ по удочке и начнет рыбачить, в противном случае бот сообщит об ошибке (и уведомит в ВКонтакте)
После начала рыбалки бот сканирует потенциальную область расположения кнопки "Я робот" (чтобы обнаружить капчу, если она появилась)
Далее, каждые 100 мсек. бот ищет в области появления индикатора о начале вылова рыбы пикселя красного цвета
Как только пиксель был обнаружен, бот начинает отправлять в окно с игрой нажатия ЛКМ с заданной пользователем скоростью, одновременно ища белый пиксель в той же области, в которой был найден красный. И так циклично, пока не появится сообщение об успешном/провальном вылове рыбы
Бот считывает текст снизу экрана, определяет, что за рыба была поймана, и, при включенной функции счетчика прибыли, учтет эту рыбу в статистике и прибавит ее стоимость за вычетом цены приманки в счетчик прибыли (рыбы и их цены можно изменять в файле конфигурации)
Принцип работы антикапчи:
Образная схема взаимодействия с клиентом (без подробностей)
Антикапча запускается отдельным приложением и представляет из себя TCP сервер, ожидающий подключения клиентов
Как только у одного из пользователей появляется капча, бот подключается к TCP серверу антикапчи, происходит аутентификация (бот высылает HWID пользователя, антикапча проверяет через POST/GET запрос к нашему captcha.php, есть ли у данного пользователя доступ к антикапче)
Если аутентификация прошла успешна, пользователь добавляется в очередь на решение капчи и пока он находится в очереди, каждые 10 сек. ему высылается его номер в очереди, который бот выводит в статус, чтобы пользователь мог понять, сколько ему еще осталось ждать
При запуске нашего сервера мы можем ввести число - кол-во сущностей, которые будут работать с пользователями (1 сущность - одновременно обрабатывается 1 пользователь). Когда очередь не пуста, каждая сущность пытается взять из очереди клиента, который успешно прошел аутентификацию и был допущен к решению капчи. Как только одной (или нескольким сразу) сущности это удалось, начинается обработка клиента
Все картинки, полученные от разных пользователей обрабатывает единый объект YoloWrapper. Мы используем Mutex, чтобы предотвратить одновременный доступ к YoloWrapper со стороны нескольких сущностей
Для чего нам вводить понятие сущностей в наш проект? Дело в том, что пока YoloWrapper работает с сущностью N1, другие (N2, N3, и т.д.) за это время уже начнут обрабатывать капчу (примут массив с байтами со стороны клиента, выяснят, что надо искать в капче, какое задание выполнять), а когда обработка YoloWrapper, запущенная со стороны сущности N1, закончится, тогда уже N2 запустит свою обработку YoloWrapper. Таким образом вы увеличиваем скорость прохождения капчи в случае, если у нас много пользователей
Как только сущность антикапчи закончила обработку полученного изображения, она высылает своему клиенту сериализованный словарь, ключ которого - точка (куда нажимать боту на капче), а значение - число (пауза между текущим и следующим нажатием)
Бот получает этот словарь и выполняет указанные сервером действия. Таким образом и проходится капча
Возможности системы подписок на приложение:
Привязка пользователей по принципу ID VK - уникальный ключ - HWID (уникальный ключ формата FISHBOT_[0-9A-Z]{16}, пример: FISHBOT_Y1NZVSY18W6EJUFA)
Пользователь получает ключ в группе ВК в автоматическом режиме, используя комманду "бесплатный ключ", сгенерированный ключ привязывается к пользователю по VK ID. Как только пользователь введет этот ключ при запуске бота, ключ привяжется к HWID пользователя (уникальный идентификатор компьютера, только на котором будет работать данный ключ)
Выдача подписок (как на бота, так и на антикапчу) администратором в автоматическом режиме через ту же группу ВК. Достаточно использовать команду "выдать бота (или капчу) [VK ID] [Период]. Допустимый диапазон поля [Период] - 1 неделя, 2 недели, 1 месяц, Навсегда
Просмотр всей информации о пользователе администратором, используя команду "подписки [VK ID]"
Аннулирование подписки администратором, используя команду "аннулировать [VK ID]"
Сброс HWID у пользователя администратором, используя команду "сбросить [VK ID]"