Anubis 工作量证明网关(PoW)
Anubis 工作量证明网关(PoW) 是 Techaro — Anubis 的工作量证明。一张动漫插画:戴兜帽、穿短裙、拿放大镜的杰克狼耳少女(由欧洲画师 CELPHASE 绘制),标题写着「Making sure you're not a bot!」,下面一条进度条。不需要点击、不需要识图、不需要拖动 —— 浏览器在后台算几秒哈希,算完自动跳进目标页面。挑战期间显示 pensive.webp(若有所思的表情),通过瞬间换成 happy.webp。JavaScript 被禁用则永远停在这一页。它专门针对 AI 爬虫而非普通机器人,因此常出现在 Linux 内核 git、Arch Wiki 这类「人少、被 AI 抓穿了」的技术站点上。
接口规格
| 项目 | 值 |
|---|---|
| type | anubis |
| 必填参数 | website_urlproxy |
| 可选参数 | 无 |
| 返回 | 一串 Cookie(solution.cookie) |
| 怎么用这个解 | 带回目标站的 Cookie(一张有效期最长 7 天的通行证) |
| 价格 | $0.14 / 1K 次 —— 按成功计费,没解出来退款 |
| 厂商文档 | Techaro — Anubis 官方文档 |
参数去页面哪里取
下面全部是可以直接照做的定位方法 —— DOM 属性名、JS 全局变量名、script 上的 query 参数。
挑战参数全部明文躺在页面 DOM 里,不需要抓包。 Anubis 把它写成一个 JSON script 标签:<script id="anubis_challenge" type="application/json">。
直接粘进控制台的一行命令:
JSON.parse(document.getElementById('anubis_challenge').textContent)实测 git.kernel.org 返回:
{"rules":{"algorithm":"fast","difficulty":5},
"challenge":{"id":"01a04ea7-6290-7e60-a2b6-6e10f3a5b303",
"randomData":"aedf2812fdda2bf4…a495930",
"difficulty":5,"policyRuleHash":"dbf942088788cc96",
"issuedAt":"2026-08-29T17:53:07Z","spent":false,
"metadata":{"User-Agent":"…","X-Real-Ip":"…"}}}要复制的四个值:challenge.randomData(待哈希的挑战串)、challenge.id(提交时的凭证 ID)、rules.difficulty(前导零个数)、rules.algorithm(fast / slow)。
同页另有三个 JSON script 标签:anubis_version(如 "v1.26.2",决定字段布局)、anubis_base_prefix、anubis_public_url。
提交端点(客户端 JS 里写死):/.within.website/x/cmd/anubis/api/pass-challenge?id=<challenge.id>&response=<sha256hex>&nonce=<n>&redir=<原始URL>&elapsedTime=<毫秒>
判断某站是不是 Anubis,一行搞定:
!!document.getElementById('anubis_challenge') || !!document.querySelector('script[src*="/x/cmd/anubis/static/js/main.mjs"]')或者看响应头有没有这两个 cookie:techaro.lol-anubis-auth(通过凭证 JWT)与 techaro.lol-anubis-cookie-verification(探测浏览器是否接受 cookie)。挑战页固定引用 /.within.website/x/cmd/anubis/static/img/pensive.webp 与 happy.webp,DOM 上有 #anubis-main(模块脚本)、#title、#status、#progress、#testarea。
调用示例
一个端点解全部验证码类型 —— 换一种验证码只改 type 这一个字段。
curl -X POST https://api.everyinfra.com/api/v1/captcha \ -H "Authorization: Bearer omg_你的KEY" \ -H "Content-Type: application/json" \ -d '{"type":"anubis","website_url":"<website_url>","proxy":"<proxy>"}'
{ "solution": { "cookie": "…" }, "billing": { "charged": true, "credits": 10 }}
怎么确认目标站用的就是它
SHA-256 hashcash,和 Bitcoin/Hashcash 同一族。服务端为每次访问生成一段随机串 randomData(实测 128 位十六进制),浏览器在 Web Worker 里从 0 开始穷举整数 nonce,计算 SHA256(challenge + nonce),直到结果的十六进制表示以 N 个 0 开头(N = difficulty,实测线上取 5)。找到即把 response(哈希值)、nonce、耗时回传,服务端只需算一次哈希即可验证 —— 求解昂贵、验证廉价。通过后服务端签发一个 ed25519 签名的 JWT,装进 cookie,默认 7 天内不再挑战(JWT claims 含 challenge / nonce / response / iat / nbf / exp)。设计目标不是「挡住所有机器人」,而是给每次抓取加上一笔真实的 CPU 成本,让大规模爬取在经济上不划算。有 fast 与 slow 两种算法实现,由服务端在 rules.algorithm 里指定。
容易搞混的
最容易和 Cloudflare Turnstile 搞混 —— 两者在用户眼里都是「一条等待进度条,几秒后自动进站」。区别是决定性的:Turnstile 靠行为与浏览器指纹打分,参数是 data-sitekey(形如 0x4AAAAAAA…),挑战值在加密通信里;Anubis 纯算力、没有 sitekey 这个概念,参数就是页面里那段明文 anubis_challenge JSON。看一眼 DOM 有没有 #anubis_challenge 就能区分。同属工作量证明家族的 mCaptcha 与 Friendly Captcha 也容易混,但那两个都有 sitekey 且面向表单场景,Anubis 是站在整站前面的反向代理网关。
常见部署场景
- git.kernel.org(Linux 内核 git,实测 v1.26.2)
- lore.kernel.org(内核邮件列表归档,实测)
- Arch Wiki(wiki.archlinux.org)
- GNOME GitLab(gitlab.gnome.org)
- UNESCO
- FreeBSD
- FFmpeg bug tracker
- SourceHut
已知的坑
难度不能写死。源码常量 DefaultDifficulty = 4,官方文档写 5,git.kernel.org 线上实测下发 5 —— 三个数字互不相同。永远读 rules.difficulty,不要照抄任何文档里的数字。
挑战绑定 User-Agent 和 IP。challenge.metadata 里直接带着 User-Agent 与 X-Real-Ip;换 UA、换出口 IP、或用与取挑战时不同的网络提交,结果都作废。取参数和提交必须是同一条链路。
服务重启会作废一切。Anubis 每次启动重新生成 ed25519 密钥对,且官方明确说尚不支持多实例共享密钥 —— 站点重启或滚动更新后,所有已签发的 cookie 立即全部失效,多实例负载均衡下还会随机失效。
挑战有 30 分钟服务端 TTL,且 challenge.spent 是一次性标记,同一个 id 不能复用。
路径前缀可以被改。/.within.website/x/cmd/anubis/ 是默认值,BasePrefix 配置项能整体改掉甚至清空 —— 按路径硬匹配会漏,要读 anubis_base_prefix。
只有 Accept: text/html 的请求才会收到挑战页,其他请求在没有有效 cookie 时可能直接 404,容易被误判成「这站没上 Anubis」。
挑战页带 <meta name="robots" content="noindex,nofollow">,且部分部署会挂蜜罐端点(实测 kernel.org 页面上有 /.within.website/x/cmd/anubis/api/honeypot/<uuid>/init)—— 盲目遍历页面上的所有链接会踩雷。
部分部署额外开了「已登记 agent 换 bearer token」的旁路(Techaro 自己的文档站就开着,token 24 小时有效),此时页面上根本不出现工作量证明挑战,只出现一段 Access Denied 说明。
这类网关防的就是 AI 爬虫,已装在 GNOME、Linux kernel git、SourceHut、Arch Wiki、UNESCO 等站点上
解一次拿到的是一张通行证(最长 7 天),不是一次性令牌 —— 同一个站你不需要每个请求都来解一次
通行证绑定你给的代理出口 IP。所以代理必填,而且必须与你后续请求用的是同一个出口 —— 换出口立刻失效
7 天是上限不是承诺:通行证里绑着站点当前策略的哈希,站点一改策略,已签发的通行证全部立即作废。这不是我们能控制的
目前只接难度 5 及以下(覆盖默认难度 4 的绝大多数部署)。更高难度会明确报错并且不计费,不会让你付钱等一个算不完的题
少数站点会把通行证绑到某个请求头上。表现是「解对了、Cookie 拿到了、用起来仍被挡」—— 遇到这种情况请告诉我们你需要绑定哪个头
常见问题
Anubis 工作量证明网关(PoW) 要传哪些参数?
必填 website_url、proxy,没有可选参数。请求里 type 传 anubis。
解出来的东西怎么用?
返回一串 Cookie,取 solution.cookie。带回目标站的 Cookie(一张有效期最长 7 天的通行证)
techaro.lol-anubis-cookie-verification 要去页面的哪里找?
重点找 techaro.lol-anubis-cookie-verification、techaro.lol-anubis-auth、challenge.randomData。本页「参数去页面哪里取」一节写了全部位置与取法,含可直接粘进控制台的一行命令。
怎么确认目标站用的就是 Anubis 工作量证明网关(PoW)?
最容易和 Cloudflare Turnstile 搞混 —— 两者在用户眼里都是「一条等待进度条,几秒后自动进站」。区别是决定性的:Turnstile 靠行为与浏览器指纹打分,参数是 data-sitekey(形如 0x4AAAAAAA…),挑战值在加密通信里;Anubis 纯算力、没有 sitekey 这个概念,参数就是页面里那段明文 anubis_challenge JSON。看一眼 DOM 有没有 #anubis_challenge 就能区分。同属工作量证明家族的 mCaptcha 与 Friendly Captcha 也容易混,但那两个都有 sitekey 且面向表单场景,Anubis 是站在整站前面的反向代理网关。
有什么容易踩的坑?
难度不能写死。源码常量 DefaultDifficulty = 4,官方文档写 5,git.kernel.org 线上实测下发 5 —— 三个数字互不相同。永远读 rules.difficulty,不要照抄任何文档里的数字。
多少钱一次,失败扣不扣?
$0.14 / 1K 次。按成功计费 —— 没解出来一律退款,所以失败不花钱。账单按次记,标价按每千次是为了让量级读得出来。