Troubleshooting

Ошибки координат изображения сетки: диагностика и исправление

Если 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, с которыми реально сталкивается парсер:

  • crosswalks
  • traffic lights
  • cars
  • buses
  • motorcycles
  • bicycles
  • fire hydrants
  • stairs
  • bridges
  • parking 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.


Связанные руководства

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