计费与反作弊 (Billing & Anti-Fraud)
一句话概述
计费系统确保广告交易的准确结算,反作弊系统识别和过滤无效流量 (IVT),两者共同保障广告生态的健康和信任。
计费系统架构
flowchart LR
A[用户行为事件] --> B[事件采集<br/>曝光/点击<br/>转化回传]
B --> C[反作弊过滤<br/>有效性判定<br/>IVT 过滤]
C --> D[计费引擎<br/>扣费计算<br/>预算扣减]
D --> E[结算系统<br/>账单生成<br/>对账清算]
计费点与计费逻辑
曝光计费 (CPM)
计费触发条件:
1. 广告素材加载完成
2. 满足可见性标准 (MRC 标准: 50%像素可见 ≥ 1秒)
3. 通过反作弊校验
计费流程:
客户端渲染广告 → 上报曝光事件 → 服务端接收
→ 反作弊校验 → 有效曝光 → 扣费 → 更新预算
点击计费 (CPC)
计费触发条件:
1. 用户真实点击广告
2. 点击事件有效 (非机器点击)
3. 通过反作弊校验
防重复计费:
- 同一用户短时间内多次点击只计一次
- 去重窗口: 通常 5-30 秒
转化计费 (CPA/oCPM)
转化回传方式:
1. SDK 回传: 广告 SDK 自动上报转化事件
2. S2S 回传: 广告主服务端回传转化数据
3. API 回传: 通过平台 API 上传转化数据
转化归因:
点击归因窗口: 通常 7-30 天
曝光归因窗口: 通常 1-7 天
用户点击广告 → 7天内完成转化 → 归因到该次点击 → 计费
反作弊系统 (Anti-Fraud)
无效流量分类 (IVT)
| 类型 |
说明 |
示例 |
| GIVT (一般无效流量) |
已知的非人类流量 |
爬虫、数据中心IP、预加载 |
| SIVT (复杂无效流量) |
伪装成真实用户的作弊 |
模拟器、设备农场、点击注入 |
常见作弊手段
展示作弊
| 手段 |
说明 |
| 像素填充 (Pixel Stuffing) |
将广告塞入 1×1 像素 |
| 广告堆叠 (Ad Stacking) |
多个广告重叠,只有顶层可见 |
| 后台展示 |
App 在后台时触发广告展示 |
| 自动刷新 |
自动刷新页面增加展示量 |
| iframe 嵌套 |
在不可见的 iframe 中加载广告 |
点击作弊
| 手段 |
说明 |
| 点击注入 (Click Injection) |
检测到 App 安装时注入虚假点击 |
| 点击劫持 (Click Hijacking) |
劫持用户正常点击为广告点击 |
| 自动点击 |
脚本/程序自动点击广告 |
| 激励点击 |
付费让真人点击广告 |
| 误点击 |
故意设计容易误触的广告位 |
转化作弊
| 手段 |
说明 |
| 虚假注册 |
批量注册虚假账号 |
| 设备农场 (Device Farm) |
大量真实设备批量操作 |
| 模拟器 |
使用模拟器模拟设备行为 |
| 归因劫持 |
窃取其他渠道的转化归因 |
| SDK 欺骗 (SDK Spoofing) |
伪造 SDK 上报的转化事件 |
反作弊检测方法
规则引擎
实时规则示例:
- 同一 IP 1分钟内点击 > 10次 → 标记异常
- 点击到转化时间 < 1秒 → 标记异常
- 设备 ID 为空或格式异常 → 标记异常
- 展示到点击时间 < 0.3秒 → 标记异常
- 同一设备24小时内安装 > 5个App → 标记异常
规则引擎架构:
事件流 → Flink 实时处理 → 规则匹配 → 标记/过滤
机器学习检测
特征工程:
- 设备特征: 设备型号分布、系统版本、屏幕分辨率
- 行为特征: 点击间隔、滑动轨迹、停留时间
- 时间特征: 行为时间分布、活跃时段
- 网络特征: IP 分布、代理检测、VPN 检测
- 聚合特征: 同 IP 设备数、同设备广告点击数
模型:
- 分类模型: XGBoost / LightGBM / 深度学习
- 异常检测: Isolation Forest / Autoencoder
- 图分析: 设备-IP-账号关联图谱,发现作弊团伙
设备指纹
设备指纹组成:
- 硬件信息: CPU、内存、屏幕、传感器
- 软件信息: 系统版本、安装 App 列表、字体
- 网络信息: IP、WiFi、基站
- 行为信息: 触摸压力、滑动速度、陀螺仪
用途:
- 识别模拟器 (传感器数据异常)
- 识别设备农场 (硬件信息雷同)
- 跨 App 设备关联
归因系统
归因流程
1. 用户看到/点击广告 → 记录曝光/点击事件 (含设备ID、时间戳)
2. 用户完成转化行为 → 上报转化事件
3. 归因系统匹配:
转化事件 ←匹配→ 最近的点击/曝光事件
4. 归因成功 → 计费
匹配逻辑:
优先级: 点击归因 > 曝光归因
窗口: 点击 7天 > 曝光 1天
去重: 同一转化只归因一次
归因模型
| 模型 |
逻辑 |
适用场景 |
| 最后点击 |
归因给最后一次点击 |
效果广告 (最常用) |
| 首次点击 |
归因给第一次点击 |
品牌认知 |
| 线性 |
所有触点平均分配 |
多触点分析 |
| 时间衰减 |
越近的触点权重越高 |
综合分析 |
| 数据驱动 |
算法自动分配 |
大数据量场景 |
iOS 归因 (SKAdNetwork / SKAN)
传统归因 (IDFA):
点击 → IDFA 匹配 → 精确归因 ✓
ATT 后 (SKAN):
点击 → Apple 聚合归因 → 延迟 24-48h → 有限数据
SKAN 限制:
- 无设备级别数据
- 转化值只有 6 bit (64 种)
- 数据延迟 24-48 小时
- 无法实时优化
数据对账
对账维度
内部对账:
客户端日志 vs 服务端日志 → 差异分析
展示日志 vs 计费日志 → 确保计费准确
外部对账:
平台数据 vs 广告主数据 → 差异通常 < 5%
平台数据 vs 第三方监测 → 差异通常 < 10%
常见差异原因
| 差异类型 |
原因 |
| 展示差异 |
可见性标准不同、统计口径差异 |
| 点击差异 |
去重逻辑不同、反作弊过滤差异 |
| 转化差异 |
归因窗口不同、归因模型不同 |
| 金额差异 |
计费时间点不同、汇率差异 |
对账流程
T+1 对账:
1. 次日凌晨拉取双方数据
2. 按广告计划/日期维度聚合
3. 计算差异率
4. 差异 > 阈值 → 告警 → 人工排查
5. 确认后调整账单
广告可见性 (Viewability)
MRC 标准
| 广告类型 |
可见性标准 |
| 展示广告 |
≥ 50% 像素在可视区域 ≥ 1秒 |
| 视频广告 |
≥ 50% 像素在可视区域 ≥ 2秒连续播放 |
| 大尺寸广告 (>242,500px²) |
≥ 30% 像素在可视区域 ≥ 1秒 |
可见性检测技术
Web 端:
- Intersection Observer API
- 页面可见性 API (Page Visibility)
- 几何计算 (getBoundingClientRect)
App 端:
- View 可见性检测 (onGlobalLayout)
- 前后台状态检测
- 遮挡检测
与大数据开发的关联
- 计费数据管道: 曝光/点击/转化事件的实时采集和处理
- 反作弊实时计算: Flink 实时规则引擎和异常检测
- 反作弊离线分析: 大规模日志的离线分析和模型训练
- 对账系统: T+1 对账数据的计算和差异分析
- 归因数据处理: 归因匹配的大规模数据处理
- 设备指纹库: 设备信息的采集、存储和查询
- 反作弊特征: 聚合特征的实时/离线计算
面试高频问题
- 常见的广告作弊手段有哪些?如何检测?
- 广告计费系统的架构是怎样的?
- 什么是 GIVT 和 SIVT?
- 广告归因的流程是什么?常见的归因模型有哪些?
- 如何做广告数据对账?常见的差异原因有哪些?
- iOS ATT 对广告归因的影响?SKAN 的限制?
推荐阅读