Распознавание изображений пазлами

Автоматизированное решение пазлов при помощи нейросети.

Сколько стоит?   сейчас этап тестирования |

  • Среднее время распознавания 0.08 сек
  • Система статистики и панель дэшборда
  • Создавалось под задачи ZennoPoster и BAS
  • При объемах от 100к в день скидки
SmartCaptcha Яндекс распознавание нейросети
Программа для решения пазлов в поисковых системах, каптчи

Для работы нужно скачать (v1.20240413, 264 Мб) программу. Она служит коннектором между вашим скриптом и сервисом. В ней частично закэшированы многие ответы, поэтому распознавание будет работать быстро.

API документация

API построен на HTTP-запросах. После запуска программы создается веб-сервер http://127.0.0.1:3000 (порт можно указать в config.txt), на который нужно отсылать запросы для решения пазлов. Адреса:

  • http://127.0.0.1:3000/in.php POST для отправки изображения и получения результата;
  • http://127.0.0.1:3000/fail.php POST для отправки неверного решения или если решение не было найдено;
  • http://api.white-captcha.com/balance.php GET получение баланса в рублях.

Параметры файла config.txt (находится в архиве с программой):

  • API ключ от аккаунта сервиса;
  • PORT порт для запуска веб-сервера (http://127.0.0.1:PORT), служит для обмена данными между программой и white-captcha.com;
  • DEBUG вывод логов предсказаний в консоль. Ошибки выводятся всегда.

Алгоритм распознавания изображения с помощью сервиса:

  1. Получите ваш персональный ключ API в настройках вашего аккаунта. Для каждого пользователя генерируется уникальный аутентификационный токен. Это строка из 32 символов, которая может выглядеть так: 098f6bcd4621d373cade4e832627b4f6. Полученный ключ используется для всех ваших запросов к серверу.
  2. Скачайте и запустите программу, изменив API ключ на ваш в config.txt. Если ошибок при запуске нет, консоль выведет текущий баланс.
  3. Отправьте POST-запрос на URL: http://127.0.0.1:3000/in.php с параметрами, указанные ниже. Сервер сразу вернет результат или код ошибки, если сервер не смог обработать запрос.

1. Отправка запроса

Список параметров POST-запроса к http://127.0.0.1:3000/in.php

Важно: запрос должен в формате json отправляться: 'Content-type': 'application/json'
Параметр Тип Обязателен Описание
body Строка Да Изображение, закодированное в формат base64. Содержит скриншот картинки пазла (размер 295x177 px) после прохождения слайдера, находится в теге <canvas>. В ZennoPoster и BAS ф-ция создания скриншота есть.
task_id Строка Нет Случайная строка любой длины. Нужно самому сгенерировать при 1-ой итерации решения пазла. Служит идентификатором и значение будет отправлено в /fail.php для подсчета статистики на дэшборде сервиса. Если пазл был решен неверно или не был найден ответ, нужно создать новое значение task_id
soft_id Число Нет Уникальный идентификатор владельцев публичного софта. Для них создана отдельная страница статистики.

При успешном отправке запроса или в случае ошибки сервер всегда вернет ответ с кодом состояния (status code) HTTP 200.

Ответ всегда возвращается в формате json. Помимо этого сервер вернет в переменную balance информацию о денежном балансе аккаунта. Примеры ответов:

  • {"status": 1, "method_1": 0, "method_1_prob": 1.0, "method_2": 0, "method_2_prob": 1.0, "balance": 5000.0}
  • {"status": 1, "method_1": 0, "method_1_prob": 1.0, "method_2": 1, "method_2_prob": 0.98, "balance": 4999.985}
  • {"status": 0, "request": "ERROR_KEY_DOES_NOT_EXIST", "error_text": "Указанный ключ не существует"}

В случаи любой ошибки ответ вернет "status": 0 с кодом ошибки в request. Если модель успешно распознала изображение, status будет равен 1 и в method_1 и method_2 запишутся результаты распознавания 0 или 1, а в method_1_prob и method_2_prob их вероятности соответственно (всегда от 0.5 до 1.0).

В программе заложено 2 различных метода распознавания. За 1 прогонку method_1 может равняться 1 только 1 раз, в то время как method_2 может равняться 1 несколько раз. Среднее время ответа сервера должно быть приблизительно 0.08 сек.

Алгоритм действий:

  1. Создается пустой массив решений метода 2 на каждой итерации. Допустим, method_2_results = [].
  2. Делается 1-ая итерация отправки скриншота пазла, задаем переменную iteration=1.
  3. Полученные результаты 2-го метода сохраняем в массив (на каждой итерации) method_2_results.push({'step': iteration, 'method_2': method_2, 'method_2_prob': method_2_prob}).
  4. Если method_1 и method_2 равен 0, а предыдущее значение method_2 тоже равно 0, то прокручиваем пазл дальше. Предыдущее значение смотрим через массив method_2_results[].
  5. Если method_1 равен 1, то данное решение можно отправлять на проверку и выходим из цикла прокрутки пазлов. method_1_prob служит вспомогательным ответом и всегда большо 0.9 (90%).
  6. Если method_2 равен 1, то прокручиваем пазл дальше.
  7. Если method_2 равен 0, а предыдущее значение равно 1, то значит дальше смысла нет идти. Теперь нужно в method_2_results[] отобрать максимальное значение вероятности предсказания method_2_prob и отправить решение на проверку на шаге step. Если две вероятности имеют одинаковое значение, то выбираем любое.

2. Неверные решения

Сюда отправляются неверные решения (пазл не прошел проверку) или если решение не было найдено. Данное дейтвие не является обязательным, но служит в помощь для аналитических подсчетов в панели дэшборда сервиса. Визуально он похож на интерфейс графиков Яндекса.

Список параметров POST-запроса к http://127.0.0.1:3000/fail.php

Параметр Тип Обязателен Описание
fail Число Да 1 — решение не было найдено.
2 — решение не прошло проверку.
task_id Строка Нет Переменная, созданная на этапе /in.php
soft_id Число Нет Уникальный идентификатор владельцев публичного софта.

3. Таблица ошибок

Код ошибки Описание
ERROR_WRONG_USER_KEY Параметр key не указан
ERROR_KEY_DOES_NOT_EXIST Указанный API ключ не существует
ERROR_EMPTY_BODY Параметр body не задан
ERROR_TOO_BIG_IMAGE_FILESIZE Размер body превышает 200 Кб
ERROR_ZERO_IMAGE_FILESIZE Размер body менее 100 байт
ERROR_UPLOAD Изображение не удалось декодировать из base64
ERROR_ZERO_BALANCE На счету недостаточно средств для работы
ERROR_INTERNAL_SERVER Внутренняя ошибка сервера. Все такие ошибки логируются, поэтому вскоре будет устранено, иначе обратитесь в поддержку
ERROR_BAD_REQUEST Один из входных параметров имеет недопустимое значение
ERROR_APP_FREEZE Ошибка в одном из процессов при связи программы с сервером white-captcha.com в результате зацикливания. Для решения нужно детально смотреть, свяжитесь с технической поддержкой.
ERROR_TOO_MANY_REQUESTS От вас приходит слишком много запросов в единицу времени. Для увеличения обратитесь в поддержку.

4. Примеры кода

Пример кода на языке Python.

import requests

data = {
    'body': body, # base64 скриншота пазла
}
response = requests.post('http://127.0.0.1:3000/in.php', json=data, headers={'Content-type': 'application/json'}).json()
print(response)

Пример кода в программе Browser Automation Studio. Скачать полный шаблон. Включает этап прохождения слайдера.

_switch_http_client_main()
http_client_post("http://127.0.0.1:3000/in.php",
    [
        "body", [[IMAGE_BASE64]],
    ],
    {
        "content-type":("json"), // важно отправить запрос в формате json
        "encoding":("UTF-8"),
        "method":("POST"),
        headers:("")
    }
)!

_switch_http_client_main()
[[RESPONSE_RESULTS]] = http_client_encoded_content("auto")
log([[RESPONSE_RESULTS]])

Пример шаблона на ZennoPoster еще не создан, но в данных темах есть информация как получить base64 из картинки и <canvas>: