Если в разметке формы встретились скрытые поля adcopy_challenge и adcopy_response, перед вами Solve Media — текстовая CAPTCHA, в которой вместо искажённого набора символов показывается рекламная фраза вроде «Quality You Can Trust». Пользователь читает слоган на картинке и вводит его в поле. Технически это обычная картинка с текстом, поэтому решается она тем же OCR-методом, что и любая другая image-капча.
Проект был куплен и переименован (Permit.io / Radius Networks), новых внедрений почти нет, но легаси-формы на старых сайтах и внутренних порталах живут годами. Ниже — как опознать Solve Media, чем она отличается от классической текстовой проверки и как получить распознанную фразу через API CaptchaAI.
Как устроена проверка Solve Media
Последовательность максимально простая, без скрытых токенов и фоновых скоринговых запросов:
- Виджет подгружает изображение с рекламным сообщением.
- Пользователь читает фразу и вводит её в поле ввода.
- Введённый текст уходит на серверы Solve Media и сверяется с эталоном.
- При совпадении форма отправляется дальше.
┌─────────────────────────────────┐
│ │
│ "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. Разумный порядок действий:
- Пройтись краулером по карте сайта и собрать страницы, где встречается
api.solvemedia.com. - Для каждой формы завести автотест на staging-копии, который проходит проверку целиком — со скриншотом виджета и распознаванием фразы через API.
- Держать этот тест зелёным до конца миграции, чтобы отличать «форма сломалась при переезде» от «капча просто не отвечает».
- После перехода на современную проверку — например, на 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, и не приводить строку к нижнему регистру «на всякий случай».