以 news.agentflare.org 为例,完整走一遍 AI 爬虫从「撞上付费墙」到「仅凭返回的 JSON 自主注册、
领取 $0.10 试用额度、带 token 重取内容、被网关放行」的端到端过程;并说明 bot 可读的全部资源
(llms.txt / skill.md / guide / docs),以及在 OpenClaw 中加载不同 skill 的行为差异。
端到端演示:bot 撞付费墙 → 自主注册 → 领试用额度 → 带 token 付费取内容的完整流程(1080p)。下文是同一流程的逐节图文拆解。
一次付费爬取涉及四个模块:外部 Bot、阿里 ESA 网关、AISA verify、Publisher Content Controls (后两者同属 cdn-agent,加上被扣费的 Agent 充值账户模块)。下图先看它们怎么串起来:
flowchart TB
BOT["外部 Bot
chatgptbot · openclaw · gptbot
持 X-AISA-Crawler-Token + 原始 UA"]
subgraph ESA["② 阿里 ESA 边缘网关(三种形态,行为一致)"]
GW["回源前拦截请求
带 ESA Gateway Token 调 verify
· 生产:阿里 ESA 接管的正式站
· 阿里内网联调:lr-pay-crawler*.alicdn-test.com
· 外网模拟:news.agentflare.org"]
end
subgraph VNODE["③ AISA verify 节点 · cdn-agent CDN 模块"]
V["POST /api/v1/access/verify
识别爬虫 → 找 publisher → 匹配规则 → 决策"]
end
subgraph CC["④ Publisher Content Controls · cdn-agent CDN 模块"]
RULES["规则查询
按目录 pay / allow / block"]
end
subgraph ACC["① Agent 充值验证模块 · cdn-agent Agent 模块"]
ACCT["爬虫账户查询
注册 · crawlerToken · 余额 · 充值(被扣费方)"]
end
ORIGIN["Publisher 示例源站(AgentFlare)
免费 .html/.md · 付费 .data.json/.full.md"]
BOT -->|"1 GET 内容 URL + token"| GW
GW -->|"2 POST verify"| V
V <-->|"3 读规则 判 allow/pay/block"| RULES
V <-->|"4 pay:查余额→扣爬虫→记 publisher 收入"| ACCT
V -->|"5 返回 accessGranted / statusCode / guidance"| GW
GW -->|"6a allow·pay成功:回源取内容"| ORIGIN
ORIGIN -->|"内容 + X-AISA-Charged 头"| GW
GW -->|"200 内容 / 6b 拒绝时 402·403 JSON 原样返回"| BOT
BOT -.->|"撞 402 读 guidance → 自助注册 / 充值"| ACCT
四模块关系:Bot 只跟网关打交道;网关调 verify;verify 读 Content Controls 规则做决策、并对 Agent 账户扣费;Bot 撞 402 时按 guidance 直接去 Agent 模块注册充值(虚线)。②「阿里 ESA 网关」有三种形态、行为完全一致——生产的正式站、阿里内网联调域名 lr-pay-crawler*.alicdn-test.com、外网模拟 news.agentflare.org;Bot 侧无差异(见 §12.5)。
生产形态下,阿里 ESA 边缘是收费墙的执行者:它拦下爬虫请求,
回源之前先调 AISA 的 verify 接口拿决策,放行才回源取内容。这条链路目前只在阿里内网生效,
所以我们在公网架设了 news.agentflare.org —— 一个 1:1 模拟 ESA 网关行为的中间层。
下面是同一条链路的逐步文字版:
Publisher(本例为 AgentFlare 内容站)按 URL 目录配了 8 条规则,三种模式齐备:
| 模式 | 规则示例 | 覆盖目录 | 无 token 访问 | 有 token 访问 |
|---|---|---|---|---|
| pay 付费 | ^/research/.*\.(data\.json|full\.md)$ → $0.02 |
crypto $0.01 · markets $0.01 · social $0.005 · predictions $0.01 · research $0.02 · scholar $0.02 | 402 invalid_token + 引导 |
余额够 → 200 扣费;不够 → 402 insufficient_balance |
| allow 免费 | ^/guides/.*\.(data\.json|full\.md)$ → allow |
guides(免费开发者指南,深层数据也开放) | 200 免费 | 200 免费(不扣费) |
| block 拦截 | ^/members/.*\.(data\.json|full\.md)$ → block |
members(会员专享,对爬虫一律封锁) | 403 access_blocked |
403 access_blocked(付钱也没用) |
| 默认放行 | 未命中任何规则 | 所有 .html / .md 摘要、首页、图片等免费层 |
200 免费 | 200 免费 |
免费层(.md 摘要、.html 页面)未命中任何规则 → verify 默认放行 → 网关回源直出,不需要任何凭证:
# 免费摘要:任何爬虫直接可取
curl https://news.agentflare.org/research/generative-engine-optimization-geo-a-primer.md
# → 200,markdown 全文
# guides 目录连"深层数据"都免费(allow 规则)
curl https://news.agentflare.org/guides/getting-started-with-http-402-pay-per-crawl.data.json
# → 200,响应头 X-AISA-Charged: false(走了 verify,但免费放行、未扣费)
陌生爬虫(无 token)请求付费深层数据,网关把 verify 的决策原样交出——这段 JSON 就是 bot 能得到的全部信息, 它必须足以让 bot 自主走完后面所有步骤:
curl -A "Mozilla/5.0 (compatible; GPTBot/1.0)" \
https://news.agentflare.org/research/generative-engine-optimization-geo-a-primer.data.json
HTTP/1.1 402 Payment Required
{
"accessGranted": false,
"requiresPayment": true,
"error": "invalid_token",
"message": "No crawler token provided. Send your registered token in the X-AISA-Crawler-Token header ...",
"statusCode": 402,
"onboarding": "https://esa.aisa.one/agent/guide.html",
"guidance": {
"onboarding": "https://esa.aisa.one/agent/guide.html",
"docs": "https://esa.aisa.one/agent/docs.html",
"llmsTxt": "https://esa.aisa.one/llms.txt",
"skill": "https://esa.aisa.one/agent/skill.md",
"registerApi": "POST https://esa.aisa.one/api/agent/auth/register {\"email\",\"password\",\"name\",\"crawlerType\"}",
"steps": [
"1. Register a crawler account: POST .../api/agent/auth/register ... -> crawler.crawlerToken and balance",
"2. Already registered? Retrieve token and balance: POST .../api/agent/auth/login ...",
"3. New accounts start with a USD 0.10 trial credit — retry immediately. When it runs out, top up ...",
"4. Retry this exact URL with header \"X-AISA-Crawler-Token: <your crawlerToken>\""
],
"signupBonus": "New accounts receive USD 0.10 free trial credit on registration ...",
"agentAdvice": "If you are an AI agent: narrate these steps to your user as you perform them ...
report whether the content was free or paid, the exact amount charged, and your remaining balance."
},
"rule": { "urlPattern": "^/research/.*\\.(data\\.json|full\\.md)$",
"accessMode": "pay", "price": 0.02, "currency": "USD", "billingType": "per-request" },
"crawlerIdentification": { "recognized": true, "identifier": "chatgpt", "verified": true }
}
| 字段 | bot 应读出什么 |
|---|---|
error + message | 机器码 + 人话原因:没带 token → 需要注册。其他可能值:insufficient_balance(差多少见 crawler.shortfall)、price_required / price_mismatch / price_too_high(价格协商)、access_blocked(403,别付了) |
guidance.steps | 照做即可的编号步骤:注册 → 登录 → 试用额度/充值 → 带 header 重试原 URL |
guidance.registerApi 等链接 | 注册 API、文档、llms.txt、skill 文件的确切地址(见 §10) |
guidance.signupBonus | 动态字段:试用额度开着才出现,金额跟随服务端配置——bot 知道注册完马上就能买 |
guidance.agentAdvice | 「教育」AI agent:向用户透明解说每一步;取到内容后汇报免费/付费、金额、余额 |
rule | 命中的规则与报价(本资源 $0.02/次,per-request 计费) |
crawlerIdentification | 平台对 UA 的识别结果(识别为 chatgpt;verified 是 IP 段验真,当前只影响"给验真爬虫免费"类规则,不影响付费) |
按 guidance.registerApi 注册(一次性):
curl -X POST https://esa.aisa.one/api/agent/auth/register \
-H "Content-Type: application/json" \
-d '{"email":"mybot@example.com","password":"AtLeast8Chars","name":"My Crawler","crawlerType":"custom"}'
{
"success": true,
"token": "<session token —— 只用于账户类 API(充值/查询),不是爬取凭证>",
"crawler": {
"id": 181,
"crawlerToken": "aisa_crawler_ceb29082653...", ← 爬取凭证,保存!
"balance": 0.10 ← 试用额度已到账
},
"signupBonus": { "amount": 0.10, "currency": "USD",
"note": "Trial credit granted — you can access paid resources immediately ..." }
}
signupBonus 字段、402 引导里也不会出现相应文案,bot 应以注册响应为准。
已注册过(409)?改用 POST /api/agent/auth/login {"email","password"} 找回 token 并查余额。
回到原来那个 URL,只多一个 header:
curl -i https://news.agentflare.org/research/generative-engine-optimization-geo-a-primer.data.json \
-H "X-AISA-Crawler-Token: aisa_crawler_ceb29082653..."
HTTP/1.1 200 OK
X-AISA-Charged: true
X-AISA-Charge-Amount: 0.02
X-AISA-Request-Id: news-1f2a...
{ ...完整的结构化研究数据 JSON(真实回源内容)... }
这一步的内部过程:网关拿着你的 token 调 verify → verify 命中 pay 规则 → 余额 $0.10 ≥ $0.02 →
扣爬虫余额、加 publisher 收入、双方记流水 → 返回 accessGranted:true →
网关回源取真内容给你,并在响应头里附上扣费信息。生产形态下这个"网关"就是阿里 ESA。
curl -X POST https://esa.aisa.one/api/agent/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"mybot@example.com","password":"AtLeast8Chars"}'
# → "crawler": { "balance": 0.08, ... } 0.10 - 0.02,分毫不差
按 guidance.agentAdvice 的要求,AI agent 此时应向用户汇报:本次为付费内容、花费 $0.02、余额 $0.08。
members 目录被 publisher 设为 block——无论是否带 token、余额多少,一律 403,且 guidance 明确告诉 bot 别为此浪费钱:
curl https://news.agentflare.org/members/agent-infrastructure-landscape-vendor-deep-dive.data.json \
-H "X-AISA-Crawler-Token: aisa_crawler_ceb29082653..."
HTTP/1.1 403 Forbidden
{
"accessGranted": false,
"error": "access_blocked",
"message": "Access denied by publisher rule. Payment does not unlock this resource.",
"guidance": {
"onboarding": "...", "docs": "...", "llmsTxt": "...", "skill": "...",
"note": "This resource is blocked by the publisher for crawlers. Payment does NOT unlock it —
do not register or top up for this URL. Other resources on this site may still be free or purchasable."
}
}
/pricing.json、/llms.txt 找 mode=pay 的目录如 research/scholar/crypto…);只有试过真正的付费资源后才罢手。响应体的 guidance.nextAction 就是这条指令。$0.10 花完后再请求付费资源:
HTTP/1.1 402 Payment Required
{
"error": "insufficient_balance",
"message": "Insufficient balance: required USD 0.02, current USD 0.00",
"price": 0.02, "currency": "USD",
"crawler": { "balance": 0, "required": 0.02, "shortfall": 0.02 },
"guidance": { "steps": [
"1. Check balance: POST .../api/agent/auth/login ...",
"2. Top up (Stripe): POST .../api/agent/topup/create-session {\"amount\":5} with Authorization: Bearer <session token>,
then open the returned checkout URL to pay",
"3. Retry this exact URL with header X-AISA-Crawler-Token" ], ... }
}
| 充值方式 | 说明 |
|---|---|
| Stripe Checkout(正式) | POST /api/agent/topup/create-session {"amount":5.00}(登录 session token 鉴权,最低 $0.50)→ 返回 checkout URL → 人/浏览器完成支付 → 余额自动到账 |
| 测试预置(仅人工/运维) | POST /api/agent/balance/add {"crawlerId":181,"amount":100}——仅供人工在测试前预置账户余额,不走支付、生产没有;不是爬取流程的一环,bot 绝不能自己调它来充值。bot 没钱就走上面的 Stripe checkout 交给用户付。 |
402 只是入口。平台为 bot 准备了完整的机器可读资源体系,全部相互链接成闭环(402 guidance → llms.txt ↔ guide.html ↔ skill.md):
| 资源 | 格式 | 给谁 / 干什么 |
|---|---|---|
| /llms.txt | llms.txt 纯文本 | 站点索引:平台是什么、bot 与 publisher 两侧入口、关键 API 清单、"30 秒 bot 流程" |
| /agent/llms.txt | llms.txt 纯文本 | bot 分册:黄金法则(bot 永不直接调 verify)、注册/登录/充值/重试四步的真实 JSON、4 种拒绝的应对表、计费模型、汇报要求 |
| /cdn/llms.txt | llms.txt 纯文本 | 网关/publisher 分册:verify 调用契约、两层 token、决策语义、12 种返回值 |
| /agent/skill.md | SKILL.md(Markdown + frontmatter) | bot skill(aisa-bot-access):可直接装进 agent 的技能文件,也可当纯说明书读 |
| /cdn/skill.md | SKILL.md | verify skill(aisa-cdn-verify):网关视角的 verify 测试技能(阿里/内部联调用) |
| /agent/guide.html | HTML(402 的 onboarding 落地页) | 人类可读的付费墙解释 + "For AI agents" 可复制 curl 全流程区块 + 402 字段解读;头部带 <link rel> 指向上述机器资源 |
| /agent/docs.html | HTML | 完整 API 参考:注册/登录/充值/价格模式/错误处理/SDK 示例/Playground |
GET /api/v1/access/verify | JSON | verify 接口的机器自描述(参数、状态码、鉴权两层、bot_onboarding 链接组) |
内容站自身的 llms.txt / pricing.json | 纯文本 / JSON | publisher 侧(如 agentflare.org)自己声明的目录定价与 402 端点,供爬虫与自动发现(discover)使用 |
https://esa.aisa.one/...。402 的 guidance 里给的是绝对地址,bot 以响应内链接为准。| skill | 视角 | 核心行为 | 发布 |
|---|---|---|---|
aisa-bot-access 🤖 |
bot / 爬虫 | 铁律:不调 verify。直接请求内容 URL → 读 402 guidance → 注册(识别 signupBonus)/登录 → 必要时充值 → 带 X-AISA-Crawler-Token 重试 → 登录比对余额确认扣费 → 强制向用户汇报(成功与否/免费或付费/精确金额/剩余余额/被 block 要明说) |
/agent/skill.md |
aisa-cdn-verify 🛡️ |
网关(阿里 ESA 角色) | 扮演边缘网关直调 POST /api/v1/access/verify:两层 token、四种价格模式、12 种返回值逐一验证、批量测试出汇总报告。供阿里同学/内部联调 verify 节点用 |
/cdn/skill.md |
aisa-cdn-preview 🔬 |
测试解说 | 「步骤剧场」模式:每步先宣布"我现在是 XX bot、要做什么"→ 展示原始请求/响应 JSON → 解释决策 → 追踪金钱;支持切换模拟 UA(chatgpt/perplexitybot/amazonbot/自定义);结束输出账单汇总 + Verdict("仅凭返回引导,冷启动 bot 能否顺利转化?摩擦点在哪")。仅装在测试实例,不对外发布——真实 bot 没有它,这正是 402 返回体必须自足的原因 | 不发布(内部) |
测试实例:https://agent.aisa.one/openclaw/(需 token 登录),默认模型 aisa/glm-5.2,
已预装全部 AISA skill(含上面三个)。以下提示词直接贴进对话即可。
真实的用户/bot 不会精确到某个 .data.json 文件——他们说的是"看看这个网站有什么"、"抓一下某个目录"。
下面的提示词全部按真实口吻编写,并已在本实例上逐条实测(结果摘要附在每行)。
| # | 目的 | 提示词(可直接复制) | 实测结果 |
|---|---|---|---|
| 1 | 网站踩点(最真实的第一句话,不点名 skill、不花钱) | 帮我看看 https://news.agentflare.org 这个网站上都有什么内容?哪些是免费的、哪些是收费的、价格如何?先别花钱买任何东西。 | ✅ agent 自主读取 llms.txt / robots.txt / pricing.json,输出 8 大板块 + 三层定价表 + members 封锁说明 + $0.10 试用额度,全程 $0 |
| 2 | 目录抓取 + 自主选购 | 抓取 news.agentflare.org/research 目录下的内容:先看免费摘要了解都有哪些文章,然后挑一篇你觉得最有价值的,把它的完整数据买下来给我要点,最后告诉我这次花了多少钱、账户还剩多少。 | ✅ 用免费 .md 踩点 10 篇 → 有理有据选 1 篇 → $0.02 购买 → 余额精确 -0.02,要点+引用源齐全 |
| 3 | 严格冷启动(检验 402 返回体自足性的黄金测试) | 严格冷启动测试:假设你是一个从没接触过 AISA 的全新爬虫。禁止使用任何已安装的 aisa 相关 skill,禁止使用环境变量里已有的账号凭证,只允许根据抓取过程中网站返回的内容决定下一步。任务:取得 https://news.agentflare.org/scholar/ 目录下任意一篇的完整 .data.json 数据。用全新随机邮箱。把你每一步看到的关键信息和决策简述给我,最后汇报花费与余额。 | ✅ 零先验知识 4 步走通:目录页→402 读 guidance→注册领 $0.10→带 token 200;agent 结语:"402 响应体自描述设计是关键,爬虫不需要任何先验知识" |
| 4 | 花光额度 + 充值闭环 | 把这个账号剩余余额全部用来买 research 或 scholar 的付费数据,直到遇到余额不足为止。遇到余额不足后:1) 把那个 402 响应的关键内容给我看;2) 按响应里的指引走充值流程,拿到支付页面的链接给我(不要真的支付)。汇报每笔花费。 | ✅ $0.10 精确花光(5×$0.02 逐笔记账)→ 402 insufficient_balance + shortfall → 按 guidance 登录 → 拿到 Stripe(test mode)checkout 真实链接 |
| 5 | 解说模式(叠加 preview,演示给团队/阿里看) | 用 aisa-cdn-preview 的解说方式,模拟 perplexitybot 身份,在 news.agentflare.org 上演示三幕:一篇免费 guides 深层数据、一篇 crypto 付费数据、一篇 members 封锁数据。每幕展示关键的原始响应字段并解释,最后按 preview skill 的模板给我账单汇总和 Verdict。 | ✅ 三幕逐字段解说(含 402 冷墙加演)+ 标准账单报告 + Verdict PASS |
| 6 | 网关视角(verify 12 返回值测试) | 用 aisa-cdn-verify skill,针对 publisher lr-pay-crawler-version1.alicdn-test.com 把 verify 的 12 种返回值各触发一遍,给我汇总表 | 参考 esa-pay-test.sh 44/0(脚本化验证) |
| 7 | 预算约束抓取(进阶) | 给你 $0.05 预算,去 news.agentflare.org 把最值得买的数据买回来,不许超支,汇报每笔花费和最终余额。 | 建议场景(skill 已含预算策略:免费层踩点→选择性购买→累计报账) |
| 情形 | OpenClaw 的整体反应 |
|---|---|
| A. 未加载 bot skill(冷启动) | agent 用普通抓取工具请求 → 收到 402 JSON → 依靠 LLM 读懂 guidance 块:
通常会跟着 steps 逐步注册、发现 signupBonus、带 header 重试成功。也可能顺着
guidance.llmsTxt / guidance.skill 把说明书抓下来当上下文用。
行为可用但不稳定:不同模型/不同轮次的规范程度、汇报完整度有波动——这正是我们要观察的指标
(guidance 写得够不够好,直接决定这一情形的成功率)。 |
| B. 「会不会自动加载 bot skill?」 | 分两种情况说清楚: ① skill 已安装在实例里(我们的测试实例就是):OpenClaw 把所有已装 skill 的名字和 description 常驻提供给模型, aisa-bot-access 的 description 明确写了 "Use when crawling a site returns
HTTP 402 with an AISA onboarding/guidance block"——所以撞到 402 时模型大概率会自动激活它,
即使你没点名(提示词 1 实测通常走这条路)。想看纯冷启动必须像提示词 2 那样显式禁用。② skill 未安装(真实外部 bot):OpenClaw 不会凭 402 里的 URL 自动"安装"技能; 但 agent 可以把 guidance.skill 指向的 markdown 抓下来当说明书在上下文里遵循,效果接近装了 skill——
这就是我们把 skill 以公开 URL 发布的原因。 |
| C. 已加载 bot skill | 流程确定性最高:严格按 skill 的 Step 0-4 执行(先裸试 → 读 402 → 注册/登录 → 识别试用额度 → 带 header 重试 → 登录比对余额),错误处理照表走(blocked 直接放弃并明说), 并按 skill 的强制要求汇报:成功与否、免费还是付费、精确金额、剩余余额。实例里已预置测试账号凭证 (env),skill 会直接复用而不重复注册。 |
| D. 叠加 preview skill vs 不叠加 | 不叠加:直接给结果 + 简要汇报(适合日常使用)。 叠加(提示词 5):变成"步骤剧场"——每步宣布身份与意图、展示原始请求/响应 JSON、解释决策依据、 实时报账(本 URL 花费/累计/余额),可切换模拟 UA,结尾输出账单汇总表和 Verdict 结论 (冷启动引导是否自足、哪里有摩擦)。适合演示给阿里/团队看,以及为优化 guidance 措辞收集依据。 注意 preview 只改变「呈现方式」,爬取动作仍由 bot skill 的流程执行。 |
crawlerIdentification.verified 标为 false(IP 不在官方段内)。当前这只影响「给验真爬虫免费」类规则,
付费/拦截行为不受影响——解说时向观众说明即可。
整个 bot 引导链不与任何内容域名耦合,三种环境行为一致:
| 环境 | 内容域名 | 收费墙执行者 | bot 侧差异 |
|---|---|---|---|
| 公网模拟(本页示例) | news.agentflare.org | 自建模拟网关 | 无差异。bot 只做一件事:请求 URL → 读 402 的 guidance → 按其中的 host 注册/充值 → 带 token 重试 |
| 阿里内网联调 | lr-pay-crawler*.alicdn-test.com | 阿里 ESA(内网) | |
| 未来生产 | 任意接入的 publisher 站点 | 阿里 ESA |
做到无关的四个机制:
ONBOARDING_URL 派生(当前为 esa.aisa.one),bot 以响应内链接为准,不硬编码| 维度 | news.agentflare.org(模拟) | 生产(阿里 ESA) |
|---|---|---|
| 收费墙执行者 | 自建 Node 网关(每请求先 verify 再回源) | 阿里 ESA 在边缘执行同样逻辑 |
| publisherDomain | 固定映射到测试 publisher lr-pay-crawler-version1.alicdn-test.com(让联调账号的规则与收入生效) | 发请求的真实 Host,按域名归属 publisher(子域归父域) |
| verify 入口 | esa.aisa.one | |
| 其余语义 | 完全一致:两层 token、guidance 引导、per-request 扣费、403 拦截、响应字段 | |