EveryInfra

Lemin Cropped Captcha

Lemin Cropped CaptchaLemin (Capy Inc.)拼图(裁剪块补位)一张图里被「裁」掉一块,用户把那一块拖回原位补齐;组件下方通常有 Check 和 Reset 两个按钮。站点可以整套换成自己的图片和品牌素材,官方卖点之一就是把验证码做成品牌展示位、甚至在里面塞优惠码,所以不同站点的 Lemin 长得可能差别很大。

正在查询可用性…$1.53 / 1K 次按成功计费,失败退款

接口规格

项目
typelemin
必填参数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.comcaptcha/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_ 照样在。

去看 Capy Puzzle 那一条 →

常见部署场景

已知的坑

按 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 次。按成功计费 —— 没解出来一律退款,所以失败不花钱。账单按次记,标价按每千次是为了让量级读得出来。

开始接入

一个端点覆盖全部验证码类型,按成功计费,失败与空结果一律退款。