Распознавание изображений пазлами
Автоматизированное решение пазлов и распознавание объектов при помощи нейросети.
Сколько стоит? 10 руб. / 1000 каптч |
- Среднее время распознавания 0.08 сек
- Система статистики и панель дэшборда
- Создавалось под задачи ZennoPoster и BAS
- При объемах от 100к в день скидки
Для работы нужно скачать (v1.20240413, 264 Мб) программу. Она служит коннектором между вашим скриптом и сервисом. В ней частично закэшированы многие ответы, поэтому распознавание будет работать быстро.
API документация
API построен на HTTP-запросах. После запуска программы создается веб-сервер http://127.0.0.1:3000 (порт можно указать в config.txt), на который нужно отсылать запросы для решения пазлов. Адреса:
http://127.0.0.1:3000/in.phpPOST для отправки изображения и получения результата;http://127.0.0.1:3000/fail.phpPOST для отправки неверного решения или если решение не было найдено;http://api.white-captcha.com/balance.php?key=abcdefg123GET получение баланса в рублях.
Параметры файла config.txt (находится в архиве с программой):
APIключ от аккаунта сервиса;PORTпорт для запуска веб-сервера (http://127.0.0.1:PORT), служит для обмена данными между программой и white-captcha.com;DEBUGвывод логов предсказаний в консоль. Ошибки выводятся всегда.
Алгоритм распознавания изображения с помощью сервиса:
- Получите ваш персональный ключ API в настройках вашего аккаунта. Для каждого пользователя генерируется уникальный аутентификационный токен. Это строка из 32 символов, которая может выглядеть так:
098f6bcd4621d373cade4e832627b4f6. Полученный ключ используется для всех ваших запросов к серверу. - Скачайте и запустите программу, изменив API ключ на ваш в config.txt. Если ошибок при запуске нет, консоль выведет текущий баланс.
- Отправьте 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 сек.
Алгоритм действий:
- Создается пустой массив решений метода 2 на каждой итерации. Допустим,
method_2_results = []. - Делается 1-ая итерация отправки скриншота пазла, задаем переменную
iteration=1. - Полученные результаты 2-го метода сохраняем в массив (на каждой итерации)
method_2_results.push({'step': iteration, 'method_2': method_2, 'method_2_prob': method_2_prob}). - Если
method_1иmethod_2равен0, а предыдущее значениеmethod_2тоже равно0, то прокручиваем пазл дальше. Предыдущее значение смотрим через массивmethod_2_results[]. - Если
method_1равен1, то данное решение можно отправлять на проверку и выходим из цикла прокрутки пазлов.method_1_probслужит вспомогательным ответом и всегда большо 0.9 (90%). - Если
method_2равен1, то прокручиваем пазл дальше. - Если
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>:
- https://zennolab.com/discussion/threads/kak-dostat-kartinku-iz-kehsh-v-base64.115029/post-763814
- https://zennolab.com/discussion/threads/get-traffic-c-kak-rabotaet.113008/
- https://zennolab.com/discussion/threads/poluchit-dannye-iz-gettraffic-v-peremennye.46607/
- https://zennolab.com/discussion/threads/kak-na-letu-kodit-kartinki-v-base64.38232/post-696751