互联网的第二类读者:如何识别、管控并计费 AI Agent 流量

2026-09-30 16 预计阅读时间: 1 分钟
来源: blog.cloudflare.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:10 分钟

网站过去主要为人类访客设计,如今却迎来了规模庞大的“第二类读者”:爬虫、自动化工具和 AI Agent。Cloudflare 观察到,抵达其所服务网站的流量中,超过一半已经来自自动化客户端,而 AI Agent 是增长最快的部分。这意味着站点运营者不能再把所有请求都当成普通页面浏览,而需要回答三个问题:谁在访问、允许访问什么,以及是否应该为高价值内容收费。

从页面访问量转向请求身份

传统分析系统通常围绕浏览器、会话和转化率展开,但 Agent 的访问模式不同:

  • 它可能在几秒内读取数百个页面,却不会执行页面中的 JavaScript。
  • 它可能定期抓取文档,也可能代表用户实时检索答案。
  • 同一个出口 IP 后面可能同时存在正常用户、搜索爬虫和 AI 服务。
  • User-Agent 可以提供线索,但任何客户端都能伪造它。

因此,识别自动化访问不能只靠一个请求头。比较实用的信号包括:

  1. 明确声明的身份:Agent 名称、用途和运营方。
  2. 可验证凭证:API Key、签名请求、JWT 或双向 TLS 证书。
  3. 网络与行为信号:请求速率、访问路径、IP 信誉和抓取节奏。
  4. 边缘平台提供的分类结果:用于辅助判断是否为已知机器人或自动化流量。

robots.txt 仍然适合表达抓取偏好,但它不是访问控制机制。愿意遵守规则的客户端会读取它,恶意或配置错误的程序则可以直接忽略。

“允许访问”不应只有开和关

AI Agent 并不天然等于恶意流量。文档索引、搜索发现和代表用户执行任务,都可能给网站带来价值。更合理的做法是按内容与身份组合策略,而不是把所有机器人一律封禁。

可以把资源划分为几类:

资源 匿名浏览器 已知搜索爬虫 已认证 AI Agent 未知自动化客户端
营销页面 允许 允许 允许或限速 限速
公开文档 允许 允许 允许并计量 严格限速
原创数据集 摘要可见 视协议决定 认证或付费 拒绝
用户私有内容 登录后允许 拒绝 用户授权后允许 拒绝

这样的矩阵把“机器人管理”变成了内容治理:站点拥有者可以决定哪些内容适合被发现,哪些内容只能在授权后用于检索、训练或批量处理。

可运行示例:识别、授权并计量 Agent 请求

下面是一个可以直接运行的 Flask 示例。它不代表 Cloudflare 的具体产品接口,而是一种可以这样实践的最小服务端模型:公开接口允许访问,高价值接口要求 API Key,并记录每个调用方的使用量。

将以下内容保存为 app.py:

import json
import os
import time
from flask import Flask, g, jsonify, request

app = Flask(__name__)

VALID_KEYS = {
    key.strip()
    for key in os.getenv('ACCESS_KEYS', 'demo-agent-key').split(',')
    if key.strip()
}
USAGE = {}
AI_MARKERS = ('gptbot', 'claudebot', 'agent', 'crawler', 'bot')


def classify_client():
    user_agent = request.headers.get('User-Agent', '').lower()
    declared_name = request.headers.get('X-Agent-Name')

    if declared_name:
        return 'declared-agent', declared_name
    if any(marker in user_agent for marker in AI_MARKERS):
        return 'suspected-automation', user_agent[:120]
    return 'unknown-or-human', user_agent[:120]


@app.before_request
def start_request():
    g.started_at = time.time()
    g.client_type, g.client_name = classify_client()


@app.after_request
def log_request(response):
    event = {
        'path': request.path,
        'method': request.method,
        'status': response.status_code,
        'client_type': g.client_type,
        'client_name': g.client_name,
        'duration_ms': round((time.time() - g.started_at) * 1000, 2),
    }
    print(json.dumps(event, ensure_ascii=False), flush=True)
    return response


@app.get('/public')
def public_content():
    return jsonify({
        'content': 'This content is publicly available.',
        'client_type': g.client_type,
    })


@app.get('/premium')
def premium_content():
    api_key = request.headers.get('X-API-Key', '')
    if api_key not in VALID_KEYS:
        return jsonify({
            'error': 'A valid API key is required.',
            'signup_url': '/plans',
        }), 401

    USAGE[api_key] = USAGE.get(api_key, 0) + 1
    return jsonify({
        'content': 'Licensed premium content for automated use.',
        'metered_units': 1,
        'total_units_this_process': USAGE[api_key],
    })


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

安装依赖并启动:

python -m venv .venv
. .venv/bin/activate
pip install flask
ACCESS_KEYS=customer-a-key python app.py

模拟匿名访问、声明身份的 Agent,以及持有凭证的付费客户端:

curl http://127.0.0.1:8000/public

curl \
  -H 'User-Agent: ExampleAgent/1.0' \
  -H 'X-Agent-Name: documentation-indexer' \
  http://127.0.0.1:8000/public

curl \
  -H 'X-Agent-Name: licensed-research-agent' \
  -H 'X-API-Key: customer-a-key' \
  http://127.0.0.1:8000/premium

这个示例中的内存计数器只适合本地演示。生产环境应将计量事件写入数据库、消息队列或专门的用量计费系统,并处理并发、重试和重复请求。API Key 也应该经过哈希存储,支持轮换、撤销和作用域限制。

收费之前,先解决身份与归因

为 Agent 访问收费并不只是返回一个支付页面。完整链路通常至少包括:

  • 身份注册:知道请求代表哪个组织、产品或最终用户。
  • 授权范围:限制可访问的数据集、接口、用途和时间窗口。
  • 计量规则:按请求、字符、文档、带宽或授权周期计费。
  • 可审计记录:保存请求方、资源、时间、单位数和策略结果。
  • 结算机制:订阅、预付额度、月末账单或内容许可合同。

HTTP 402 Payment Required 可以用于实验性协议,但目前没有统一、普遍兼容的支付流程。实际系统往往先通过外部结算或订阅发放访问凭证,再由服务端校验凭证和记录用量。

还有两个常被忽略的边界。其一,缓存命中可能绕开源站计量,因此策略和计数最好尽可能靠近实际访问入口。其二,Agent 可能代表已登录用户访问私人数据,此时不仅要验证 Agent,还必须验证用户授权,避免把机器身份误当成数据所有者身份。

上线前的检查清单

可以从观察模式开始,而不是立即阻断所有自动化访问:

  • 建立人类、已知机器人、已认证 Agent 和未知自动化流量的分类报表。
  • 为高成本路径设置独立的速率限制与预算告警。
  • 明确公开内容、可索引内容、许可内容和私有内容的边界。
  • 不把 User-Agent 当成可信身份,关键资源必须使用可验证凭证。
  • 记录策略命中原因,给误封和合作方接入保留申诉渠道。
  • 在收费前定义计量单位、缓存规则、退款方式和重复请求处理方式。
  • 定期轮换密钥,并为每个调用方设置单独的额度与撤销能力。

互联网的第二类读者已经形成规模。真正重要的变化不是“机器人更多了”,而是网站需要像管理用户账户和 API 客户端一样管理 Agent:看得见、辨得清、控得住,并在价值交换成立时准确计量。


相关推荐