跳到正文
实验性 · canvas · WebGL

Canvas 像素,来自你声明的那块 GPU

GPU 字符串很容易改,那块 GPU 画出来的像素却改不了。Canvas 桥接会把 canvas 和 WebGL 操作转发到一台真正装有你的身份画像(persona)所呈现 GPU 的机器上,再把它的像素传回来。这样,页面绘制后再回读,得到的就是那块 GPU 本该给出的结果。

实验性功能,需主动开启。大多数场景用不到它。

一台渲染服务器、一条隧道、一个选项

# on the machine with the real GPU (a Windows GPU for a Windows persona), next to a regular Chrome
# started with --remote-debugging-port=9222 --user-data-dir=<a separate folder>
# (Chrome ignores the port on its default profile)
pip install playwright
python tools/canvas-bridge-server/server.py \
    --backend cdp \
    --cdp-url ws://127.0.0.1:9222/devtools/browser/... \
    --port 8443
# it prints the render GPU's renderer string: use it in step 3

亮点

转发操作,而非回放录制

它转发的是绘制调用,而不是一套预先录制的图像,所以大多数即时生成的 canvas 都能正常工作,而不只是已知的探测脚本。

关键的回读接口

getImageData、toDataURL、readPixels 和 measureText 返回的都是桥接主机的真实输出。这条路径上会跳过本地噪声,一切以桥接像素为准。

按站点设置策略

可以对所有站点启用桥接,也可以只对 canvas 一致性要紧的白名单站点启用,或者对黑名单以外的所有站点启用。

等待,还是继续

冷缓存未命中时,block 模式会等待桥接返回,local 模式则直接给出快速的本地渲染结果,不会卡住。

不设置就不启用

不设置桥接 URL,渲染就完全在本地进行。桥接不可达时,Clearcote 会记录一条警告并回退到本地渲染。

为什么需要桥接,以及它的代价

Clearcote 在主机实际拥有的 GPU 上渲染 canvas 和 WebGL。当身份画像声明的是另一块 GPU 时,把渲染像素与声明硬件做比对的检测就能发现差异,而任何软件手段都无法让一块 GPU 输出另一块 GPU 的精确像素。桥接不是掩盖这种不一致,而是消除它:绘制就在被声明的那块 GPU 上完成。

渲染服务器是运行在 GPU 机器上的一个小型 Python 协调程序,它驱动那台机器上的浏览器(通过 CDP 连接的普通 Chrome,或由它自行启动的无头 Clearcote),在真实的 canvas 上重放转发过来的操作。客户端从渲染进程打开桥接 socket,因此需要 --no-sandbox;设置桥接 URL 后,SDK 会自动加上它。

它确实有代价。未命中桥接缓存的像素回读要等待一次网络往返(本地回退前有 5 秒超时),而每次调用 measureText 都会产生一次往返,所以请把渲染主机放在同一局域网或同一数据中心内。此外,canvas 身份会变成渲染主机的,而不是种子的:共用同一台桥接主机的所有配置文件都会共享它的 canvas 哈希,因此每组需要彼此隔离的身份,请各配一台 GPU 主机。

典型用途

主机渲染不了的身份画像

呈现一块你的自动化机器上并没有的 GPU,像素也与之相符。

没有 GPU 的服务器

否则只能靠软件光栅化器绘制的无头服务器。

移动端身份画像

在桌面引擎上运行 Android 身份画像,由匹配的硬件负责渲染。

Clearcote 专为隐私保护、测试、研究和合法自动化而打造。你须对自己的使用方式负责,并遵守所访问网站的条款。

哪些套餐包含此功能

实验性功能,所有套餐均可用。渲染主机需要你自己提供:一台装有你想呈现的 GPU 的机器(Windows 身份画像就配 Windows GPU),并且能通过私有网络访问。

对比套餐

常见问题

为什么不能直接伪造 GPU?

GPU 字符串可以伪造,Clearcote 也确实这么做了。但页面还可以画点东西再把像素读回来,而这些像素来自实际执行绘制的那块 GPU。只改字符串、不改像素,恰恰是检测最想找到的那种矛盾。

运行它需要什么?

一台装有真实 GPU、用作渲染主机的机器(Windows 身份画像就配 Windows GPU;它的 GPU 会成为你的配置文件所呈现的 canvas 身份),以及一条通往它的私有网络路径,例如 Tailscale、WireGuard 或 SSH 隧道。

它安全吗?

桥接走的是明文 WebSocket,所以只能在私有网络或加密隧道上运行,切勿把桥接端口暴露到公网。参考服务器不会校验 --canvas-bridge-auth,因此网络本身就是你的访问控制。

哪些 canvas 会走桥接?

Canvas 2D 和 WebGL,包括程序化生成的 WebGL 纹理。以图像、2D canvas、视频、ImageBitmap 和 3D 纹理为源时,该 canvas 会回退到本地渲染,结果依然正确,只是不走桥接。

在文档中深入了解

相关功能

试用 Clearcote

可直接接入 Playwright 与 Puppeteer,一直到 TLS 握手都保持一致,并提供开源构建作为起点。

通过 GitHub 可免费使用一个浏览器。无需信用卡。