CAPTCHA / GEETEST_SLIDE
GeeTest / Slide
Капча с пазлом: solver ищет горизонтальное положение выреза на основном фоне и возвращает x в пикселях.
Входные данные
Подготовьте background.png — исходный фон, slice.png — исходный фрагмент пазла с прозрачностью, и ypos — его вертикальную координату из данных раунда. Сохраняйте оригинальные размеры обоих файлов.
Параметры
| Параметр | Тип | Обязателен | По умолчанию | Назначение |
|---|---|---|---|---|
| image | string | Да | — | Исходное изображение в base64. |
| slice | string | Да | — | Фрагмент пазла в base64. Нужен PNG с сохранённым alpha-каналом: по нему определяется контур фрагмента. |
| ypos | integer | Нет | 0 | Вертикальная координата фрагмента на основном фоне. Возьмите реальное значение из текущего задания. Если пропустить поле, поиск выполняется по строке 0, что подходит только для такого задания. |
Ответ
| Данные распознавания | Тип | Назначение |
|---|---|---|
| extra.x | integer | X левого края фрагмента, совмещённого с вырезом, в пикселях оригинального фона. Это положение, а не автоматически рассчитанная длина перетаскивания ползунка. |
| extra.debug.score | number | Оценка совпадения контура в выбранном положении. |
| extra.debug.margin | number | Сравнение лучшего положения с другими кандидатами. |
Применение
Читайте result["extra"]["x"]. Пересчитайте положение с учётом масштаба картинки на странице и начального положения фрагмента.
Частые ошибки
- JPEG-фрагмент теряет alpha-контур — используйте оригинальный PNG.
- Не берите ypos из другого раунда и не подменяйте его координатой DOM-элемента на странице.
- extra.x не равен расстоянию движения ползунка во всех реализациях интерфейса.
Пример запроса
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"])
capi.