Explainers

Что такое Solve Media CAPTCHA

Если в разметке формы встретились скрытые поля adcopy_challenge и adcopy_response, перед вами Solve Media — текстовая CAPTCHA, в которой вместо искажённого набора символов показывается рекламная фраза вроде «Quality You Can Trust». Пользователь читает слоган на картинке и вводит его в поле. Технически это обычная картинка с текстом, поэтому решается она тем же OCR-методом, что и любая другая image-капча.

Проект был куплен и переименован (Permit.io / Radius Networks), новых внедрений почти нет, но легаси-формы на старых сайтах и внутренних порталах живут годами. Ниже — как опознать Solve Media, чем она отличается от классической текстовой проверки и как получить распознанную фразу через API CaptchaAI.


Как устроена проверка Solve Media

Последовательность максимально простая, без скрытых токенов и фоновых скоринговых запросов:

  1. Виджет подгружает изображение с рекламным сообщением.
  2. Пользователь читает фразу и вводит её в поле ввода.
  3. Введённый текст уходит на серверы Solve Media и сверяется с эталоном.
  4. При совпадении форма отправляется дальше.
┌─────────────────────────────────┐
│                                 │
│   "Taste The Rainbow"           │
│                                 │
├─────────────────────────────────┤
│ Type the phrase: [____________] │
│                     [Verify]    │
└─────────────────────────────────┘

Ключевой момент для автоматизации: ответом здесь является не токен, а строка. Её не нужно подставлять в скрытое поле особого формата — достаточно ввести текст в тот же input, что и человек, и отправить форму.


Как найти Solve Media в коде страницы

Проверьте исходник формы на эти маркеры:

<!-- Solve Media script -->
<script src="https://api.solvemedia.com/papi/challenge.script"></script>

<!-- Widget container -->
<div id="adcopy-outer"></div>

<!-- Hidden response fields -->
<input type="hidden" name="adcopy_challenge" />
<input type="hidden" name="adcopy_response" />

Любые элементы с идентификаторами, начинающимися на adcopy- или solvemedia, однозначно указывают на Solve Media. Скрипт всегда подгружается с api.solvemedia.com, поэтому самый быстрый способ проверки — открыть вкладку Network в Chrome DevTools и отфильтровать запросы по этому домену.


Решение Solve Media через OCR API CaptchaAI

Отдельного метода для Solve Media нет, и он не нужен: на вход уходит скриншот виджета, на выходе — текст фразы. Логика та же, что в обычном сценарии распознавания изображений: отправить задачу в in.php, сохранить ID задачи, опрашивать res.php до готовности.

Python

import requests
import time
import base64

API_KEY = "YOUR_API_KEY"

# Capture the CAPTCHA image
# Method 1: Screenshot the widget
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://example.com/page-with-solvemedia")

captcha_img = driver.find_element(By.CSS_SELECTOR, "#adcopy-puzzle-image img")
captcha_img.screenshot("solvemedia.png")

# Submit to CaptchaAI
with open("solvemedia.png", "rb") as f:
    img_b64 = base64.b64encode(f.read()).decode()

response = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "base64",
    "body": img_b64,
    "phrase": 1,      # Contains spaces (multi-word phrase)
    "json": 1
})

task_id = response.json()["request"]

# Poll for solution
for _ in range(30):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY, "action": "get", "id": task_id, "json": 1
    }).json()
    if result.get("status") == 1:
        text = result["request"]
        print(f"Phrase: {text}")
        break

# Type the phrase
driver.find_element(By.CSS_SELECTOR, "#adcopy_response").send_keys(text)
driver.find_element(By.CSS_SELECTOR, "form").submit()

Node.js

const axios = require('axios');
const fs = require('fs');

async function solveSolveMedia(imagePath) {
  const imageB64 = fs.readFileSync(imagePath).toString('base64');

  const submit = await axios.post('https://ocr.captchaai.com/in.php', null, {
    params: {
      key: 'YOUR_API_KEY',
      method: 'base64',
      body: imageB64,
      phrase: 1,
      json: 1
    }
  });

  const taskId = submit.data.request;

  for (let i = 0; i < 30; i++) {
    await new Promise(r => setTimeout(r, 5000));
    const res = await axios.get('https://ocr.captchaai.com/res.php', {
      params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
    });
    if (res.data.status === 1) return res.data.request;
  }
  throw new Error('Timeout');
}

Обратите внимание на интервал опроса: пять секунд между запросами к res.php — разумный компромисс. Более частый опрос не ускорит решение, а лишь добавит лишних запросов и усложнит разбор логов.


Параметры запроса для фразовых капч

