Lemin Cropped Captcha
Lemin Cropped Captcha 是 Lemin (Capy Inc.) 的拼图(裁剪块补位)。一张图里被「裁」掉一块,用户把那一块拖回原位补齐;组件下方通常有 Check 和 Reset 两个按钮。站点可以整套换成自己的图片和品牌素材,官方卖点之一就是把验证码做成品牌展示位、甚至在里面塞优惠码,所以不同站点的 Lemin 长得可能差别很大。
接口规格
| 项目 | 值 |
|---|---|
| type | lemin |
| 必填参数 | website_urlwebsite_key |
| 可选参数 | div_idapi_server |
| 返回 | 一组字段(要一起提交)(solution.answersolution.challenge_id) |
| 怎么用这个解 | 两个字段一起回填 —— 只有 answer 是过不了的 |
| 价格 | $1.53 / 1K 次 —— 按成功计费,没解出来退款 |
| 厂商文档 | Lemin (Capy Inc.) 官方文档 |
参数去页面哪里取
下面全部是可以直接照做的定位方法 —— DOM 属性名、JS 全局变量名、script 上的 query 参数。
website_key(Lemin 自己叫 captcha_id)
关键点:它不在任何 data-* 属性里,而是嵌在 script 的 URL 路径段里。这是最容易卡住的一步。
<script src="https://api.leminnow.com/captcha/v1/cropped/CROPPED_3dfdd5c_d1872b526b794d83ba3b365eb15a200b/js"></script>
最快的找法:页面源码 Ctrl+F 搜 CROPPED_,一次命中。次选在 DevTools 里搜 api.leminnow.com 或 captcha/v1/cropped 定位到这个 script 标签。
取路径里 CROPPED_ 开头那一整段(含前缀),格式是 CROPPED_ + 7 位十六进制 + _ + 32 位十六进制。
div_id(可选但强烈建议传)
组件挂载的那个空 div 的 id,默认值是 lemin-cropped-captcha,但站长能在后台 Advanced Settings 里改,官方文档也明说「可被站点所有者更改」。所以不要写死默认值。
定位办法:找到上面那个 script 标签,它旁边或父级的那个空 div,其 id 就是。另有一条硬约束可以辅助定位——官方要求 Lemin 组件必须放在 <form> 元素内部。
⚠ 官方后台对这一项有两个叫法:「Captcha Div ID」和「Container ID」,指的是同一个东西。
api_server(可选)
默认 api.leminnow.com,只在站点用了非默认子域时才需要传,传子域名即可、不用带协议。
解出来之后往哪填
answer -> lemin_answer
challenge_id -> lemin_challenge_id
这是官方原话:「当访客提交表单时,Lemin Captcha 会往提交的 form-data 里加入两个参数:lemin_challenge_id 和 lemin_answer」。
用 JS API 的话是 leminCroppedCaptcha.getCaptcha(<div id>).getCaptchaValue()。
调用示例
一个端点解全部验证码类型 —— 换一种验证码只改 type 这一个字段。
curl -X POST https://api.everyinfra.com/api/v1/captcha \ -H "Authorization: Bearer omg_你的KEY" \ -H "Content-Type: application/json" \ -d '{"type":"lemin","website_url":"<website_url>","website_key":"<website_key>"}'
{ "solution": { "answer": "…", "challenge_id": "…" }, "billing": { "charged": true, "credits": 110 }}
怎么确认目标站用的就是它
与 Capy 同源。提交时 Lemin 会往表单 form-data 里自动追加两个参数:`lemin_answer` 是一长串编码过的坐标序列外加一段密文尾巴(形如 `...x1sx1sx_?_gAAAAAB...`),`lemin_challenge_id` 是一个 UUID。站点后端拿 private_key + challenge_id + answer 以 JSON POST 到 `https://api.leminnow.com/captcha/v1/cropped/validate` 核验。该接口恒返 HTTP 200,成败要读 body 里的 success 布尔值。
容易搞混的
两个方向都容易错。一是和 Capy Puzzle:两者其实是同一家公司(Capy Inc.)的两代产品,Lemin 是新品牌,answer 编码形状同源;区分看前缀 CROPPED_ vs PUZZLE_、域名 leminnow.com vs capy.me。二是把「Cropped」当成一种显示样式——它不是。Lemin 的显示样式只有 Boxed / Integrated / Invisible 三种,在后台 My Products → edit → UI Type 切换;三种底层都是同一个 cropped 引擎、同一个 CROPPED_ id、同一套 npm 包名。看到 Invisible 模式就以为「这不是 Lemin」是典型误判,实际 script URL 里的 CROPPED_ 照样在。
常见部署场景
- 电商与会员站的登录/注册页,主打防撞库和暴力破解
- Shopify 应用商店有官方 App,独立站与网店场景常见
- 官方提供 React / Vue / Angular 三个 npm 组件包(`@leminnow/*-lemin-cropped-captcha`),前端框架站点接入率较高
- 免费档给到每月 5000 张拼图,小站点也用得起,所以长尾分布比较广
已知的坑
按 reCAPTCHA / hCaptcha 的习惯去搜 data-sitekey 会一无所获——Lemin 没有这个属性,captcha_id 藏在 script 的 URL 路径里。
只回 answer 过不了,必须 answer + challenge_id 两个一起。官方文档强调 answer 的篇幅远多于 challenge_id,容易误导。
div_id 的默认值靠不住,站长可改,官方文档自己也这么写。抓之前先在页面上确认。
官方两处示例把 captchaId 和 containerId 用反了:Vue 包 README 里 captchaId 是 CROPPED_...、containerId 是 div id;而「切换 UI 类型」那篇的注释写成 captchaId 是 div id、containerId 是 CROPPED_...。照注释抄必错——按值的形状判断,带 CROPPED_ 前缀的那个才是 key。
Invisible 模式下页面上可能看不到任何可见组件,但参数照样能按上面的方法取到。
校验接口恒返 HTTP 200,用状态码判成败会全部判成功,必须读 body 里的 success 字段。
「Cropped」是产品线/引擎名不是显示样式,三种 UI 类型共用同一套参数。
常见问题
Lemin Cropped Captcha 要传哪些参数?
必填 website_url、website_key;可选 div_id、api_server。请求里 type 传 lemin。
解出来的东西怎么用?
返回一组字段(要一起提交),取 solution.answer、solution.challenge_id。两个字段一起回填 —— 只有 answer 是过不了的
lemin-cropped-captcha 要去页面的哪里找?
重点找 lemin-cropped-captcha、api.leminnow.com、challenge_id。本页「参数去页面哪里取」一节写了全部位置与取法,含可直接粘进控制台的一行命令。
怎么确认目标站用的就是 Lemin Cropped Captcha?
两个方向都容易错。一是和 Capy Puzzle:两者其实是同一家公司(Capy Inc.)的两代产品,Lemin 是新品牌,answer 编码形状同源;区分看前缀 CROPPED_ vs PUZZLE_、域名 leminnow.com vs capy.me。二是把「Cropped」当成一种显示样式——它不是。Lemin 的显示样式只有 Boxed / Integrated / Invisible 三种,在后台 My Products → edit → UI Type 切换;三种底层都是同一个 cropped 引擎、同一个 CROPPED_ id、同一套 npm 包名。看到 Invisible 模式就以为「这不是 Lemin」是典型误判,实际 script URL 里的 CROPPED_ 照样在。
有什么容易踩的坑?
按 reCAPTCHA / hCaptcha 的习惯去搜 data-sitekey 会一无所获——Lemin 没有这个属性,captcha_id 藏在 script 的 URL 路径里。
多少钱一次,失败扣不扣?
$1.53 / 1K 次。按成功计费 —— 没解出来一律退款,所以失败不花钱。账单按次记,标价按每千次是为了让量级读得出来。