🔍 深度调查 · AI 商业化

ChatGPT 开始投放广告了

完整技术链路拆解:SSE 注入机制 × Fernet 加密归因 × OAIQ SDK 追踪 × 屏蔽方案

Guang Yang · 2026.04.29 · 基于 Buchodi 安全调查报告

🚨 到底发生了什么?

OpenAI 已经在 ChatGPT 中上线了广告系统。 当你在 ChatGPT 聊天时,后台会根据你的对话内容,在模型回复的数据流中直接插入广告卡片。

4 月 28 日,安全研究员 Buchodi 发布了一篇技术调查报告,基于真实网络流量抓包,完整揭示了 ChatGPT 广告系统的工作原理。

这意味着:

① 你的对话内容被用来做广告定向投放

② 广告像模型回复一样自然地出现在对话流中

③ 点击后被加密 token 追踪,cookie 有效期 30 天

④ 已有真实广告主入驻:Grubhub、GetYourGuide、Canva、Gametime、Aritzia 等

🎯 怎么做到精准投放的?

研究人员用同一个账号,在 6 个不同话题的对话中,收到了 6 个不同品牌的广告:

对话话题投放品牌广告内容
北京旅行(长城、故宫)Grubhub中餐外卖配送
北京旅游预订GetYourGuide长城一日游
北京机票Axel航班预订
NBA 季后赛Gametime赛事门票
春季时尚潮流Aritzia时尚服饰
效率工具 / PPTCanva设计工具

投放逻辑:上下文定向(contextual targeting)
读取你当前对话内容来匹配广告主。目前没有证据表明利用了历史对话记录(但也不能排除)。

⚙️ 技术实现:SSE 流注入

当你发消息给 ChatGPT,后端打开 SSE 响应流:

chatgpt.com/backend-api/f/conversation

大部分事件是模型输出。但有些是广告单元:

event: delta
data: {
  "type": "single_advertiser_ad_unit",
  "ads_request_id": "069e89b3-c038-7764-...",
  "advertiser_brand": {
    "name": "Grubhub",
    "id": "adacct_6984ed0ba554...",
    "favicon_url": "https://bzrcdn.openai.com/..."
  },
  "carousel_cards": [{
    "title": "Get Chinese Food Delivered",
    "body": "Satisfy Your Cravings...",
    "target": {
      "type": "url",
      "open_externally": false
    }
  }]
}

关键细节:

single_advertiser_ad_unit 是独立的类型化 schema,暗示还有 multi-advertiser 等变体

广告主 ID 格式为 adacct_<32-hex> —— 稳定的商户账号标识

• 素材(Logo + 配图)全部托管在 bzrcdn.openai.com,OpenAI 完全控制分发

open_externally: false 表示链接在 ChatGPT 内置 WebView 中打开

🔐 四层加密追踪链路

每个广告携带 4 个独立的 Fernet 加密 token,形成完整的归因闭环:

(Fernet = AES-128-CBC 加密 + HMAC-SHA256 完整性校验)

ads_spam_integrity_payload

SSE 数据内传输,不在点击 URL 中。服务端校验广告点击是否被伪造。

oppref

核心归因 token。写入 cookie __oppref(720h / 30天)。跟着你在商户网站的每一次操作。

olref

与 oppref 一起在 URL 上,但 SDK 不存储。用于 OpenAI 的出站链接日志。

ad_data_token

Base64 JSON 内嵌 Fernet token。SSE 载荷传输,用于点击时刻数据核对。

🔄 完整归因闭环

  1. 你发消息 → ChatGPT 后端打开 SSE 流
  2. 流中夹带 single_advertiser_ad_unit 广告对象
  3. 前端渲染为卡片 → 你点击 → 跳转到商户页面
  4. URL 携带 oppref + olref 加密参数
  5. 商户页面加载 oaiq.min.js(OAIQ SDK v0.1.3)
  6. SDK 读取 URL 中的 oppref → 写入 cookie(30天)
  7. 你在商户网站的后续浏览/购买 → SDK 上报到 bzr.openai.com
  8. OpenAI 完成归因:知道哪个广告带来了哪个转化 ✓

🧪 有趣细节:研究人员抓到一个 Home Depot 广告点击——token 铸造时间 11:30:08 UTC,浏览器打开商户页面 11:31:43 UTC。点击延迟 95 秒。这意味着用户看到广告后犹豫了一分半才点——非常真实的人类行为。

Fernet token 的前 9 字节是公开的(版本字节 + 8 字节时间戳),所以铸造时间无需密钥即可提取:

import base64, struct, datetime

b = base64.urlsafe_b64decode("gAAAAABp7fdA" + "==")
ts = struct.unpack(">Q", b[1:9])[0]
print(datetime.datetime.utcfromtimestamp(ts))
# → 2026-04-26 11:30:08 UTC

🛡️ 怎么屏蔽?

方法一:拦截广告域名

在广告拦截器或系统 hosts 中添加:

bzrcdn.openai.com   # 广告素材 CDN
bzr.openai.com     # 追踪事件上报

方法二:清除追踪 Cookie

如果已经点过广告链接,检查并删除:

__oppref           # 归因追踪 cookie(30天)
__oaiq_domain_probe # 域名探测 cookie

方法三:使用 API 而非网页版

目前广告系统仅在 chatgpt.com 网页/App 端观察到。通过 API 调用模型暂未发现广告注入。

方法四:警惕内置浏览器

open_externally: false 意味着广告默认在 ChatGPT 内置浏览器打开。如需点击,复制链接到独立浏览器。

💭 怎么看这件事?

Google 走过的路,OpenAI 也在走。

搜索结果里夹广告大家已经习惯了,AI 对话里夹广告……你习惯吗?

AI 对话和搜索有一个本质区别:人们对 AI 助手的信任度远高于搜索引擎。

你 Google 搜索时知道前几条是广告。但当你的 AI "助手" 在帮你规划旅行时突然推荐一个外卖 app——你能分清这是它的"建议"还是广告吗?

客观说,OpenAI 的实现是比较克制的:广告是独立数据类型(不是模型输出)、有明确品牌标识、使用加密追踪而非明文。

但"克制"和"可接受"是两回事。当广告和回答混在一起,信任会被稀释。

📌 总结:今天记住 5 件事