MOD 01
目标站点 · Target Sites
Dual WebView Routing
链接属性:微信链接 = 使用微信 UA 库(MOD 04);浏览器链接 = 使用浏览器 UA 库。
验证码属性每条链接可设为 普通 / 问答 / 点击 / 无(仅浏览,不打码不调大模型);选「继承默认」则用下方「默认验证码属性」。
子属性(打码类型 / 图片验证 / 问答关键词)随所选属性显示。
App 首次启动从列表随机锁定一条链接,之后每次启动都只访问该链接(仅当该链接被移出列表才重新随机)。
可见性互斥开关 · Visibility (仅能二选一)
Site 01
—
Site 02
—
两站同时真实加载。被隐藏的一方仍会完整渲染与执行 JS,仅在设备屏幕上不可见。
切换任一侧为「可视化」会自动把另一侧设为「隐藏」。
前台显示模式 · Front Display(站一可见时显示什么)
站点模式:站一可见位显示站点一网站(原行为);
App 模式:站一可见位显示伪装 App「星愿」(模版参数见 MOD 08)。
站点二可见时不受影响,始终显示验证码页;切换保存后 App 约 20 秒内生效。
网站二访问行为 · Site 2 Visit(随机停留 / 随机刷新)
随机停留:网站二每次加载后随机一个「下限 ~ 上限」内的在线秒数,超时即关闭
(卸载页面并隐藏,本次运行不再自动重开)。两项都填
随机刷新:刷新只发生在随机停留时长走完之后 —— 停留结束时再随机判断是否刷新 (「刷新概率」命中则随机「次数下限 ~ 上限」次)。 每次刷新后重新加载网站二、重新获取验证码并输入,同时随机停留计时重置(重新随机一个在线秒数); 判断为刷新就先刷新而不是关闭,计划刷新全部完成后,最后一次停留走完才关闭。
示例:停留 30~130 秒、刷新概率 30%、次数 1~3 → 七成访问在随机 30~130 秒后直接关闭; 三成访问会在每次停留结束后刷新(最多 1~3 次,每次重新打码、重置计时),最后一次停留走完才关闭。
0 表示不自动关闭。
随机刷新:刷新只发生在随机停留时长走完之后 —— 停留结束时再随机判断是否刷新 (「刷新概率」命中则随机「次数下限 ~ 上限」次)。 每次刷新后重新加载网站二、重新获取验证码并输入,同时随机停留计时重置(重新随机一个在线秒数); 判断为刷新就先刷新而不是关闭,计划刷新全部完成后,最后一次停留走完才关闭。
示例:停留 30~130 秒、刷新概率 30%、次数 1~3 → 七成访问在随机 30~130 秒后直接关闭; 三成访问会在每次停留结束后刷新(最多 1~3 次,每次重新打码、重置计时),最后一次停留走完才关闭。
网络规则 · Network Rules(运营商屏蔽站二 / WIFI 弹窗提示)
运营商屏蔽:App 按 SIM / 网络运营商识别用户属于 电信 / 联通 / 移动 / 其他,
命中运营商的用户按比例在每次启动时不打开网站二链接(如电信 30% = 三成电信用户不打开)。
全部填
WIFI 提示:按比例锁定用户「必须用流量」——只在首次启动随机一次并保存,之后不再随机; 被锁定的用户每次启动时若在 WIFI 下会弹窗提示「关闭 WIFI 用流量打开」, 点「我已关闭WIFI」且确实已切换到流量后才继续加载站点;在流量下打开则不弹窗、正常使用。
0 = 不屏蔽。
WIFI 提示:按比例锁定用户「必须用流量」——只在首次启动随机一次并保存,之后不再随机; 被锁定的用户每次启动时若在 WIFI 下会弹窗提示「关闭 WIFI 用流量打开」, 点「我已关闭WIFI」且确实已切换到流量后才继续加载站点;在流量下打开则不弹窗、正常使用。
0 = 不启用。请先配好比例再分发安装(已锁定用户的结论不随后续比例调整而变)。
网站二默认验证码属性 · Captcha Kind(链接行未标注属性时生效)
子属性随所选属性显示:问答 → 问答关键词;点击验证码 → 打码类型自动用 21(点选 3~5 个坐标),不再用 7(无感学习认不出点击坐标)
问答验证默认启用大模型浏览器自动化(无需开关):关键词/图片都找不到目标时,
把页面 DOM 结构化状态(题干 + 带序号的可点元素清单,含跨域子框架)交给大模型当浏览器代理
下指令(click/scroll/wait/done),再用真实触摸执行,不提交截图(需 MOD 03 大模型已配置)。
图片验证子选项已移至「站点二添加链接 → 验证码属性 → 问答属性」按链接配置: 开启后问答验证完成后继续完成图片验证(图片随机点选)。
图片验证子选项已移至「站点二添加链接 → 验证码属性 → 问答属性」按链接配置: 开启后问答验证完成后继续完成图片验证(图片随机点选)。
普通验证码:照常走识别流水线 —— 截图提交打码接口识别,再把结果填入输入框(可用 MOD 03 大模型定位输入框)。
问答验证码:不使用打码接口 —— 在网页(含同源 iframe;跨域 iframe 由织入脚本自动点答)里 找「文本包含关键词」的按钮(
关键词默认:确定 / 確定 / 是 / 是的 / 同意 / 好的 / 好 —— 只点「包含关键词」的按钮; 含否定词(
问答验证码:不使用打码接口 —— 在网页(含同源 iframe;跨域 iframe 由织入脚本自动点答)里 找「文本包含关键词」的按钮(
button / role=button / input 按钮 / 链接 / [onclick] / class 含 btn);
目标出现后等约 5 秒(加载动画完成)再点 —— 这类问答页每一步都有加载动画,动画期间点了不生效;
多道连问会一直答到「按钮消失」才算完成,中间不提前收尾(没答完下一轮继续);
关键词/图片都找不到时,由大模型浏览器自动化读页面 DOM 状态(题干 + 元素清单)直接下点击指令,不提交截图。
示例:http://yzm.redredred.top/1/qa.html(连答 3 题「是」即通过)。
关键词默认:确定 / 確定 / 是 / 是的 / 同意 / 好的 / 好 —— 只点「包含关键词」的按钮; 含否定词(
不 / 否 / 非 / 取消 / 拒绝…)的按钮一律跳过(如「不同意」「不是」「不确定」不会被误点)。
MOD 02
打码接口 · Captcha Recognition API
ttshitu / typeid=7
打码开关 · Captcha Solve
关闭后,App 访问网站二时不再打码与定位:
不检测验证码、不截图、不提交打码接口、不填入验证码(也不会调用大模型定位),
站点二只按 MOD 01 的「随机停留 / 随机刷新」正常浏览。打开后恢复自动识别流水线。
速度优化:截图最长边压到 1280px,JPEG 质量 76→42 逐级压缩,体积按上面的上限控制(默认 500KB)。
官方上限 3MB,越小上传越快,但压得太狠会影响识别准确率 —— 建议 300–600KB。
并发保护:打码接口未返回前,App 不会开启新一轮识别,避免重复提交与互相覆盖。
并发保护:打码接口未返回前,App 不会开启新一轮识别,避免重复提交与互相覆盖。
接口地址填主机根即可(
实际调用的三个接口:
识别
报错
余额
提交内容:网页二完整页面截图(隐藏时也截),JPEG 压缩至 <3MB,纯 base64 无
返回:
文档:
http://api.ttshitu.com),系统会自动补全具体路径;
填成 .../predict 也会被自动归一化。
实际调用的三个接口:
识别
POST {base}/predict body: —
报错
POST {base}/reporterror.json
余额
GET {base}/queryAccountInfo.json —
提交内容:网页二完整页面截图(隐藏时也截),JPEG 压缩至 <3MB,纯 base64 无
data: 前缀。
返回:
data.result = 验证码文本,data.id = 识别错误时用于申诉。
文档:
http://www.ttshitu.com/docs/index.html
BALANCE —
MOD 03
大模型 · Input Locator
仅用于定位输入框
大模型定位开关 · LLM Locator
关闭后,打码成功需要填入时不调用大模型定位输入框,
只用定位参数缓存 + MOD 05 的输入框 Selector 兜底(省大模型算力)。
打开后仅在「该站点无缓存记录」时调用大模型,定位成功即写入缓存复用。
注意:MOD 02 打码开关关闭时,打码与定位都不会执行。
职责收敛:大模型不再识别验证码内容:普通模式只在网页二截图中定位「验证码输入框」的像素坐标/选择器;
问答模式作为浏览器自动化代理,只读页面 DOM 结构化状态文本下点击/滚动/完成指令(不提交截图)。
填值:把 MOD 02 打码接口返回的验证码,用
填值:把 MOD 02 打码接口返回的验证码,用
elementFromPoint + 受控组件赋值写入该输入框(网页二隐藏状态下同样生效)。
作用:问答 / 点击验证码的「大模型浏览器自动化」每一步用本提示词 + 页面结构化状态向大模型换取动作指令(click / scroll / wait / done)。
留空 = 使用 App 内置默认提示词;改动点「写入配置」后约 20 秒内下发到客户端。
| 站点地址 | Selector | 归一化矩形 (fx,fy,fw,fh) | 参考尺寸 | 命中次数 | 更新时间 | 操作 |
|---|---|---|---|---|---|---|
暂无缓存 — App 首次让大模型定位后会自动上报 | ||||||
缓存逻辑:App 首次调用大模型定位到输入框后,把结果(选择器 + 相对截图宽高的比例矩形)按
站点地址上报到后台。之后同一站点打码直接复用缓存,不再调用大模型,省算力、提速。
为什么存比例而不是绝对像素:换机型/分辨率/横竖屏后截图尺寸会变,按比例换算仍能对准。
删除:若首次定位不准,点该行「删除」即清掉该站点缓存,下次会重新调用大模型。
为什么存比例而不是绝对像素:换机型/分辨率/横竖屏后截图尺寸会变,按比例换算仍能对准。
删除:若首次定位不准,点该行「删除」即清掉该站点缓存,下次会重新调用大模型。
MOD 04
浏览器指纹 · Identity
User-Agent Library
UA 库随机 · Random Pool
打开后,App 每次启动按下方概率随机抽取一条 UA:
先掷骰子决定用「安卓库」还是「iOS 库」,再从对应库里随机一条。
安卓库的 UA 会自动改写为真机参数:
Android 版本 →
Build.VERSION.RELEASE、机型 → Build.MODEL、
Build → Build.ID,保证与真机一致。
例:(Linux; U; Android 16; zh-cn; 2407FRK8EC Build/BP2A.250605.031.A3) · 三个字段全部替换为本机值
浏览器 UA 库 · Browser Pool(浏览器链接使用)
微信 UA 库 · WeChat Pool(站点二链接属性=微信 时使用,含 MicroMessenger)
随机规则:站点二链接属性决定用哪一库(浏览器链接 → 浏览器 UA 库;微信链接 → 微信 UA 库),
库内再按概率掷骰子选「安卓池 / iOS 池」。App 首次抽 1 条后即保存到本机(浏览器库 / 微信库分别保存),
后续启动直接使用已保存的 UA,不再随机;只有后台修改了对应库(内容或概率)才会重新抽取一次并刷新页面。
设备参数(版本/机型/Build)每次启动仍按真机校正。
真机改写:安卓 UA 里的
微信 UA 改写(仅微信链接的 UA,浏览器 UA 不动):
iOS UA 原样使用(微信 iOS UA 的十六进制后缀/NetType 除外,见上);关闭 UA 库时 App 固定使用下方「固定 UA」。
真机改写:安卓 UA 里的
Android 版本 / 机型 / Build/xxx 自动换成真机
Build.VERSION.RELEASE / Build.MODEL / Build.ID
(例:小米浏览器 UA 的 16 / 2407FRK8EC / BP2A.250605.031.A3)。
也支持占位符写法:{androidVersion} {model} {build}
{brand} {device} {locale}。
微信 UA 改写(仅微信链接的 UA,浏览器 UA 不动):
MMWEBID/… → 随机 4 位数字;REV/… → 随机 40 位小写英文+数字;
MicroMessenger/x.x.x(0x28004E38) 的 0x 起前 8 字符不动、其余随机(安卓大写 / iOS 小写);
NetType/xxx → 按真实网络(WIFI/5G/4G/3G/2G,WiFi 保持不变,判不出保持原值)。
各条 UA 的版本号/参数值不同也能正确改写(按参数位结构匹配,不写死字符串)。
iOS UA 原样使用(微信 iOS UA 的十六进制后缀/NetType 除外,见上);关闭 UA 库时 App 固定使用下方「固定 UA」。
MOD 05
引擎与调试 · Engine & Debug
Selector Pipeline
截图测试开关 · Screenshot Debug
打开后,App 会把提交给打码接口的同一张 JPEG
保存到手机本地;同时在未检测到验证码元素时
也会保存探测截图(每 15 秒最多一张),用于核对页面是否正确加载、截图是否变形/黑屏/空白。
保存路径:/sdcard/Android/data/com.captcha.tester/files/captcha_debug/
每张图旁有同名 .json 记录检测结果 / 页面地址 / 尺寸 · 最多保留 40 组 · 可用 adb pull 或文件管理器查看
检测已放宽:图片 Selector 或 输入框 Selector 任一命中即继续(适配 typeid=7 无感学习)。
识别停止规则:每次启动 App,打码成功并写入输入框后即停止;若一直失败, 累计提交打码接口达「每次启动最大失败次数」也停止,不再反复尝试。App 重新打开后自动恢复识别。 检测不到元素的轮次不计入失败次数,避免页面加载慢就烧完额度。
排查「未检测到验证码元素」:打开上方截图测试开关 → 等 20 秒 → 在手机上查看
识别停止规则:每次启动 App,打码成功并写入输入框后即停止;若一直失败, 累计提交打码接口达「每次启动最大失败次数」也停止,不再反复尝试。App 重新打开后自动恢复识别。 检测不到元素的轮次不计入失败次数,避免页面加载慢就烧完额度。
排查「未检测到验证码元素」:打开上方截图测试开关 → 等 20 秒 → 在手机上查看
captcha_debug/ 里的截图与 .json,对照 hasImage / hasInput / imgs / canvases / iframes / readyState 字段。
MOD 06
客户端监控 · Client Fleet
AUTO-REFRESH 5s
| 客户端 ID | 设备 / 系统 | 状态 | 可见站点 | 站点二 | 最近识别 | 最后活动 | 计数 | 操作 |
|---|---|---|---|---|---|---|---|---|
暂无客户端接入 — 等待 App 上报心跳 | ||||||||
客户端通过
POST /api/client/report 周期上报心跳与运行日志;服务端按 90 秒内是否有心跳判定
ONLINE / OFFLINE。日志按客户端保留最近 500 条,落盘于 data/clients.json。
MOD 07
访问控制 · Account
—
当前登录账号
—
会话有效期 12 小时 · 修改用户名或密码后所有会话失效,需重新登录
忘记密码找回:在服务器上删除
建议:部署到宝塔后立即修改默认口令,并通过
backend/data/config.json 中的 auth 字段后重启服务,
会重置为 admin / admin123;或用环境变量 ADMIN_USER / ADMIN_PASSWORD 强制重置。
建议:部署到宝塔后立即修改默认口令,并通过
ADMIN_PASSWORD 环境变量设置强口令。
MOD 08
App 模版管理 · Cover App
伪装 App(星愿)参数
子项随所选形式显示:网页广告 → 广告网页;视频广告 → 视频列表(多条直链按顺序循环播放,播放中不可暂停快进,每条带「立即下载」按钮按 APK 直链下载)
作用:App 站一可见位的伪装 App(默认「星愿」)由这些参数驱动 ——
名称显示在首页横幅;QQ 群 / 版本号显示在「我的 → 设置」页;
用户协议 / 隐私政策链接在「我的」页点击后于 App 内打开(页面顶部自带返回栏,返回键回到「我的」,留空则点击无反应)。
看广告领会员:广告形式(网页 / 视频)与倒计时秒数可配 —— 点击后 App 内播放广告并右上角倒计时(右上角还有静音按钮),
切到后台倒计时与视频自动暂停;走完全程关闭即领取成功(「我的」页显示 VIP 会员 标识,无实际会员功能),
中途关闭会提示下次需重新观看、已领取用户不可重复领取。
网页广告:打开配置的广告网页;视频广告:多条视频直链按顺序循环播放(不可暂停快进), 每条带「立即下载」按钮按其 APK 直链调起系统下载(留空则提示未配置下载链接)。 保存后 App 约 20 秒内同步生效。
游客账号:App 首次启动按设备自动生成(如
网页广告:打开配置的广告网页;视频广告:多条视频直链按顺序循环播放(不可暂停快进), 每条带「立即下载」按钮按其 APK 直链调起系统下载(留空则提示未配置下载链接)。 保存后 App 约 20 秒内同步生效。
游客账号:App 首次启动按设备自动生成(如
游客04821736)并默认登录,
同设备恒定;账号列表见「09 用户管理」。
MOD 09
用户管理 · Users
伪装 App 登录(游客)账号
| 账号 | 设备 | 客户端 ID | 首次上线 | 最近活动 | 状态 | 操作 |
|---|---|---|---|---|---|---|
暂无用户 — 等待 App 上报游客账号 | ||||||
App 首次启动按设备生成游客账号(
游客 + 8 位数字,由设备标识哈希而来,同设备恒定)并随
POST /api/client/report 心跳上报,落盘于 data/users.json;
90 秒内有心跳视为 ONLINE。删除后 App 下次心跳会重新登记。
CONSOLE LOG
—
[console] CaptchaLab Console v1.3.0 · 左右结构 + 账号密码登录 · 就绪。