wulu-shumei-bypass
| English | 简体中文 |
A Python framework for interacting with Shumei (数美) CAPTCHA service — handles registration, image fetching, parameter encryption, and verification submission.
The framework itself is fully open-source. Reverse-engineered solvers for specific captcha modes are distributed as private extension modules (see Private Extensions).
Features
- 🧩 Protocol-level integration — handles captcha registration, image fetching, field encryption, and verification submission against the Shumei (数美) API
- 🔐 Correct encryption out of the box — DES-encrypted protocol fields (
selectData,mouseData,duration, etc.) with the right parameter names per protocol version - 🖱️ Realistic trajectory generation — human-like mouse movement paths for slide captchas
- 🧠 Pluggable solver architecture — register your own solver per mode with
@Shumei.add_solver, or use the private extensions - 📦 Multi-mode support —
slide,auto_slide,select,icon_select,seq_select,spatial_select
Installation
uv add wulu-shumei-bypass
# or
pip install wulu-shumei-bypass
Optional extras
| Mode | Status | Extra |
|---|---|---|
slide |
✅ | wulu-shumei-bypass[cv] |
spatial_select |
✅ | wulu-shumei-bypass[cv] |
auto_slide |
✅ | — |
icon_select |
🔒 | — |
seq_select |
🔒 | — |
select |
❌ | — |
Legend: ✅ = open source · 🔒 = private extension · ❌ = not available
Quick Start
Register & verify (slide)
import asyncio
from wulu_shumei_bypass import Shumei
async def main():
s = Shumei(
organization='your-organization-id',
mode='slide',
)
result = await s.solve()
print(result)
asyncio.run(main())
Register manually & fetch images
import asyncio
from wulu_shumei_bypass import Shumei
async def main():
s = Shumei(organization='your-organization-id', mode='icon_select')
reg = await s.register() # -> RegisterResult (rid, bg, fg, ...)
bg = await s.fetch_img(reg['bg']) # raw bytes of background image
fg = await s.fetch_img(reg['fg']) # raw bytes of foreground image
asyncio.run(main())
Low-level verify with a custom solver
import asyncio
from wulu_shumei_bypass import Shumei
@Shumei.add_solver('seq_select')
def solve_seq(bg: bytes) -> list[list[float]]:
# return a list of [x_ratio, y_ratio] click points in click order
...
async def main():
s = Shumei(organization='your-organization-id', mode='seq_select')
reg = await s.register()
result = await s.fverify(reg)
print(result) # {'code': 1100, 'riskLevel': 'PASS', ...}
asyncio.run(main())
API Overview
Shumei(**params)
| Param | Type | Default | Description |
|---|---|---|---|
organization |
str |
(required) | Organization ID assigned by Shumei |
app_id |
str |
default |
Application ID |
channel |
str |
default |
Channel identifier |
version |
str |
1.0.4 |
Protocol version (rversion) |
sdkver |
str |
1.1.3 |
SDK version |
mode |
Mode |
slide |
Captcha mode |
lang |
str |
zh-cn |
Language |
os_type |
OSType |
web_pc |
OS type (web_pc / web_mobile) |
captcha_uuid |
str |
auto | Session UUID (auto-generated) |
xhr_hooked |
bool |
True |
Whether the target site hooks XHR |
custom_data |
dict |
{} |
Extra data sent with registration |
Methods
await s.register() -> RegisterResult— obtain a new captcha challengeawait s.fetch_img(path: str) -> bytes— download a captcha imageawait s.fverify(reg: RegisterResult) -> VerifyResult— submit a solutionawait s.solve(retry: int = 3) -> VerifyResult— register → solve → verify until PASS@Shumei.add_solver(mode)— register a custom solver for a mode
Solver contract
Each solver receives the image bytes and returns click coordinates as ratios (0.0–1.0 relative to image dimensions), in click order:
| Mode | Signature |
|---|---|
slide |
(bg: bytes, fg: bytes) -> float (slide ratio) |
auto_slide |
(no solver needed) |
spatial_select |
(bg: bytes, order: str) -> tuple[float, float] |
icon_select |
(bg: bytes, fg: bytes) -> list[list[float]] |
select |
(bg: bytes, order: list[str]) -> list[list[float]] |
seq_select |
(bg: bytes) -> list[list[float]] |
Private Extensions
Solvers for icon_select, seq_select, and select are not bundled with this open-source package. They live in private repositories and are loaded automatically when installed:
wulu-shumei-bypass-iconwulu-shumei-bypass-seq
Contact the author for access to the private extensions.
Development
uv sync --dev
uv run pytest
Disclaimer
⚠️ For educational and research purposes only. Use at your own risk.
This project is intended solely for security research, reverse-engineering education, and interoperability testing. The author is not responsible for any misuse, unauthorized access, or violation of third-party terms of service. Always ensure your use complies with applicable laws and the terms of the services you interact with.
License
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file wulu_shumei_bypass-0.1.0.tar.gz.
File metadata
- Download URL: wulu_shumei_bypass-0.1.0.tar.gz
- Upload date:
- Size: 46.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e25b5bb3d0b03e2166fe55253fc629d1287a90c32a66965184542e190af01bf5
|
|
| MD5 |
d26be74eaeccd24b5e73ab875d6e2fae
|
|
| BLAKE2b-256 |
2d201587ae0f84a721cf0b5ba773e1fb97258e63a6b2595c2abe71d018928bc9
|
File details
Details for the file wulu_shumei_bypass-0.1.0-py3-none-any.whl.
File metadata
- Download URL: wulu_shumei_bypass-0.1.0-py3-none-any.whl
- Upload date:
- Size: 12.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b1a1d81bac6a68c1fb8a463e609ab5ee75c010ae98b72a53d8dadc488e0465e8
|
|
| MD5 |
872c13ff75d10821278c6695b57112fd
|
|
| BLAKE2b-256 |
dcd4921f837c61200646badcafc81f6277abb3ec111b29269507e762773fb463
|