Параметр Зачем он нужен
phrase=1 Фразы Solve Media состоят из нескольких слов и содержат пробелы
numeric=2 В слоганах обычно только буквы, без цифр
Не задавать min_len / max_len Длина рекламной фразы заранее неизвестна
Не приводить регистр Часть реализаций сверяет ответ без учёта регистра

Эти четыре настройки закрывают большинство ошибок распознавания на Solve Media. Если фраза возвращается корректной, но форма её не принимает, причина почти всегда не в OCR: текст подставлен в неправильный input или отправлен уже после того, как виджет успел обновить задачу.


Solve Media и обычная текстовая CAPTCHA: в чём разница

Характеристика Solve Media Стандартная текстовая CAPTCHA
Содержимое Фирменные фразы, осмысленные слова Случайный набор символов
Читаемость Высокая (текст должен продаваться) Низкая (текст должен мешать)
Искажение Минимальное Сильное
Модель монетизации Реклама Отсутствует
Сложность для OCR Низкая (чистый текст) Высокая (искажения и шум)
Опыт пользователя Лучше (узнаваемые слова) Хуже (трудно прочитать)

Разница объясняется целью продукта. Solve Media задумывалась как рекламный формат: если человек не прочитает слоган, рекламодатель не получит контакт с брендом. Отсюда чистый шрифт, минимум шума и словарные слова вместо aX3kP — то есть ровно те условия, при которых OCR работает уверенно.


Сценарий: инвентаризация старых форм перед миграцией

Типичная задача для команд в Москве, Минске или Алматы, которые поддерживают долгоживущие проекты: заказчик переносит сайт 2013 года на новый стек, а в двух формах обратной связи обнаруживается Solve Media. Разумный порядок действий:

  1. Пройтись краулером по карте сайта и собрать страницы, где встречается api.solvemedia.com.
  2. Для каждой формы завести автотест на staging-копии, который проходит проверку целиком — со скриншотом виджета и распознаванием фразы через API.
  3. Держать этот тест зелёным до конца миграции, чтобы отличать «форма сломалась при переезде» от «капча просто не отвечает».
  4. После перехода на современную проверку — например, на Cloudflare Turnstile или reCAPTCHA v2 — удалить тест вместе со старой формой.

Если по пути собираются заявки или логи с персональными данными, ограничьтесь тем объёмом, который вы вправе обрабатывать: для проектов под 152-ФЗ это стандартная часть чек-листа приёмки и к выбору сервиса распознавания отношения не имеет.


Во что обходится распознавание

CaptchaAI тарифицируется по числу одновременных потоков, а не по количеству решений: внутри тарифа число решений на поток не ограничено. Отсюда простое правило выбора:

  • Разовая инвентаризация легаси-форм — BASIC ($15/мес, 5 потоков). Задачи идут пачками по несколько десятков, высокого параллелизма не требуют.
  • Регулярный регрессионный прогон, где тесты стартуют одновременно, — STANDARD ($30/мес, 15 потоков). Пиковая нагрузка приходится на старт сборки, а не на её середину.

Актуальные тарифы стоит сверять на странице цен captchaai.com, а не в статье.

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


Частые вопросы

Встречается ли Solve Media в 2026 году?

Практически только в легаси: сервис давно сменил владельца, новые сайты его не подключают. Но старые CMS-шаблоны, внутренние порталы и формы, которых никто не касался десять лет, всё ещё отдают виджет adcopy.

Можно ли получить фразу без распознавания изображения?

Иногда да. Проверьте скрытое поле adcopy_challenge и ответ API виджета: в отдельных реализациях текст доступен прямо в исходнике страницы, и скриншот тогда не нужен. Если поля пустые или содержат только идентификатор задачи — возвращайтесь к OCR.

Обязательно ли поднимать браузер ради скриншота виджета?

Не всегда. Если изображение отдаётся отдельным запросом к api.solvemedia.com, его можно скачать в той же сессии — с теми же cookies и идентификатором задачи. Selenium или Playwright нужны там, где виджет рендерится в iframe и вытащить картинку из разметки напрямую не выходит.

Форма не принимает распознанную фразу — что проверить?

  • Текст ушёл в нужный input — adcopy_response, а не соседнее поле формы.
  • Виджет не успел подгрузить новую задачу, пока шло распознавание.
  • Значение не сбрасывает обработчик на фронтенде при потере фокуса.
  • В строке не осталось лишних пробелов по краям.

Влияет ли регистр букв на результат?

Часть реализаций сверяет ответ без учёта регистра, часть — с учётом. Безопаснее отправлять текст ровно в том виде, в каком его вернул API, и не приводить строку к нижнему регистру «на всякий случай».


Смежные материалы

Комментарии для этой статьи отключены.