Если Grid Image CAPTCHA возвращает не те ячейки — кликает не по тем плиткам или падает с ERROR_CAPTCHA_UNSOLVABLE — почти всегда виноват один из четырёх параметров запроса: grid_size, необрезанное изображение, точный текст instructions или база отсчёта индексов. Ниже — таблица симптомов, а за ней разбор каждой причины с рабочим кодом.
Быстрая диагностика по симптому
Сверьте поведение с таблицей — это сразу подскажет, какой раздел читать первым.
| Симптом | Вероятная причина | Что проверить |
|---|---|---|
| Клики уходят на соседнюю плитку | Неверный grid_size (3×3 вместо 4×4 или наоборот) |
Ширина скриншота в px, разделённая на 3 и на 4 |
ERROR_CAPTCHA_UNSOLVABLE без явной причины |
Скриншот обрезан или снят со всей страницы | Захват элемента внутри iframe, не всей страницы |
| Задача решена, но не то, что просили | Текст instructions расплывчатый |
Точное совпадение с формулировкой CAPTCHA |
| Клик стабильно смещён на одну ячейку | Индексация с 0 вместо 1 | Вычитание 1 из каждого индекса перед кликом |
ERROR_WRONG_FILE_EXTENSION |
Формат файла не поддерживается | Конвертация в PNG или JPG перед отправкой |
Если симптом не подходит ни под одну строку — переходите к полному чек-листу ниже, по порядку.
Как CaptchaAI считает координаты ячеек
CaptchaAI получает изображение сетки, анализирует каждую ячейку и возвращает массив индексов, соответствующий инструкции. Нумерация — слева направо, сверху вниз:
3×3 Grid: 4×4 Grid:
1 2 3 1 2 3 4
4 5 6 5 6 7 8
7 8 9 9 10 11 12
13 14 15 16
Ответ выглядит так: [1, 3, 6, 9] — это значит, что ячейки 1, 3, 6 и 9 содержат целевые объекты.
Нумерация всегда с 1, а не с 0 — источник самой частой ошибки при постобработке ответа.
Основные причины ошибок координат и как их исправить
Ниже — пять причин по убыванию частоты, с которой они встречаются в обращениях в поддержку.
Неверный параметр grid_size
Самая частая ошибка координат. CAPTCHA — сетка 4×4, а в запросе указан grid_size=3x3: нумерация ячеек съезжает, и алгоритм выбирает не те плитки.
# WRONG — 4×4 grid sent as 3×3
data = {
"key": "YOUR_API_KEY",
"method": "post",
"grid_size": "3x3", # Wrong!
"img_type": "recaptcha",
"instructions": "traffic lights",
"json": 1
}
# CORRECT — match the actual grid
data = {
"key": "YOUR_API_KEY",
"method": "post",
"grid_size": "4x4", # Correct
"img_type": "recaptcha",
"instructions": "traffic lights",
"json": 1
}
Как определить размер сетки программно, не полагаясь на угадывание:
from PIL import Image
img = Image.open("grid_captcha.png")
width, height = img.size
# reCAPTCHA grids are square. 3×3 tiles are ~100px each, 4×4 tiles are ~75px each
tile_width = width // 3
if width % 4 == 0 and (width // 4) < 100:
grid_size = "4x4"
else:
grid_size = "3x3"
print(f"Detected grid size: {grid_size}")
Как проверить, что исправление сработало
Сверьте grid_size в логе запроса с шириной изображения, поделённой на количество столбцов.
Изображение обрезано или пересобрано скриншотом
Обрезанное, изменённое в размере или завёрнутое в скриншот всей страницы изображение ломает выравнивание сетки. CaptchaAI нужен исходный CAPTCHA-кадр именно в том виде, в котором его отрисовал браузер.
Например, если парсер вызывает screenshot() для всей страницы вместо элемента внутри iframe, в кадр попадают чужие пиксели — шапка, отступы, соседние виджеты — и координаты смещаются. Особенно заметно это на серверах с ограниченными ресурсами: рендер под нагрузкой идёт дольше, и скриншот снимается раньше, чем сетка отрисовалась полностью. Это типично для CI-раннеров и дешёвых VPS в европейских регионах, где команды из Минска, Алматы или Киева гоняют Selenium/Playwright-фермы.
Решение: захватывайте изображение напрямую из iframe reCAPTCHA, а не скриншотом всей страницы.
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com")
# Switch to reCAPTCHA iframe
iframe = driver.find_element(By.CSS_SELECTOR, 'iframe[title*="recaptcha"]')
driver.switch_to.frame(iframe)
# Get the grid image element
grid_img = driver.find_element(By.CSS_SELECTOR, "img.rc-image-tile-wrapper img")
grid_img.screenshot("grid_captcha.png") # Captures just the grid, not the whole page
Как проверить, что исправление сработало
Сравните разрешение сохранённого файла с фактическим разрешением области CAPTCHA в iframe — совпадение значит, что лишние пиксели больше не попадают в кадр.
На медленных CI-раннерах дождитесь появления всех тайлов в DOM перед вызовом
screenshot()— это устраняет «плавающие» промахи.
Инструкция instructions не совпадает с текстом CAPTCHA
Текст инструкции должен буквально соответствовать тому, что просит CAPTCHA. Расплывчатая формулировка — прямой путь к неверному выбору ячеек.
# WRONG — too vague
data["instructions"] = "select images"
# CORRECT — specific instruction from the CAPTCHA
data["instructions"] = "crosswalks"
Частые значения instructions, с которыми реально сталкивается парсер:
crosswalkstraffic lightscarsbusesmotorcyclesbicyclesfire hydrantsstairsbridgesparking meters
Формулировка берётся из текста самой CAPTCHA, а не задаётся заранее в коде.
Как проверить, что исправление сработало
Сверьте строку instructions с подписью над сеткой на скриншоте — расхождение уже даёт неверный выбор.
Ячейки сдвинуты: индексация с 0 или с 1
CaptchaAI возвращает индексы ячеек, отсчитываемые с 1. Если код автоматизации ожидает индексацию с 0 (как большинство коллекций в Python), из каждого значения нужно вычесть 1.
import json
# CaptchaAI returns 1-based indices
solution = json.loads(result["request"]) # e.g., [1, 3, 6, 9]
# Convert to 0-based for Selenium click automation
zero_based = [cell - 1 for cell in solution]
# Click grid cells using 0-based index
tiles = driver.find_elements(By.CSS_SELECTOR, ".rc-image-tile-wrapper img")
for idx in zero_based:
tiles[idx].click()
Как проверить, что исправление сработало
Выведите solution и zero_based рядом в логе — значения должны отличаться ровно на 1.
Неподдерживаемый формат файла
CaptchaAI принимает JPG, JPEG, PNG и GIF. Остальные форматы возвращают ERROR_WRONG_FILE_EXTENSION.
# WRONG — WebP or BMP
files = {"file": open("grid.webp", "rb")} # Not supported
# CORRECT — convert to PNG first
from PIL import Image
img = Image.open("grid.webp")
img.save("grid.png", "PNG")
files = {"file": open("grid.png", "rb")}
Как проверить, что исправление сработало
Отправьте тестовую задачу после конвертации и убедитесь в отсутствии ERROR_WRONG_FILE_EXTENSION.
Дополнительные проверки перед отправкой ответа
Даже когда все четыре параметра выше формально верны, координаты иногда всё равно промахиваются мимо цели.
Проверьте связку «скриншот → масштаб → индексация» ещё раз, прежде чем открывать тикет в поддержку.
- Сверяйте размеры сетки с координатами, которые ожидает целевая страница — расхождение в пиксель на масштабировании даёт промах по соседней плитке.
- Нормализуйте масштаб изображения и область просмотра, чтобы клики оставались верными при смене zoom и device pixel ratio.
- Отклоняйте ответы за границами объявленной сетки, а не пересылайте некорректные координаты дальше по пайплайну.
- Логируйте
grid_size, скриншот и ответ CaptchaAI хотя бы в staging — без этого разбор случайного промаха превращается в гадание.
Пошаговый алгоритм диагностики
Grid cells are wrong
↓
Is grid_size correct (3x3 or 4x4)? → No → Fix grid_size parameter
↓ Yes
Is the image the original CAPTCHA (not cropped)? → No → Capture directly from iframe
↓ Yes
Is instruction text specific? → No → Use exact CAPTCHA instruction text
↓ Yes
Using 1-based indexing for clicks? → No → Convert solution to 0-based
↓ Yes
Image in supported format (JPG/PNG)? → No → Convert image format
↓ Yes
Report tiles to CaptchaAI via reportbad
Как сообщить CaptchaAI о неверном решении
Если координаты стабильно неверны при заведомо корректных параметрах, отправьте отчёт через reportbad:
requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "reportbad",
"id": task_id,
"json": 1
})
Это помогает CaptchaAI повышать точность распознавания и в части случаев возвращает стоимость решения.
reportbad— сигнал для дообучения, а не жалоба; не стоит вызывать его на заведомо верных решениях.
Часто задаваемые вопросы
С чего начать диагностику, если сетка выбирает не те ячейки?
Пройдите причины по убыванию частоты: сначала сверьте grid_size с реальной сеткой на скриншоте, затем убедитесь, что изображение не обрезано, проверьте точность текста instructions и только потом смотрите на индексацию 0/1.
Какие размеры grid image CAPTCHA поддерживает CaptchaAI?
Сетки 3×3 и 4×4 — это стандартные форматы изображений в reCAPTCHA v2.
Как программно определить, сетка 3×3 или 4×4, до отправки запроса?
Измерьте ширину изображения в пикселях и сравните деление на 3 и на 4: у сетки 4×4 плитка меньше (обычно около 75 px), у 3×3 — крупнее (около 100 px). Логика — в примере кода выше.
Почему индексы ячеек в ответе сдвинуты на единицу?
CaptchaAI отсчитывает индексы с 1. Если код ожидает индексацию с 0 (стандарт для списков в Python и большинства DOM-коллекций), вычтите 1 из каждого значения перед кликом.
Стоит ли вызывать reportbad, если координаты всё равно неверны?
Да — если параметры запроса точно правильные (сетка, инструкция, необрезанное изображение), а результат стабильно промахивается. reportbad помогает CaptchaAI скорректировать распознавание и в части случаев возвращает стоимость решения.
Шпаргалка перед деплоем: четыре значения для финальной проверки
Перед тем как отправлять пайплайн в продакшн, сверьте эти четыре параметра — вместо того чтобы перечитывать статью целиком.
| Параметр | Правильное значение | Раздел с подробностями |
|---|---|---|
grid_size |
Совпадает с реальной сеткой на скриншоте (3x3 или 4x4) |
«Неверный параметр grid_size» |
| Изображение | Оригинальный кадр из iframe, без обрезки и ресайза | «Изображение обрезано или пересобрано скриншотом» |
instructions |
Точный текст с самой CAPTCHA, без обобщений | «Инструкция instructions не совпадает с текстом CAPTCHA» |
| Индексация | Приведена к 0-based перед кликом (или оставлена 1-based под ваш код) | «Ячейки сдвинуты: индексация с 0 или с 1» |
Подключите точное решение grid image CAPTCHA
Получите точные координаты ячеек на captchaai.com.