CAPTCHA / GEETEST_NINE
GeeTest / Nine
Капча с сеткой 3×3: по изображению-подсказке нужно выбрать соответствующие ячейки. Подсказка — предмет или эмоция (плачущее, злое, улыбающееся лицо); вид задания сервер определяет сам. Solver возвращает индексы ячеек.
Входные данные
Подготовьте grid.jpg — полную сетку 3×3, и hint.png — картинку-подсказку из задания. Не вырезайте девять ячеек вручную: сервер разделит grid.jpg сам.
0 1 2 3 4 5 6 7 8
Параметры
| Параметр | Тип | Обязателен | По умолчанию | Назначение |
|---|---|---|---|---|
| image | string | Да | — | Исходное изображение в base64. |
| ques | string[] | Да | — | Непустой массив base64-подсказок. Этот solver использует первый элемент: обычно отправляйте ровно одну подсказку. |
| prompt_key | string | Нет | Пустая строка | Исходное имя или путь изображения-подсказки из данных провайдера. Последняя часть пути используется для словаря известных заданий. Если ключ отсутствует или не найден, подсказка классифицируется по изображению. |
| picks | integer | Нет | 3 | Сколько ячеек выбрать. Обычно 3. Укажите количество из задания. |
Ответ
| Данные распознавания | Тип | Назначение |
|---|---|---|
| extra.cells | integer[] | Выбранные ячейки с индексами 0–8: слева направо, сверху вниз. Массив отсортирован по индексу. |
| extra.debug.kind | string | object — подсказка-предмет; emotion — подсказка-эмоция. |
| extra.debug.label | string | Предмет или эмоция (crying, angry, smiling), по которой выполнялся поиск. |
| extra.debug.label_source | string | dict — подсказка найдена по prompt_key; image — эмоция узнана по картинке подсказки; zero-shot — предмет определён по изображению. |
| extra.debug.sim | number[9] | Диагностические оценки соответствия девяти ячеек подсказке. |
Применение
Читайте result["extra"]["cells"]. Для индекса i: столбец = i % 3, строка = i // 3. Центр ячейки относительно сетки шириной W и высотой H: x = (столбец + 0.5) × W / 3; y = (строка + 0.5) × H / 3. Добавьте положение сетки на странице и отправьте проверку.
Частые ошибки
- Нумерация начинается с 0: верхний левый квадрат — 0, нижний правый — 8.
- Сетка и подсказка должны принадлежать одному раунду.
Пример запроса
import base64
from pathlib import Path
import os
import uuid
import requests
def image64(filename):
return base64.b64encode(Path(filename).read_bytes()).decode("ascii")
payload = {
"image": image64("grid.jpg"),
"ques": [image64("hint.png")],
"picks": 3,
}
# Создайте один ID на задачу; сохраняйте его для сетевых повторов.
request_id = str(uuid.uuid4())
response = requests.post(
"https://capi.z3n.pro/v1/solve/geetest_nine",
headers={
"Authorization": f"Bearer {os.environ['CAPI_API_KEY']}",
"Content-Type": "application/json",
"Idempotency-Key": request_id,
},
json=payload,
timeout=90,
)
response.raise_for_status()
result = response.json()
for index in result["extra"]["cells"]:
row, column = divmod(index, 3)
print(index, row, column)
capi.