EveryInfra

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 抓穿了」的技术站点上。

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

接口规格

项目
typeanubis
必填参数website_urlproxy
可选参数
返回一串 Cookiesolution.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.algorithmfast / slow)。

同页另有三个 JSON script 标签:anubis_version(如 "v1.26.2",决定字段布局)、anubis_base_prefixanubis_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.webphappy.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 是站在整站前面的反向代理网关。

去看 Cloudflare Turnstile 那一条 →

常见部署场景

已知的坑

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

开始接入

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