CAPTCHA / GEETEST_SLIDE

GeeTest / Slide

Капча с пазлом: solver ищет горизонтальное положение выреза на основном фоне и возвращает x в пикселях.

Входные данные

Подготовьте background.png — исходный фон, slice.png — исходный фрагмент пазла с прозрачностью, и ypos — его вертикальную координату из данных раунда. Сохраняйте оригинальные размеры обоих файлов.

Параметры

ПараметрТипОбязателенПо умолчаниюНазначение
imagestringДа—Исходное изображение в base64.
slicestringДа—Фрагмент пазла в base64. Нужен PNG с сохранённым alpha-каналом: по нему определяется контур фрагмента.
yposintegerНет0Вертикальная координата фрагмента на основном фоне. Возьмите реальное значение из текущего задания. Если пропустить поле, поиск выполняется по строке 0, что подходит только для такого задания.

Ответ

Данные распознаванияТипНазначение
extra.xintegerX левого края фрагмента, совмещённого с вырезом, в пикселях оригинального фона. Это положение, а не автоматически рассчитанная длина перетаскивания ползунка.
extra.debug.scorenumberОценка совпадения контура в выбранном положении.
extra.debug.marginnumberСравнение лучшего положения с другими кандидатами.

Применение

Читайте result["extra"]["x"]. Пересчитайте положение с учётом масштаба картинки на странице и начального положения фрагмента.

Частые ошибки

  • JPEG-фрагмент теряет alpha-контур — используйте оригинальный PNG.
  • Не берите ypos из другого раунда и не подменяйте его координатой DOM-элемента на странице.
  • extra.x не равен расстоянию движения ползунка во всех реализациях интерфейса.
Ошибки сценария и повторы →

Пример запроса

Python · requests
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("background.png"),
    "slice": image64("slice.png"),
    "ypos": 48,
}

# Создайте один ID на задачу; сохраняйте его для сетевых повторов.
request_id = str(uuid.uuid4())
response = requests.post(
    "https://capi.z3n.pro/v1/solve/geetest_slide",
    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()
print(result["extra"]["x"])
Оплата и все маршруты →