CAPTCHA / GEETEST_NINE
GeeTest / Nine
A captcha with a 3×3 grid: pick the cells that match the hint image. The hint is an object or an emotion (a crying, angry or smiling face); the server detects the task kind itself. The solver returns the cell indices.
Input
Prepare grid.jpg — the full 3×3 grid, and hint.png — the hint picture from the task. Do not cut out the nine cells yourself: the server splits grid.jpg.
0 1 2 3 4 5 6 7 8
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| image | string | Yes | — | Source image in base64. |
| ques | string[] | Yes | — | Non-empty array of base64 hints. This solver uses the first element: normally send exactly one hint. |
| prompt_key | string | No | Empty string | Original name or path of the hint image from the provider's data. The last path segment is used for the dictionary of known tasks. If the key is missing or not found, the hint is classified from the image. |
| picks | integer | No | 3 | How many cells to select. Usually 3. Use the number from the task. |
Response
| Recognition data | Type | Description |
|---|---|---|
| extra.cells | integer[] | Selected cells, indices 0–8: left to right, top to bottom. Sorted by index. |
| extra.debug.kind | string | object — the hint is an object; emotion — the hint is an emotion. |
| extra.debug.label | string | The object or emotion (crying, angry, smiling) that was searched for. |
| extra.debug.label_source | string | dict — the hint was found by prompt_key; image — the emotion was recognized from the hint image; zero-shot — the object was determined from the image. |
| extra.debug.sim | number[9] | Diagnostic match scores of the nine cells against the hint. |
Applying the answer
Read result["extra"]["cells"]. For index i: column = i % 3, row = i // 3. Cell centre relative to a grid of width W and height H: x = (column + 0.5) × W / 3; y = (row + 0.5) × H / 3. Add the grid's position on the page and submit the verification.
Common mistakes
- Numbering starts at 0: top-left square is 0, bottom-right is 8.
- The grid and hint must belong to the same round.
Request example
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,
}
# One ID per task; keep it for network retries.
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.