一个 visitor ID,无论他们如何回来
代理在服务器上将100多个设备信号转换为visitor ID。无痕模式、清除Cookie和浏览器更新不会产生新的访问者。
回访访客可以更改的内容
ID 指的是设备,而不是 Cookie 或连接。
| 他们带着回来 | 相同的访客 ID | 为什么 |
|---|---|---|
| 隐私窗口或无痕窗口 | 相同 | 存储为空,硬件却不是。 |
| 已清除 Cookie 和网站数据 | 相同 | 硬件锚点和指纹仍然匹配。 |
| 浏览器更新 | 相同 | 新版本会改变部分信号;模糊匹配会自动消化这些变化。 |
| VPN 或新的 IP 地址 | 相同 | IP 不属于 ID 的一部分,它会显示在 flags 中。 |
| 同一设备上的新账户 | 相同 | 多账户就是这样出现的:一台设备,多个 external ID。 |
| 同一设备上的其他浏览器 | 新访客 | 每个浏览器的渲染方式不同,因此这是另一个指纹。 |
| 其他设备 | 新访客 | ID 即设备。 |
按顺序匹配
每次识别都会按从最可靠到较弱的匹配顺序与项目访客比对,事件会说明命中的是哪一个。
- 已存储的 ID
- 代理在存储和第一方 Cookie 中保存的 ID,只要硬件仍然匹配。
- 硬件锚点
- 图形、核心数、内存和平台,浏览器更新或清除存储不会改变这些信息。
- 已知指纹
- 与您项目中之前出现过的信号完全相同。
- 模糊匹配
- 按组件与同一硬件上的近期访客逐项比对,并与次优结果保持一定差距。
- 噪声感知
- 当浏览器随机化 Canvas 和音频时(如 Brave 和隐私窗口),这些数据会被忽略。
import { start } from 'zeno-id'
const agent = start({ publicKey: 'pk_...' })
// A stable ID per device, and whether it was seen before.
const { visitorId, returning, requestId } = await agent.get({
externalId: user.id,
action: 'login',
})100 多个信号
从零开始收集,不包含 WebRTC 网络地址。
渲染
Canvas、WebGL 供应商、渲染器、扩展和参数、WebGPU 适配器和音频。
设备
屏幕、色深、像素比、核心数、内存、触摸、平台、client hints、字体和语音。
设置
时区、语言、日历、媒体偏好、存储配额和权限状态。
完整性
自动化残留、被替换的原生方法以及在页面、Worker 和 iframe 之间不一致的值。
坦诚说明局限性
可用于决策的 ID,因为它会说明其可信度。
每个项目一个 ID
ID 会与您的项目一起进行哈希处理,因此同一设备在其他地方会有不同的 ID。任何人都无法跨服务追踪您的访问者。
每个事件的置信度
匹配的可信度,范围 0 到 1。常见设备上的模糊匹配得分低于稀有硬件上已存储的 ID。
仅作线索,绝非证据
相同的设备(例如同一型号、同一系统的手机)可能共享同一个 ID。请结合 external ID、flags 和连接信息来审查共享 ID。
今天就识别您的第一位访客
安装代理,在服务器上读取事件即可完成。