CAPTCHA / TENCENT_ICONS
Tencent / Icons
Tencent "Click in this order" captcha: coloured icons on the image, three black ones on the strip in the required order. The response is the click points. Available through the direct API.
Input
Prepare bg.jpg, the 672×480 image (dyn_show_info.bg_elem_cfg.img_url in the cap_union_prehandle response), and sprite.jpg, the 170×50 strip (dyn_show_info.sprite_url). Send the files of one task unchanged.
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| image | string | Yes | — | Source image in base64. |
| order | string | Yes | — | The icon strip in base64. |
Response
| Recognition data | Type | Description |
|---|---|---|
| confidence | number | The lowest p score among the points. |
| extra.points[].index | integer | Click number, starting at 1. The order matches the icons on the strip. |
| extra.points[].x / y | number | Click point in pixels of the original image. |
| extra.points[].name | string | Icon name. |
| extra.points[].p | number | Score of the found icon, from 0 to 1. |
| extra.points[].match | number | Similarity of the strip icon to the known icon of this name. |
| extra.size | integer[2] | Width and height of the original image. |
Applying the answer
Click the extra.points in order. If the original image is W×H and it is shown on the page as w×h, the coordinate relative to the image on the page is x × w / W, y × h / H.
Common mistakes
- The image and the strip must belong to the same task.
- Do not crop or scale the files before sending.
- A 422 unsolvable_image (4001) response: the solver did not find the icons of this round. detail names the step and what it saw; the reserve is released. Keep the image and order you sent: they are a sample for training the model.
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("bg.jpg"),
"order": image64("sprite.jpg"),
}
# One ID per task; keep it for network retries.
request_id = str(uuid.uuid4())
response = requests.post(
"https://capi.z3n.pro/v1/solve/tencent_icons",
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 point in result["extra"]["points"]:
print(point["index"], point["x"], point["y"])
capi.