wulu-geetest-bypass-icon
Offline icon-type solver for Geetest v4 CAPTCHAs. Locates the background collage icon that matches each question and returns normalized click coordinates.
How it works
The icon CAPTCHA shows a collage background built from the same icons that
appear as questions, which makes it a matching problem rather than a
recognition one:
- The background collage goes through a YOLO model, which returns one box per
direction icon (
u,d,l,r,lu,ld,ru,rd). - Each question thumbnail is MD5-hashed. That digest is the CDN filename of the
asset, so it maps straight to a direction via
DIR_HASHES— no image comparison involved. - The question is answered with the center of the first still-unused detection facing that direction.
A question with an unknown MD5, or whose direction has no detection, raises
UnsupportedQuestionError instead of guessing.
Model
The default model is a YOLOv8n ONNX export: input 640x640, output
[1, 12, 8400], 8 direction classes. It is not trained here — both the ONNX file
and the DIR_HASHES table come from
gaogzhen/GeekedTest under the MIT License.
See THIRD_PARTY_NOTICES.md.
Lookup order
$WULU_ICON_MODEL, if it points at an existing file<CACHE_DIR>/<FILENAME>- download
model_url()intoCACHE_DIR
The model also downloads on first use. To prefetch it, run the main package's CLI:
wulu-geetest download icon
If huggingface.co is unreachable, point HF_ENDPOINT at a mirror — the same
variable huggingface_hub reads, so anything already configured for it works
here too:
export HF_ENDPOINT=https://hf-mirror.com
wulu-geetest download icon
--endpoint is shorthand for setting that variable for the one command:
wulu-geetest download icon --endpoint https://hf-mirror.com
download_model(progress=None, *, force=False) is registered under the
wulu_geetest_bypass.downloads entry point group, which is how that command finds
it; call it directly to download without the framework.
Environment variables
| Variable | Meaning | Default |
|---|---|---|
WULU_ICON_MODEL |
Path to the ONNX model. Ignored if the file does not exist. | unset → cache, then download |
WULU_ICON_DIRECTIONS |
Comma-separated channel order. Used only when the model carries no names metadata. |
u,d,l,r,lu,ld,ru,rd |
WULU_ICON_CONF_THRES |
Confidence threshold. | 0.10 |
WULU_ICON_IOU_THRES |
NMS IoU threshold. | 0.45 |
WULU_ICON_MAX_DET |
Max boxes kept per background. | 4 |
HF_ENDPOINT |
Base URL the model is downloaded from; set it to a mirror when huggingface.co is unreachable. Read on each download, so it may be set after import. |
https://huggingface.co |
Source constants (_config.py)
For downstream forks that ship their own model:
| Constant | Meaning | Default |
|---|---|---|
FILENAME |
Model filename; also its name inside the cache dir. | icon_t1_261010 |
OWNER, HF_REPO |
HuggingFace repo holding the model. | wulu007, gt |
DEFAULT_ENDPOINT |
Host used when HF_ENDPOINT is unset. |
https://huggingface.co |
model_url() |
{endpoint}/{OWNER}/{HF_REPO}/resolve/main/{FILENAME}. |
— |
CACHE_DIR |
Where the model is cached. | platformdirs.user_cache_dir('wulu-geetest-bypass', appauthor=False) |
DIR_HASHES |
Question-icon MD5 → direction. | 8 CDN assets |
Class order
Read from the model's names metadata when present, so a retrained model with a
different class order works with no configuration. Otherwise
WULU_ICON_DIRECTIONS (or its default) is used.
Either way the result must be a permutation of the eight known directions, or
the first detection raises UnsupportedModelError — as does a model exported
with end2end=True (built-in NMS). The output channel count must equal
4 + len(classes); anything else raises too.
Usage
uv add wulu-geetest-bypass[icon]
The solver registers as an entry point of the wulu_geetest_bypass.solvers
group under the icon captcha type, and is discovered automatically by
wulu_geetest_bypass.
from wulu_geetest_bypass import Geetest
solver = Geetest(captcha_id='your_captcha_id', risk_type='icon')
seccode = await solver.resolve()
Metadata
Release files for wulu-geetest-bypass-icon 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| wulu_geetest_bypass_icon-0.1.0.tar.gz | 8.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| wulu_geetest_bypass_icon-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 18.2 kB
Release files / wulu_geetest_bypass_icon-0.1.0.tar.gz
| Download URL | wulu_geetest_bypass_icon-0.1.0.tar.gz |
|---|---|
| Size | 8.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8298b01520cc4247c9a3016290c2e5c540b133ef955711ba33e9b2709f03f9e6
|
|
BLAKE2b-256 checksum How to use checksums |
060f5d933660b0aee95bf172f6fbaa88ba1fe15d4aaa2cf7e63501c0dc88427d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / wulu_geetest_bypass_icon-0.1.0-py3-none-any.whl
| Download URL | wulu_geetest_bypass_icon-0.1.0-py3-none-any.whl |
|---|---|
| Size | 10.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
407e0900ddb0f20c7decdf363574ea9ab0318e8e6f1549ed703491a694c00c52
|
|
BLAKE2b-256 checksum How to use checksums |
3978a68ab73df78315d5013692c6b6dcb4fe25cc59dc1bf4fbaa2595ebca843d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|