ADX 平台对外接口规范 v3.3.0
文档面向对象:SSP(供应方平台)移动端开发人员 协议版本:3.3.8 生效日期:2026-05-26 传输协议:HTTPS + JSON(application/json)
1. 概述
本文档定义 SSP(供应方平台)移动端应用与 优聚智汇 ADX 之间的标准化通信接口。
1.1 核心特征
| 特征 | 说明 |
|---|---|
| 适用终端 | 仅限移动端(iOS / Android),不支持 PC Web |
| 传输编码 | JSON(UTF-8),Content-Type 为 application/json |
| 安全机制 | AES-256-GCM 加密 + HKDF 密钥派生 + HMAC-SHA256 签名,三重保护 |
| 认证方式 | AccessKey(AK)+ SecretKey(SK)密钥对,AK 携带在请求体的 uuid 字段中 |
| 数据模型来源 | Proto 文件定义结构,各语言通过 Protobuf 编译器生成 PB 类,序列化为 JSON 后加密传输 |
| 请求体结构 | 外层明文 JSON(AdxRequest)包裹内层加密的 BidRequest JSON |
| 响应体结构 | AdxResponse JSON,包含完整的广告素材、事件追踪配置、深度链接等 |
| 事件上报 | 分布式 URL 模式,响应中的 BidExt.events[] 提供各事件的追踪 URL 列表 |
1.2 整体流程
┌──────────┐ 构造BidRequest ┌──────────┐ ProtoJSON ┌──────────┐
│ 按Proto │ (使用PB类) │ 序列化为 │ 字符串 │ AES-GCM │
│ 定义构造 │ ──────────────→ │ JSON字符串│ ──────────→ │ 加密 │
│ 对象 │ │ │ │ │
└──────────┘ └────┬─────┘ └────┬─────┘
│ │
Base64编码 Base64编码
│ │
┌──────────┐ HMAC-SHA256 ┌─────▼─────┐ 组装JSON ┌────▼─────┐
│ 拼接签名字 │ ─────────────→ │ 计算签名 │ ──────────→ │AdxRequest│
│ 符串 │ │signature │ │JSON对象 │
└──────────┘ └───────────┘ └────┬─────┘
│
POST JSON (application/json)
│
┌─────────▼─────────┐
│ ADX服务端解析验签 │
└─────────┬─────────┘
│
┌─────────▼─────────┐
│ 返回AdxResponse │
└─────────┬─────────┘
│
┌───────────────────▼───────────────────┐
│ 渲染广告 → 触发事件 │
│ (按events[].urls上报) │
└───────────────────────────────────────┘1.3 基础信息
| 项目 | 值 |
|---|---|
| 环境地址 | https://api.ujuadx.cn/api/v3/bid |
| HTTP 方法 | POST |
| Content-Type | application/json(必须) |
| 字符集 | UTF-8 |
| 适用终端 | 仅移动端(iOS / Android) |
| 加密算法 | AES-256-GCM |
| 密钥派生 | HKDF-SHA256(salt=nonce, info="aes-key") |
| 签名算法 | HMAC-SHA256 |
| Base64 编码 | URL-safe(base64.URLEncoding) |
| 协议版本 | "3.3.0" |
| 时间戳精度 | 毫秒(UnixMilli) |
| Nonce 长度 | 24 字符 |
| 请求超时建议 | 200ms(RTB 全链路 P99 < 150ms,预留网络延迟) |
2. 接入准备
2.1 获取密钥对
联系 ADX 运营团队完成注册后,获取以下凭证:
| 凭证 | 说明 | 示例 |
|---|---|---|
| AccessKey (UUID) | 广告位标识。每个广告位唯一 | "111111" |
| SecretKey (SK) | 加密密钥运营人员下发。用于 HKDF 密钥派生和 HMAC 签名 | "111111111" |
⚠️ 安全提醒:
- SecretKey 是唯一密钥,同时用于加密和签名
- 移动端不可硬编码 SK,应通过安全渠道动态获取或使用安全存储(iOS Keychain / Android Keystore)
- 切勿将 SK 提交至代码仓库或日志中输出
2.2 Proto 文件
SSP 需要使用以下 Proto 文件生成对应语言的 pb 类/结构体:
2.2.1 BidRequest 消息定义
syntax = "proto3";
package ujuadxapi;
option go_package = "./ujuadxapi;ujuadxapi";
// 竞价请求根消息
message BidRequest {
string id = 1; // 请求唯一ID。必填
repeated Imp imp = 2; // 广告位列表。正常是一个,必填
optional App app = 3; // 媒体应用信息。必填
optional Device device = 4; // 设备信息。必填
optional User user = 5; // 用户信息。推荐
optional ReqExt ext = 15; // 扩展字段。推荐
}
// 广告位定义
message Imp {
string id = 1; // 广告位唯一ID
optional SlotAttribute slot_attribute = 2; // 广告位属性。必填
optional double bidfloor = 10; // 最低出价(CPM)底价,单位:千次元(CNY)。必填
optional ImpExt ext = 15; // 广告位扩展。当前版本忽略
}
// 广告位属性
message SlotAttribute{
optional int32 width = 1; // 可展示宽度,像素单位。必填
optional int32 height = 2; // 可展示高度,像素单位。必填
repeated string mimes = 3; // 支持的MIME类型(e.g., "video/mp4"、"image/jpeg" 和 "image/gif")。不设置不限
optional int32 min_duration = 5; // 最短时长(秒)。需要视频类时必填
optional int32 max_duration = 6; // 最长时长(秒)。需要视频类时必填
optional int32 deeplink = 10; // 支持落地页:1-支持,2-不支持。默认1
}
// 媒体应用信息
message App {
optional string name = 2; // 应用名称。必填
optional string bundle = 3; // application bundle 或package name。必填
optional string domain = 4; // 应用域名。可选
optional string ver = 9; // 应用版本。必填
optional int32 paid = 11; // 是否付费应用:1=付费。可选
optional string keywords = 13; // 关键词列表。推荐
}
// 设备信息
// 当设备为android时:imei,imeimd5,oaid 三个中至少存在一个
// 当设备为ios时,idfamd5,idfa 至少存在一个;caid、paid及其相关参数的正确填写对广告填充有很大帮助
message Device {
optional string ua = 1; // 用户代理(User-Agent)。必填
optional Geo geo = 2; // 地理位置。可选
optional int32 dnt = 3; // 浏览器设置的 "Do Not Track"(请勿跟踪)标准标志,0 表示不限制跟踪,1 表示请勿跟踪。推荐
optional int32 lmt = 4; // 商业认可的 "Limit Ad Tracking"(限制广告跟踪)信号(例如 iOS、Android),0 表示不限制,1 表示必须限制。推荐
optional string ip = 5; // IPv4地址。推荐
optional string ipv6 = 6; // IPv6地址。推荐
optional int32 device_type = 7; // 设备类型:1=手机/2=平板/3=PC/4=TV/5=OTT。推荐
optional string make = 8; // 设备制造商(例如 "Apple")。推荐
optional string model = 9; // 设备型号(例如 "iPhone")。推荐
optional string os = 10; // 操作系统(例如 "iOS")。推荐
optional string osv = 11; // 操作系统版本(例如 "3.1.2")。推荐
optional string hwv = 12; // 硬件版本(例如 iPhone 5S 的 "5S")。可选
optional int32 h = 13; // 屏幕高度(物理像素)。可选
optional int32 w = 14; // 屏幕宽度(物理像素)。可选
optional int32 ppi = 15; // 像素密度(Pixels per inch)。可选
optional double px_ratio = 16; // 像素比例,物理像素与设备无关的像素的比率。(设备像素/CSS像素)。可选
optional int32 orientation = 17; // 屏幕方向,1=横屏,2=竖屏。默认竖屏
optional int32 js = 18; // 是否支持JavaScript,0 表示不支持,1 表示支持。可选
optional int32 geo_fetch = 19; // 运行在广告位中的JavaScript代码是否可以使用地理位置API,0 表示不可以,1 表示可以。js==1时可选
optional string flash_ver = 20; // 浏览器支持的Flash版本。可选
optional string language = 21; // 浏览器语言,使用 ISO-639-1-alpha-2 标准。可选
optional string carrier = 22; // 运营商或ISP(例如 "VERIZON")。应使用交易所维护的、事先向买方公布的字符串名称。可选
optional string mcc_mnc = 23; // 移动运营商,格式为 MCC-MNC 拼接码(例如 "310-005" 代表美国Verizon Wireless CDMA)。MCC和MNC之间必须有破折号以消除歧义。可选
optional int32 connection_type = 24; // 网络连接类型。1=有线网络/2=WiFi/3=2G/4=3G/5=4G/6=5G。推荐
optional string ifa = 25; // 经过授权,可供广告主明文使用的ID(即未经哈希处理,苹果IDFA/海外安卓GAID/国内安卓OAID)。推荐
optional string did = 26; // 硬件设备ID(IMEI)。推荐
optional string did_sha1 = 27; // 硬件设备ID(IMEI),经过SHA1哈希处理。推荐
optional string did_md5 = 28; // 硬件设备ID(IMEI),经过MD5哈希处理。推荐
optional string dpid = 29; // 平台设备ID(例如Android ID)。推荐
optional string dpid_sha1 = 30; // 平台设备ID(例如Android ID),经过SHA1哈希处理。推荐
optional string dpid_md5 = 31; // 平台设备ID(例如Android ID),经过MD5哈希处理。推荐
optional string mac = 32; // 设备MAC地址。推荐
optional string mac_sha1 = 33; // 设备MAC地址,经过SHA1哈希处理。推荐
optional string mac_md5 = 34; // 设备MAC地址,经过MD5哈希处理。推荐
optional string os_boot_time = 35; // 系统启动时间,秒级时间戳,示例:1665369347。可选,IOS 14+必填
optional string os_update_time = 36; // 系统最近一次更新时间,秒级时间戳小数点后保留6位,示例:1620542856.785738。可选,IOS 14+必填
optional string os_birth_time = 37; // 设备初始化时间,示例:1647545718.125795458。可选,IOS 14+必填
optional string name_md5 = 38; // 设备名称,经过MD5哈希处理。可选,IOS 14+必填
optional string memory_size = 39; // 手机内存大小,单位KB; 例如:3955589120。可选,IOS 14+必填
optional string disk_size = 40; // 手机容量大小,单位KB; 例如:63900340224。可选,IOS 14+必填
optional string model_code = 41; // 设备型号码,例如:D22AP。可选,IOS 14+必填
optional string time_zone = 42; // 设备时区,例如:Asia/Shanghai。可选,IOS 14+必填
optional DeviceExt ext = 43; // 扩展字段
}
// 地理位置
message Geo {
optional double lat = 1; // 纬度
optional double lon = 2; // 经度
optional int32 type = 3; // 定位类型:1=GPS/2=IP/3=用户提供
optional int32 accuracy = 4; // 精度(米)
optional string country = 5; // 国家代码(ISO 3166-1 alpha-2)
optional string region = 6; // 省份/州代码(ISO 3166-2)
optional string metro = 7; // 大都市区代码(Nielsen)
optional string city = 8; // 城市名称
optional string zip = 9; // 邮政编码
optional int32 utc_offset = 10; // UTC偏移量(分钟)
}
// 用户信息
message User {
optional string id = 1; // 用户唯一ID
optional int32 yob = 3; // 出生年份
optional string gender = 4; // 性别:M=男/F=女/O=其他
optional string keywords = 5; // 用户兴趣关键词
}
// 请求顶层扩展
message ReqExt {
optional string version = 1; // API版本
optional string ver_sdk = 2; // SDK版本
repeated string installed_app = 4; // 安装的应用列表(例如["com.tencent.mm","com.qiyi.video"])
}
// 广告位扩展(用于非标样式)
message ImpExt {
}
// 设备信息扩展
message DeviceExt{
optional string boot_mark = 1; // 阿里预算反作弊字段,阿里预算必填
optional string update_mark = 2; // 阿里预算反作弊字段,阿里预算必填
optional string ver_code_hms = 10; // 华为设备HMS版本号,华为设备必填
optional string ver_code_ag = 11; // 华为设备AG版本号,华为设备必填
optional string ver_rom = 20; // 设备rom版本号,vivo、oppo预算必填
}
// ==================== 请求响应结构体 ====================
// AdxRequest 请求结构体
message AdxRequest {
string version = 1; // 协议版本
string uuid = 2; // 广告位ID
int64 timestamp = 3; // 请求时间戳(毫秒)
string signature = 4; // 请求签名
string nonce = 5; // 随机数
string data = 6; // 入参数据
}2.2.2 BidResponse 消息定义
syntax = "proto3";
package ujuadxapi;
option go_package = "./ujuadxapi;ujuadxapi";
// ==================== 响应结构体 ====================
// AdxResponse 响应结构体
message AdxResponse {
optional string version = 1; // 协议版本
optional string trace_id = 2; // 响应时间戳(毫秒)
optional int64 timestamp = 3; // 响应时间戳(毫秒)
optional uint32 lengthy = 4; // 耗时(毫秒)
optional uint32 code = 5; // 响应码
optional string message = 6; // 响应消息
BidResponse data = 7; // 竞价响应
}
// 竞价响应
message BidResponse {
string id = 1; // 请求ID
optional string bidid = 2; // DSP 生成的竞价ID
repeated SeatBid seatbid = 3; // 席位出价列表
optional string adx_ext = 4; // adx上报扩展
optional Ext ext = 5; // 扩展字段
}
// 席位出价
message SeatBid {
optional string seat = 1; // DSP标识或媒体席位名
repeated Bid bid = 2; // 出价列表
}
// 单个出价
message Bid {
string id = 1; // 出价唯一ID
double price = 3; // 出价价格(CPM)元
string currency = 4; // 币种
repeated string adomain = 5; // 广告主域名
optional string cid = 6; // 广告系列ID
optional string crid = 7; // 素材ID
string adm = 8; // 广告物料(HTML/XML/JSON字符串)
optional string nurl = 9; // 胜出通知URL
optional string lurl = 10; // 竞败
optional BidExt ext = 11; // 出价扩展
}
// 出价扩展(核心扩展字段)
message BidExt {
string title = 1; // 标题
string desc = 2; // 描述
string icon = 3; // 广告图标
int32 ad_type = 4; // 广告样式:1-native,2-rewarded_video,3-banner,4-interstitial,5-splash,6-视频流
int32 ad_style = 5; // 广告展示样式:1-文字链,2-图片,3-视频,4-html代码,5-视频+图片(原生视频贴片),6-一图一文,7-三图一文
int32 interaction_type = 6; // 交互类型:1-使用浏览器打开,2-下载应用,4-小程序
repeated Material materials = 7; // 物料集合(图片、视频等)
optional DeeplinkSet deeplinks = 8; // 深度链接集合(多级降级)
repeated EventTracker events = 9; // 上报事件集合
optional Interaction interaction = 10; // 交互配置(摇一摇、滑动等)
optional Interstitial interstitial = 11; // 插屏专用参数
optional Reward reward = 12; // 激励视频奖励参数
optional Splash splash = 13; // 开屏专用参数
repeated NativeAsset native_assets = 14; // 原生信息流组件列表
optional NativeLink native_link = 15; // 原生广告链接
repeated int32 api_supported = 16; // 支持的MRAID版本
string source = 17;
}
// 物料定义
message Material {
string id = 1; // 物料唯一ID
int32 type = 2; // 1=图片,2=视频,3=HTML
string url = 3; // 物料地址
optional int32 width = 4; // 宽度(像素)
optional int32 height = 5; // 高度(像素)
optional int32 duration = 6; // 视频时长(秒)
optional string mime = 7; // MIME类型
}
// 深度链接集合
message DeeplinkSet {
optional string scheme = 1; // 自定义URL Scheme
optional string universal_link = 2; // iOS Universal Link
optional string fallback_url = 3; // 降级H5落地页
optional string download_url = 4; // 应用商店下载地址
optional string quick_app_url = 5; // 快应用地址
}
// 事件上报配置
message EventTracker {
string type = 1; // impression/click/video_start/video_complete/close/track
repeated string urls = 2; // 上报URL列表
optional string method = 3; // GET/POST/IMAGE
}
// 交互配置
message Interaction {
string type = 1; // shake/slide/click_anywhere/long_press
map<string, double> threshold = 2; // 触发阈值,如 {"accelerometer":2.5}
optional string alert = 3; // 提示文案
optional InteractionFeedback feedback = 4; // 反馈配置
}
// 交互反馈
message InteractionFeedback {
optional bool haptic = 1; // 是否震动
optional string sound = 2; // 反馈音效URL
}
// ==================== 以下结构体兼容1.2的,新版逐渐废弃 ====================
// 插屏专用参数
message Interstitial {
bool fullscreen = 1; // 是否全屏
optional int32 close_button_delay = 2; // 关闭按钮延迟秒数
optional string close_button_position = 3; // 按钮位置
optional int32 skip_seconds = 4; // 可跳过时长
}
// 激励视频奖励
message Reward {
int32 amount = 1; // 奖励数量
string type = 2; // 奖励类型
optional string description = 3; // 奖励描述
}
// 开屏专用参数
message Splash {
optional int32 skip_seconds = 1; // 可跳过时长
optional bool countdown = 2; // 是否显示倒计时
optional bool logo_visible = 3; // 是否展示Logo
optional double click_area_rate = 4; // 可点击区域占比
optional string skip_position = 5; // 跳过按钮位置
}
// 原生信息流组件(OpenRTB Native 1.2风格)
message NativeAsset {
int32 id = 1; // 组件ID
optional bool required = 2; // 是否必须展示
optional NativeTitle title = 3;
optional NativeImage img = 4;
optional NativeData data = 5;
optional NativeVideo video = 6;
}
message NativeTitle {
string text = 1;
}
message NativeImage {
string url = 1;
optional int32 width = 2;
optional int32 height = 3;
}
message NativeData {
int32 type = 1; // 数据类型码
string value = 2; // 数据内容
}
message NativeVideo {
string vasttag = 1; // VAST标签
}
message NativeLink {
string url = 1; // 落地页URL
repeated string clicktrackers = 2; // 点击监测URL
optional string fallback_url = 3; // 降级URL
}
// 顶层扩展
message Ext {
optional string request_id = 1; // 内部请求追踪ID
optional string encryption = 2; // 加密方式
map<string, string> debug = 3; // 调试信息
}3. 加密与签名
3.1 加密流程
构建请求对象参数 - version:"3.3.0" - uuid:广告位 ID - timestamp:当前 Unix 毫秒时间戳 - signature:HMAC-SHA256 签名值 - nonce:随机字符串,每次请求唯一,长度为 24 字符 - data:AES-256-GCM 加密后的 BidRequest JSON 字符串。
// 1. 生成 24位随机字符串 nonce,注意特殊字符不能包含在 nonce 中
nonce := GenerateNonce(24)
timestamp := time.Now().UnixMilli()
version := "1.0"
// 2. 序列化业务数据
plainJSON, err := MessageToJsonByte(msg)
if err != nil {
return nil, err
}
// 3. 派生 AES 密钥并加密
aesKey := DeriveKey(nonce, sk)
dataEnc, err := AesEncrypt(plainJSON, aesKey)
if err != nil {
return nil, err
}
// 4. 构造待签名字符串:Version+Uuid+Timestamp+Nonce+Data
signPlain := fmt.Sprintf("%s%s%d%s%s", version, uuid, timestamp, nonce, dataEnc)
// 5. HMAC 签名
signature := hmacSign(signPlain, sk)
// 6. 构建 AdxRequest 结构体
adxRequest := AdxRequest{
Version: version,
Uuid: uuid,
Timestamp: timestamp,
Nonce: nonce,
Data: dataEnc,
Signature: signature,
}3.2 涉及的方法 Go 示例
import (
"crypto/rand"
"crypto/hmac"
"crypto/cipher"
"crypto/sha256"
"encoding/base64"
"golang.org/x/crypto/hkdf"
"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/proto"
)
func GenerateNonce(length int) string {
b := make([]byte, length)
rand.Read(b)
return base64.RawURLEncoding.EncodeToString(b)
}
// MessageToJsonByte Protobuf 数据解析为 JSON字符串字节码
func MessageToJsonByte(msg proto.Message) ([]byte, error) {
marshal, err := protojson.Marshal(msg)
if err != nil {
return nil, err
}
return marshal, nil
}
// DeriveKey 加密密钥使用密钥 SK 与 nonce 共同派生
func DeriveKey(nonce string, sk []byte) []byte {
hkdfReader := hkdf.New(sha256.New, sk, []byte(nonce), []byte("aes-key"))
key := make([]byte, 32)
_, _ = io.ReadFull(hkdfReader, key)
return key
}
// AesEncrypt AES-256-GCM 加密
func AesEncrypt(plaintext []byte, key []byte) (string, error) {
block, err := aes.NewCipher(key)
if err != nil {
return "", err
}
gcm, err := cipher.NewGCM(block)
if err != nil {
return "", err
}
nonce := make([]byte, gcm.NonceSize())
if _, err := rand.Read(nonce); err != nil {
return "", err
}
ciphertext := gcm.Seal(nonce, nonce, plaintext, nil)
return base64.URLEncoding.EncodeToString(ciphertext), nil
}
// hmacSign HMAC-SHA256 签名
func hmacSign(message string, secret []byte) string {
h := hmac.New(sha256.New, secret)
h.Write([]byte(message))
return base64.URLEncoding.EncodeToString(h.Sum(nil))
}4. 竞价请求 示例
4.1 外层结构:AdxRequest(明文 JSON)
{
"version": "3.3.0",
"uuid": "test_placement_001",
"timestamp": 1748073600123,
"signature": "abc123...URL-safe-base64...",
"nonce": "aBcDeFgHiJkLmNoPqRsTuVwx",
"data": "eyJpZCI6InJlcV8yMDI2...URL-safe-base64..."
}4.2 HTTP 说明
Accept-Encoding必须要支持gzip,否则会产生乱码错误。 Content-Type必须是application/json; charset=utf-8,否则无法正常交互并可能产生乱码错误。
POST /api/v1/bid HTTP/1.1
Host: api.ujuadx.com
Content-Type: application/json; charset=utf-8
Accept: application/json
Accept-Encoding: gzip, deflate, br
{
"version": "3.3.0",
"uuid": "test_placement_001",
"timestamp": 1748073600123,
"signature": "abc123def456...",
"nonce": "aBcDeFgHiJkLmNoPqRsTuVwx",
"data": "eyJpZC..."
}4.3 完整 BidRequest 安卓开屏 示例
以下是一个可直接使用的完整 BidRequest JSON:
{
"id": "xiaomi_req_20260507_101",
"imp": [
{
"id": "splash_imp_xiaomi_01",
"slot_attribute": {
"width": 1080,
"height": 2400
},
"bidfloor": 1
}
],
"app": {
"name": "未来计算器",
"bundle": "com.wl_yuan.futuecalc",
"ver": "2.15.30"
},
"device": {
"ua": "Mozilla/5.0 (Linux; Android 14; 240109PC Build/UKQ1.240829.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/120.0.6099.144 Mobile Safari/537.36",
"geo": {
"lat": 39.9152,
"lon": 116.4039,
"type": 1,
"accuracy": 20,
"country": "CN",
"region": "BEIJING",
"city": "BEIJING",
"zip": "100000",
"utcOffset": 480
},
"dnt": 0,
"lmt": 0,
"ip": "183.14.132.117",
"ipv6": "240e:390:3a0:1230:8c0:8fff:fe3a:4b2e",
"deviceType": 1,
"make": "Xiaomi",
"model": "240109PC",
"os": "Android",
"osv": "14",
"hwv": "qcom",
"h": 1080,
"w": 2400,
"ppi": 440,
"pxRatio": 3.0,
"orientation": 1,
"js": 1,
"geoFetch": 1,
"flashVer": "",
"language": "zh-CN",
"carrier": "中国电信",
"mccMnc": "46003",
"connectionType": 2,
"ifa": "8956cecef52c936a",
"did": "",
"didSha1": "",
"didMd5": "e8b2a3b2e1c2d3e4f5a6b7c8d9e0f1a2",
"dpid": "f8e4d9c0ab123456",
"dpidSha1": "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12",
"dpidMd5": "5d41402abc4b2a76b9719d911017c592",
"mac": "B4:5D:50:12:34:AB",
"macSha1": "3f786850e387550fdab836ed7e6dc881de23001e",
"macMd5": "7a68a4c5e3f12d8b0e5c67a9123b4f56",
"osBootTime": "1702051200",
"osUpdateTime": "1713123456.785738",
"osBirthTime": "1689123456.125795",
"nameMd5": "d8578edf8458ce06fbc5bb76a58c5ca4",
"memorySize": "12582912",
"diskSize": "536870912",
"modelCode": "240109PC",
"timeZone": "Asia/Shanghai",
"ext": {
"bootMark": "a1b2c3d4e5f6",
"updateMark": "f6e5d4c3b2a1",
"verCodeHms": "",
"verCodeAg": "",
"verRom": "2304FPN6DG-2.0.1.0.KLBCNXM"
}
},
"user": {
"id": "mi_user_9f3b4c51d2",
"yob": 1992,
"gender": "F",
"keywords": "购物,游戏,音乐"
},
"ext": {
"version": "3.3.0",
"verSdk": "1.1.0.210",
"installedApp": ["1","2","3"]
}
}5. 竞价响应
5.1 外层结构:AdxResponse
服务端返回的 JSON 格式响应:
{
"version": "3.3.0",
"trace_id": "trace_abc123def456",
"timestamp": 1748073600445,
"lengthy": 45,
"code": 0,
"message": "success",
"data": { ... }
}字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
version | string | 协议版本,如 "3.3.0" |
trace_id | string | 关键:请求追踪 ID,报错时提供此值可大幅缩短排查时间 |
timestamp | int64 | 服务端响应时的毫秒时间戳 |
lengthy | uint32 | 全链路耗时(毫秒),可用于监控延迟 |
code | uint32 | 业务状态码:0=成功 |
message | string | 状态描述 |
data | BidResponse | 竞价响应数据;无竞价时无返回 |
5.2 出价扩展:BidExt(核心渲染数据)
这是最重要的结构,包含了渲染广告所需的所有信息:
// BidExt — 出价扩展字段(核心!包含所有渲染所需信息)
// 来源: ujuadxapi_response.proto
message BidExt {
// === 基本信息 ===
string title = 1; // 广告标题,如 "限时特惠!新品上市"
string desc = 2; // 广告描述,如 "点击了解更多优惠详情"
string icon = 3; // 广告图标 URL
// === 广告类型与样式(决定如何渲染)===
int32 ad_type = 4; // ★ 广告类型:
// 1 = 原生信息流(Native)
// 2 = 激励视频(Rewarded Video)
// 3 = 横幅(Banner)
// 4 = 插屏(Interstitial)
// 5 = 开屏(Splash)
// 6 = 视频流(Instream Video)
int32 ad_style = 5; // ★ 展示样式:
// 1 = 文字链
// 2 = 图片
// 3 = 视频
// 4 = HTML代码
// 5 = 视频+图片(原生视频贴片)
// 6 = 一图一文
// 7 = 三图一文
int32 interaction_type = 6; // 交互类型:
// 1 = 使用浏览器打开
// 2 = 下载应用
// 4 = 小程序
// === 物料集合(图片/视频/HTML)===
repeated Material materials = 7; // ★ 广告素材列表
// === 深度链接(点击行为)===
DeeplinkSet deeplinks = 8; // 多级降级链接
// === 事件追踪(手动触发上报的核心!)===
repeated EventTracker events = 9; // ★★★ 事件上报配置列表
// === 各广告类型的专用参数 ===
Interstitial interstitial = 10; // 插屏专用(关闭按钮延迟等)
Reward reward = 11; // 激励视频专用(奖励信息)
Splash splash = 12; // 开屏专用(倒计时、Logo 等)
// === 原生广告专用 ===
repeated NativeAsset native_assets = 13; // 原生组件列表
NativeLink native_link = 14; // 原生广告链接
// === 其他 ===
Interaction interaction = 15; // 交互配置(摇一摇/滑动等)
repeated int32 api_supported = 16; // 支持的 MRAID 版本列表
string source = 17; // 来源标识
}Material 物料
// Material — 广告素材
// 来源: ujuadxapi_response.proto
message Material {
string id = 1; // 物料唯一ID
int32 type = 2; // 物料类型:1=图片, 2=视频, 3=HTML
string url = 3; // ★ 物料下载/显示 URL
optional int32 width = 4; // 宽度(像素)
optional int32 height = 5; // 高度(像素)
optional double duration = 6; // 视频时长(秒,仅 type=2 时有值)
optional string mime = 7; // MIME 类型,如 "image/jpeg"、"video/mp4"
}EventTracker 事件追踪
// EventTracker — 事件追踪配置
// 来源: ujuadxapi_response.proto
message EventTracker {
string type = 1; // ★ 事件类型(见下方枚举表)
repeated string urls = 2; // ★ 需要上报的 URL 列表(可能有多个)
optional string method = 3; // 上报方式:"GET" / "POST" / "IMAGE"
}支持的 event.type:
| type | 含义 | 触发时机 | 适用广告类型 |
|---|---|---|---|
impression | 曝光 | 广告成功展示时 | 所有类型 |
click | 点击 | 用户点击广告时 | 所有类型 |
video_start | 视频开始 | 视频开始播放时 | 类型 2/6 |
video_complete | 视频完成 | 视频播放完毕时 | 类型 2/6 |
close | 关闭 | 用户关闭广告时 | 类型 2/4/5 |
track | 自定义追踪 | 其他自定义事件 | 按需 |
DeeplinkSet 深度链接
// DeeplinkSet — 多级降级深度链接
// 来源: ujuadxapi_response.proto
message DeeplinkSet {
optional string scheme = 1; // 自定义 URL Scheme(如 "myapp://")
optional string universal_link = 2; // iOS Universal Link
optional string fallback_url = 3; // 降级 H5 落地页
optional string download_url = 4; // 应用商店下载地址
optional string quick_app_url = 5; // 快应用地址
}各类型专用参数
// Interstitial — 插屏广告专用参数
message Interstitial {
bool fullscreen = 1; // 是否全屏
optional double close_button_delay = 2; // 关闭按钮延迟(秒)
optional string close_button_position = 3; // 关闭按钮位置
optional double skip_seconds = 4; // 可跳过时长(秒)
}
// Reward — 激励视频奖励信息
message Reward {
double amount = 1; // 奖励数量
string type = 2; // 奖励类型(金币/道具/生命等)
optional string description = 3; // 奖励描述文本
}
// Splash — 开屏广告专用参数
message Splash {
optional double skip_seconds = 1; // 可跳过时长
optional bool countdown = 2; // 是否显示倒计时
optional bool logo_visible = 3; // 是否展示 Logo
optional double click_area_rate = 4; // 可点击区域占比(0~1)
optional string skip_position = 5; // 跳过按钮位置
}
// Interaction — 交互配置(摇一摇/滑动等)
message Interaction {
string type = 1; // 交互类型:shake/slide/click_anywhere/long_press
map<string, double> threshold = 2; // 触发阈值,如 {"accelerometer":2.5}
optional string alert = 3; // 提示文案
InteractionFeedback feedback = 4; // 反馈配置
}
// InteractionFeedback — 交互反馈
message InteractionFeedback {
optional bool haptic = 1; // 是否震动
optional string sound = 2; // 反馈音效URL
}
// NativeAsset — 原生广告组件
message NativeAsset {
int32 id = 1; // 组件ID:1=标题, 2=图片, 3=数据, 4=视频
optional bool required = 2; // 是否必须展示
NativeTitle title = 3; // 标题内容
NativeImage img = 4; // 图片
NativeData data = 5; // 数据
NativeVideo video = 6; // 视频
}
// NativeTitle — 原生组件:标题
message NativeTitle { string text = 1; }
// NativeImage — 原生组件:图片
message NativeImage {
string url = 1;
optional int32 width = 2;
optional int32 height = 3;
}
// NativeData — 原生组件:数据
message NativeData { int32 type = 1; string value = 2; }
// NativeVideo — 原生组件:视频
message NativeVideo { string vasttag = 1; }
// NativeLink — 原生广告链接
message NativeLink {
string url = 1; // 落地页 URL
repeated string clicktrackers = 2; // 点击监测 URL
optional string fallback_url = 3; // 降级 URL
}
// Ext — 顶层扩展字段
message Ext {
optional string request_id = 1; // 内部请求追踪ID
optional string encryption = 2; // 加密方式
map<string, string> debug = 3; // 调试信息
}5.5 完整响应示例
有竞价响应:
{
"version": "5.3.8",
"trace_id": "t-1779959917741-000-00000",
"timestamp": "1779959917855",
"lengthy": 0,
"code": 0,
"message": "成功",
"data": {
"seatbid": [
{
"bid": [
{
"adomain": [],
"id": "splash_imp_xiaomi_01",
"price": 107.69,
"currency": "CNY",
"adm": "",
"cid": "5fc103ee5255c43bdca4c5d888826f72",
"nurl": "http://localhost:30040/event?ext=bG1LHRxCAvd_pmNiLwtdDeXB2NCbQ5xr7aZ-451BLI49ofMZfDpGJCc1ZgnjirS-mFrsEqrUbGRortG1gAH8t3IWCz_Vkq6g6XM_LVtrGXR8M0TZFCAhpa7pl2aLCSfklxZFojuOFuzYzv_I2qH62fv7PmxoCLrpcQ6JjUzJe_2RWFq8QT15EVyNQjLLCV9tS11DS63g0YcC34S0gFOWwxZFrxfrDdSmbGl0t3jyB-Q5vZuk9uDGBViR-BIejwqOT__dbB6vtZ41ZDajiUZSEZH0SmwbFmLOQBS81teneyVtace0pWKy6deBUuiaWl_4RRHiEaOESn7ryvHjfogw2G23o4cpujxUGKf2fNjnOdKAcXS6-TIOevD2mUpIgA5A2gLsTAlobacEFhzHYnG9HMSV-Z_Gr-5ETQqzjjDk1Ku-poz47o4VviJB5K5ODvMxI6_MX63t8X96dIONuDMz2Kx271eR01l9HXLJ1aUxa4KmvcDm8jfWkEwhMnhYcKAKf2ui6n6zQtFKrHYzoxeTtgNsZxcCwdK2WiVd-XxkJQxdZzOvJXzde1ddMbMWR0P8tlmpXw3IQXjNw96mk91S8kij-XB6_cgmY3IZ5gxnmhH1TTNMYP5jag7rxJ3My4SZZgQ9LsJm2x31UyyQtsI23d8lJtlAaGHWOIqSIZ7UiWxKdDZgq9XgbVZ4ome22fJq3XvHQ4tMUh4MJu8-BAXriqkyCQ7CXp96ABWF2XW1Jjx4g3Kv5Ert6mV0byNclZ39kdosJxmq1eYIKwY3MiHMbZqShvbFFwIuGJxlmAF6zqL8i0s1yKGLE9ebofeMCjeWR8FF2cJRTffIhNvmfBpgxAR15MxqRto2n2Op6z3LqjDnI8SlzkmVYzyPCiebvvZSStBAOdftBLvYhi2RhQU0timF1Vy_dPBvUaztx6w8efjJK370ALnjmvAjOCB_t1bBvWsnjMNOvmKaYs9gK3IIBqhDLILieYzLINIgAfDCIkwTEV_v-kpRJ0pRdT1siYujiTxiAgNH5e3-kjbZ9RnG-B5-zWN3N6JrzELJtvNieKneuNgPbJQtWi0M9ZhJ6cXOEhLtkGHWL1rN55-x0zTU5Kg5xxdUhbUm8wk7govjTq6AFIHFyDfAFPhm0NztBkR0JPN6iS1bGRhADHki1xFmfgubM_1OfuS_4tuXDGAKyQTYwkHz5-CikEhPAJwY_YhWGEWlAhZhK_xCVltXbaqEZyGn1QG8NjhK158zz-0_bFhPHwO2NEctDvpnMb-tKxBhkkbCdMaMH16QJrHczegX9ZU78kazPg63-jqRofq8JxcO4YaksopIhQcD1Z_QYIO2TST5HDXsSJ0xtfdZSPG41DodSR1QIQTQJf7iEZMRfAVYfzzlD21tp5MbWhuExkPTYM0GfnzeDN7HHlOW4Fk4Uq3R37sutHWwIdfUU87_HiLw&t_id=t-1779959917741-000-00000&type=win",
"lurl": "http://localhost:30040/event?ext=qxI-CHJIApj4gTRt22y0_nPtHNqptahex4ZWVpzxnWiXtSN0AC36MrJ6MvRO8f0M1d5cizGSKnbGE0O5GkTdFxE5UcamwL47aKqq9xZv8mgNB1hjsBb0uA6IbFIp0j9dDjKYCXb143YIftlc6KCdhQhLS4WLNXyOBW-oK-wI2FGo03bKvvHtAFWxNvuHx1snDIeFiFq-v2P1_ENNCPfXd2w_yKXU7oscFrVc5m4KrwKFEMmi7ZN7pApybnqswkvX71mkEBFImk3EokarByfhlrDrU3sAMGMzifCja5QqggWinNV3DjalfA8leGrgm0lCHP4GOPI9LIbLLQsA-PUXLARD13Yvegon6mcxJQvpzCeMF4yhAL9xRzwzPPhk6PNvgwFt-B2y636UrnmYIzXkIFwnE2P4sxajjT-aPzEGgMzxChkJQaaiLHdTQWCDzljeddla4xXllMfuG2fTUKXrI7HWYV1tfXw5tVPtN7CI27-l-GxeznpeP-AsrhmsIhj6JkW6TiVg_tY5-Dz5iwj_ignVfItQ9yaEbqIkfVIvpxdWU__zbhb-jaZABjVEMqSwRiDsF12G-HcW8CqLnK3RwHgaFSZp_wqS6fbX7shfhbPEvaQH_tbcOOipIn0OlVy3RdiFRkrk2uOIfBsVcIpQcCdWGYXo90XRCorKacXn_rLxQAw9GQ-kcnLLBpvaw-ggEMh_YMBhfY-nJukKwIxkdHtpDRj1ahxOJb_GmFtcJ6JTHb40C6RFwtNkqxlJVmx4WOlaXnhAhS4ri1U7ZADSn8FQjMVlpZPK7b4WGhsiFFwHQIhFsxLB12HZ_bhsSTqPvbSf3eZjZkuwzqzKH-5kQ8SXEeB9GPsMwDfAgg9CWP0GoKpXp1qPINJC60XV8PpfXxJt3_0I6am32v_2-4RuX-0G9okUmeyDsfHy0Pl4oykTKyOCynhSZU589sMgO54grtXC7-sT3yUP9Es4pnjY1LbHXSTOwune9OM9jM7GA6eHlUigFUtc7X-6tUKzu7F5tkJ-q884Ipug2FA6u4V9CbNAPV0RfPBdVXOMKFTMfosBe9cbeJGofo4b4LxdodxtlN_6UanHn0rZO_y1LrZkkd-AqddpZhz5OO3gIOdACMCb0h9Cuj8Boyw8VEL9x6fwokPwP3DUERZGHYZCEiEwse4xUB8Q-9uByB1pdhMsfeKeoQLNWIsp8PRUTgGkQ3VoUODWQkgJ9CQHXOh4cMB1Xi0VPme1Yo7TB00mKVwUTvIqbDzQ3uymVG6Runm_387j8OuYcjWH0CY0Izn6JAdRlvJlAtvc7iWu5EfMUczmAX-viHxWlyh4_6wMTTROOtPC5c2U-WDnqFwEGUSQGP2MZLXEQiByBeoB2gjzbXwjDbSlw2nj0_eDjDVRhDsLhT6LnvJdKWyxDKYjwtIUIiWN51hNc8w8SirHp5VfVA&t_id=t-1779959917741-000-00000&type=loss&loss_code=__LOSS_CODE__",
"ext": {
"materials": [
{
"id": "video_0",
"type": 2,
"url": "https://static.66mobi.com/creativeAudit/10084/720*1440/607bf5a57638448dbc365d49683d54e0.mp4",
"width": 1080,
"height": 1920,
"duration": 5,
"mime": "video/mp4"
},
{
"id": "video_pre_img",
"type": 1,
"url": "https://static.66mobi.com/qualification/6413a233c9ba498e8253634790ff7c1e.jpg",
"width": 1080,
"height": 1920
},
{
"id": "video_end_img",
"type": 1,
"url": "https://static.66mobi.com/qualification/6413a233c9ba498e8253634790ff7c1e.jpg",
"width": 1080,
"height": 1920
}
],
"events": [
{
"urls": [
"http://localhost:30040/event?ext=d6aUzLAHR_p1EHon8WfV4QFPClYa6DtKuF0hoS8hIkWC7vesGQfxy-ytsUEXs3jhNDZkjiLRO_L1ErwdgacFib_a3to1KI1oGAYa0QmW7iWDgbO7YuTCzt9XpnJm0Us9-QUNF6SVlGjc0muNMdSgy8XXi5zjbS9Nu-wYhdDXBkp5uNoUxLoixvS4osD4CI4MeyDYz5baefjXgq09nStL_oBt8BZBWe77vWaW7Ox856tCPyJwMkh1bTVW-iKsyTQj_c3aipuYTsuGm2vhIOo274jTbS22bc5lbjGIDTwW0AjTUgSAVbCBSOdb_l5Zdc4l3HfbR_8dkk7elGy5JtV0P8pXgap0LZ7_PIM-C8NE1xgVCL__ZtzYfuvNa4F-SxSACx6oeMy8_URgeyJiosmvHNqAvcxLkzmW2SO3npW566T307E3CzugTjV0ggziDlDlK2CF8IVzMX9ifVNt8bqRaSqZIQjZ5VZHY_XT0y47D3SqVvSOj8Ax1qO_9W6weCu_sk6tNuiQVTOxcIa0jf-FWQueKU7bCeZY8Y7rcFURgfSG41RVT_rq_e72VGY_HHeLhujJ61ZjrLFA0nnbSZdMC37hw7JkGvlm5wszmhWYuG7uhKIdYOR5JPrKPbPmck3Cglt3qcsvQeShjsM87bTKWcQZQMysTe__bWvIm5ReTWZEMNsEAjKmEzXxHjNLl1QytRegV54SWdOZVEB2_XRobtFqnrHStw2lUFAdfQCjoSrSfJFWTprCQ0isk3850E8hawgSDqF1v30JyawwQhq_lj199r_jbnKehPLywdhblRJd7RX_NuSFRwG8ku0e2zPjl66NsVThbxrTft2zx1xlGjg5aQePkGUL53gXvt4A0Jv0n85dX9EnajoM3r6Q7XxbN4l1sTa2k7wNvkdtGkdMbPM27mbZMSpwN4OCa6dVxlbVJc4dWW30vvrlWwqIbFcYCORqF80Rj9_3cioI6vAOqF7C1jX-2xoGPUAUWbK3sDa1KnntlxxIyFL-U3SgGVrXigWKw9BESaes0U3-VYt66EQZOtn7nxV5ZIa22U-LR0OR1L5GS7fckeTODBruPS30JATfsp6BIb4XbXgqlGa09aF1UkWgrXYguc3YpiTo_49EghNLdOGyWUBST042hB_GBCpOhzFwzZ5O26T7avPcAIcC6JMwNuat4jQpu2VF1JtYXMO3CF3tA5aBNHSpqRQRbSYVMgdgNHgb_zZqncfTzRco1LNlqJ-x4sJbvBCzxIycJBwWkSXyP5k9Oc9GZIUxiJBFVfP_iO0gVqCaOEE-TSkGAAc9MkMdnKivaay66oSuxn6ClsOPOje8wNhTQPy2JDuDZaMVcxMu07-H3v4DF6myyxaHofLrzgYHfRYyydOdd-5FlEGfciS8C8XaNr9A_mWYaoZXrGX1tTHZXqBuNKJpTwd54cKkmRxxS37svmM7G-SKJxsfSsvR4XOQRtlrYIhThVC5kbmQ8oz6uxd4tL5zryqeImbpIne7eCwJi_Lk7gsnYcbufNUHdJzCztumkiiDGhU3aGn749QjOEJrh3__GA&t_id=t-1779959917741-000-00000&type=impression"
],
"type": "impression",
"method": "IMAGE"
},
{
"urls": [
"http://localhost:30040/event?ext=r4JxyA0jDcadfjXgW4PuLHjGQUQPMfc5Ts6ZZgKOnKkOwISZDEUt9BXcVly6y0WKAiUgpq4H2MmfwhSfOwhzZBqiFZdX2kN0FcJgHXGo71sPITJQ6qDV7lGMYL24ZawnHujUA1VWMylr_3YwMFnPUWDfc8EHv_6irGGfsd-y6_TnhLKMy4yzx6ncIbec_XCtSlCOCcC7PGkSUH-g4pSHlEDDcVZCjrvkbKbYak6svnZDqQ0kWZ1hPJHTu9etJagmxcx47tf6ra_1lyj-qDhNKjlv_NaOM5Apil1DWX0OrLieHqFr26HjualeDCoWEG94SgQ46iNKalAVH6e8QqByBe5FBmVLF2f5hR1gJxpNa2bqlEF70neJqEow9rj4LU8MEvqygaQ-D71wVt75FDg0ctViN7Vr_ROe6rhLGd8rr4XjrtzcdrdfTzAoC9TwOEYgcALDwt4BPgOD9yvtL-DCfCpJlsyxMzVbr7m1h58iRzplTfeAhQ3n3ou7m8rZorqWgW66Xd06fH6C0lc05EBNBAhcLSccGZ1TpiNx7j1D7p6H2qT_f-JNziVch8LY9ha3ysoFF4t6pbj9HAg-up1n5WxQ4vJcMhwTjTeTZFj1awNQGboelqYJysSANxnaocrfN0B0878lJ9hACKULeBUUeileBWPqGR9KUO8BVtmkx6nYaPdgIH13jnOuFTmI9o3yzJzTqPcuWI5h1Tk7hnd-pQziOMF7NqYsR-tPUCWuKwErQoC_XvpG770YMTzameNReF6pgRLXmOeaOPGd-CXE-9N1ip-5eT-0V67RzdZ2k5-03XWpyhDWgxmVvZtp1fBNCo7FkzLepPKMSuYwVJSuTZhVvCQT5UvaCgRU4lW0jmpzIv_0tPhCX8lnGQcfdrtI0tvwnTHoNaqNGTR3ioMf9cB9P4xs3bcNfMCag2hn6j_G00Mq0su6DOroraLO4_567CQCLgXf0jX0LAxrD7y2JlewpIKtLwdy-jkxNUIL_sV_y1UnnB6zCvCinw3tPN9jCr7W6jkirWJY8OeaYsxTIKqo9BumW2YHr4awXuV7uMGtTfsa1e2_bKV1EKbLgcdyLAItpz6kd9q2lZnWE9yFKRtLw9qf05g68v4HRNiPM6HxNi2ByOPXKEJlA84izYhREe_6LWJ2_tq8ASLM4UC3tiuQJnNzcEphI6Lh_-k2VXIUJH5wFepEPjBPa-IGWQcfRU1w6qwfpDLgJ3S7ZcsE2tuq8VNHzAqhiirkMyD3IHHyqlPcNgv8A9BwIaUDGPYIPc3TxCYoASirG7dEg51VGUMLUeeVVjjE6RWWspHQWDpFlYH_r7lCHDsm7mIKACRd7IFPgRsbJAGO9Q93LYOTiHBgXnRY6YNluSgvecHEThIx1Iydg4oWwqptB9CvwLS0M38MHcuauUw3zXuAyh4nqRIOS6oBxHKQlbAN0w66vGxlokG8_VVU0DVo1Vbun0ACcv0AHmr0Rce5rIWQC-sDncbons9ofJMNK22BRTOxO6ho-8wiEY9waOXMk8L3B0GZM2vgAB-BuRKinjXN1jGrTanuynAJXhII9TYsbQ-1x2Dubyx2zSsg8dSdTGPF81zjZvx1tYkyBo9jzUoEI4kXn2g4JSLUFLoxpI7K8kdsTi1Mr0h0k1flJuS29yg6ZDs2UYq8HFDafAO4HcdgvJMZttPIgeGpQScCUEJPzIqgGAFMRN8YqHVoaPEsro_TT7rAlmqmD5lmPMuRTlnKVhplsjkGZ9CqhD19L31Lgzwz3qTY7HOxkhVsVEJsSnmqI2JD6O2MjQpCBSHNkNc2SfRYdJQW8ohFE_GcIaVT5O6Q&t_id=t-1779959917741-000-00000&type=click&down_x=__DOWN_X__&down_y=__DOWN_Y__&sc_down_x=__SC_DOWN_X__&sc_down_y=__SC_DOWN_Y__&sc_up_x=__SC_UP_X__&sc_up_y=__SC_UP_Y__&up_x=__UP_X__&up_y=__UP_Y__&utc_end_ts=__UTC_END_TS__&utc_ts=__UTC_TS__"
],
"type": "click",
"method": "GET"
},
{
"urls": [
"http://localhost:30040/event?ext=A9-zuGMmMDoV03X6tWsxeLeWNtSy0-LBGcEgznQ1vacIo-zyaK9bJBJ54i5GZ9QkxpQ97KwsfdvZtY33GxHsj6RFFsJkzpahy1dX1ksdK98J-o4-War98k4dYnlbDesSmc2tOBrEBkJmIBXlixzCyGhMh9Aum7Stq19iM4pnj0uoT_xr5e6nuGZXi2HtaKbyfRUDegkpvPTtcHgGUYccIHATlMl6dqCy9UFlI6lVqzwPbaHip7Y0bEl2IObXaqGOlOqdSgbAVjBehRVg0dQ9Qc5LRyWNe3e7FU2KMXVDy3FdPlOu8i2Tln9GujmUuzwXRzR9pQgJ0Or8LtDi-AYWZKWCSWRH0EzjRs4xpfd51NbwOcC30L3yPcy7zGMbdFcj5DKcsEdTXBqaA2VqEiC9_oWgSK71VsMCYfM5CaNIxNwpUVLxQocKzha1mKBKhpgd9apZNXDCLYY4FZPESpP63ZgdfR7Y3KcZoCKw1ZIyc81BccMiurUMKUVSztIKKoNsl8B_B1Fh0cVfJTr5oMFSGZb22py3JtCRABRo_puy-pwV8bM9083yWWcN3I0mMBVPGuqIK_5Z4r6suAf5x4Gh7ljOKSL2U3loMK7gEaYOnG4M9gcGWk16IxkhDjsmeqcFgrRHtxLKr3tsqHUShhJLx9RlAyHvqgs2bBN217y2InjdhbHlhuiu5uKp9jt2nSBo9dHnhiz34qzW77vknJqGtrhzHpi49cUCggYLzKWPCcZlB_AkrbeJEPa2ejLVfJdbM-1LZWN1fJvwOhLU0F-YNP9fDxCzpIiY99ekaTROIWXSaCVbY3GIzaXOLQyq3YtBViDEWRsK78TGObbIxRCbtPgNlhcT1FnGTg3xN4jCPG-IxALdZUzt2uEs_Ne53bD9wrsPcdfrjRXSLj3C0NuiY3k7M8ar2brb-TPUL9XGQQHKBbCLIYYrUmjdUzDPryiC1Osf3DAVjWjp3wuMmZxz51oFBLXraQsgl8hRoJaRwc5e1fIjrOsG-q8fDbx06uBt-JBb0EXbwRJ4Ty0Zvtxj5g899VSHYNn5sV05-VrXibWH27g-w6EzlfZbAdcUsqKqbBH8ysNDLYSiu3KC7b5Q_2Lo7A1FMqEGX-YMU0Sc_pflD2P3xldgiHMq6dtqHkmNFRkUunQp00BBqUmYDsvYbqi04GkewNIcmYUQem-1pgAZN5hrHkr7CHux1rgvQ3YNfaFaqUmEMQa2ymENnJLLTDPz9MD_Ot3ZwrR0NmpfTKMF1bZi_1cfmc6qSvaA5WUOZmZda_8Hb79Wwf4EE42KnbXsT4To-SqEEY8JbTWZ7M9Qyvew_KX5r0w49usLS93JtQ06l-uFSjM-y0amAGC0rlECE7-1-kuoedjYwjEr8PCoR33DyEAeb7JV-wXaAuzeoIupGGDXkI5FX0QiijqR_QObwprxp2JA58g_Vh-XuZCVzvWSEy8ITyOkfI4&t_id=t-1779959917741-000-00000&type=deeplink_success"
],
"type": "deeplink_success",
"method": "POST"
}
],
"native_assets": [],
"api_supported": [],
"title": "淘宝好逛,好物超值",
"desc": "全品类覆盖,超值好物随心逛",
"icon": "https://static.66mobi.com/qualification/098807d535af4c93aac2227a063d1524.png",
"ad_type": 5,
"ad_style": 5,
"interaction_type": 1,
"source": "淘宝",
"deeplinks": {
"scheme": "tbopen://m.taobao.com/tbopen/index.html?source=auto&action=ali.open.nav&module=h5&bootImage=0&spm=2014.ugdhh.2200803434164.226906-862795-32896&bc_fl_src=growth_dhh_2200803434164_226906-862795-32896&materialid=226906&h5Url=https%3A%2F%2Fstar-link.taobao.com%3Fslk_actid%3D100000000323%26spm%3D2014.ugdhh.2200803434164.226906-862795-32896%26bc_fl_src%3Dgrowth_dhh_2200803434164_226906-862795-32896%26activity_id%3D521012716",
"fallback_url": "https://tencent-ssp.66mobi.com/lpNotice.api?reqId=xiaomi_req_20260507_101&pid=48413866&v=I9M8fxEwCV52G9m5ykp5JEhKsYab5-MyUJNYMnGqrhwjhKgDStQyOAz63D_tnMuwmhd_4LyVNNdOMlKRrqkA_kQkgpo0Lwa42NcHWCKK3BQ4cLXdPwWkaf-32Rei8XPuwGkmRaffg68JyjIvR9AprGa2kfnL06i5niXx5Qwrd8WuvsUaIraoJKjf9C_B1cbqAO3R9XebWQROw7P48v8nS_HbzkZ0HplpgXd_KjBfWD1zIsXLP7bmuAJlSK2jetAZBRd8EIJQxNTIrRs8ywCr65IFA-AqFCwDjkgLAMgR44tTNbgKX7uoATARN9jZ-X3SCSbnJ_I3yaZfaKokwL479ROdFRMFHSLFbp5jYi5S0FosCm2y3UZE544DdK2SVvN2wrctg2MWMIit5qvhePAZYSddUFTE43iFXQbp3rI3J9GsqcvZkgtFS-fWPpPMY8Py0ymImlk_OI2aPLtfdbijO5kNzpbWEWguXib-e-39NAnHb4YcaFAdF1fdCPrz1KtaVA17Ynjw4Ox6JzpkhE3pKI0KsGwB7PFp5GVWKks4Xm4fgKWoz3mJt4YW8xZtqf_hzaMG1pTxenZe5cjUHRNQyI_dEpaLV3xKPh39qwco5fRQQkhcNxvyat92Q0omc1Ms3p79iCEogcZQVQDSQaoXn_krwtPzoT-ELlWSnglLR1y7dozGT08ofxmUvE5p_MX7XlHMjhiTdTTZq_xR1FNTpXPVPcdk6S83Fqt8wH2fNOGiCWFqZpdHFab8TXeqroy_Cgf0TWhNw8gTiRuknrCjqZUPsj-8RIPIzYgZjPwhYv3bc7NZhU5_ceCtucTTsPUaIUF3QyTXxJaMvVF0NzKWT_ZkejmD0jVfY7VNX1-FrQpTeZ8miE58VSB-DTN4w7EAF-tXCf_FOY6AsgWAZIRCUEcOAgtx-ZmC54SkN0cDicgN5jxKM2k5pxpmFlFbhGomWtuRTtKnGauFJTxY&target=https%3A%2F%2Fug.m.taobao.com%2Fapp%2Fstarlink%2Fwakeup-transit%2Fpages%2Fdownload%3Fstar_id%3D5292%26targetUrl%3Dhttps%253A%252F%252Fpages-fast.m.taobao.com%252Fwow%252Fz%252Fapp%252Fug%252Fcrowd%252Fnewuser-foreign%253Fx-ssr%253Dtrue%2526disableNav%253DYES%2526forceThemis%253Dtrue%2526x-preload%253Dtrue%2526x-sec%253Dwua%2526source%253Djulang%2526asac%253D2A24C032ASAUX2BUE25HHF%2526spmcnt%253Dcrowdcarry.newuser-foreign%2526itemIds%253D846840263141%2526spm%253D2014.ugdhh.2200803434232.846840263141-2060776-1393509178%2526spm_back_up%253Dcrowdcarry.newuser-foreign%2526dpa_source_code%253D12890%2526imgid%253D9cf5abe48c73d9351c7145f5b81c8801%2526slk_actid%253D100000000207%2526bc_fl_src%253Dgrowth_dhh_2200803434232_846840263141-2060776-1393509178-283313094-db4a9cc66cc4f51f0484099357fc35f0-53001-0-ADX_DSP_EXAMPLE-2022121301-0-0-1-588257-0-0-23527-0-d522978_snull_qnull_t120416_r508774_c532770%26slk_force_set_request%3Dtrue",
"download_url": "market://details?id=com.taobao.taobao"
}
}
}
]
}
],
"id": "xiaomi_req_20260507_101",
"adx_ext": "meBE_JBJpI4Qz9-7qTM6dY8Wj_oTbm6m11rj-oxUIQntDygXRxvnm1zaUMgk9Jq-J2kw8nXCJWnm7GWz0Q6of2CaevXIk8IFFpAnYY5C582J76HdKK2IpA9PBAL8U5xRlLzWb_nfzkeQH3VaTO8S42rqyUs6YO8FMlbTP0Se78L5wiNvlDBxLQgr85I="
}
}No-Bid 响应(无竞价):
正常响应,放弃此次竞价机会,建议调低价格
{
"version": "3.3.0",
"timestamp": 1779888806892,
"code": 41000,
"message": "无出价"
}6. 事件上报
广告竞胜使用GET方式调 NUrl
6.1 宏说明
| 参数 | 说明 |
|---|---|
__LOSS_CODE__ | 竞败 |
__OS__ | 客户端操作系统的类型; 0–Android ;1–iOS |
__IMEI__ | 用户终端的IMEI,15位数字; 取md5sum摘要 |
__MAC__ | 用户终端的eth0 接口的 _MAC 地址(大写去除冒号分隔符),md5加密;去除分隔符":",(保持大写)取 _md5sum 摘要 |
__IDFA__ | iOS IDFA适用于iOS6及以上;保留原始值 |
__CAID__ | 用户终端的CAID,适用于iOS系统;版本号以及具体的CAID值,以ver_CAID(原始值)这样的格式,每次传输传两个CAID,分别为当前最新版本号和上一版本号的CAID值,两者之间以逗号分割。示例:CAID=20210301_xxxxxx,20201201_xxxxxx。 _如果当前只有一个版本的CAID,可以只传一个,如:CAID=20210301_xxxxxxxx |
__AAID__ | Android Advertising ID;保留原始值 |
__OAID__ | 用户终端的OAID,适用于Android系统 ;保留原始值 |
__DUID__ | Windows Phone 用户终端的DUID,md5加密;取md5sum摘要 |
__IP__ | 媒体投放系统获取的用户终端的公网IP地址,用于比对智能路由IP差异;A.B.C.D(4段点分),如12.34.56.78 |
__UA__ | 数据上报终端设备的User Agent;字符串,需URLEncode,如 _Mozilla%2F5.0(Linux%3BAndroid4.0.4%3BGT-I9220%20Build%2FIMM76D ) |
__TS__ | 客户端触发监测的时间;UTC时间戳,自1970年起的毫秒数 |
__LBS__ | 用户终端设备的经纬度地理坐标;十进制保留6位小数,西经南纬保留负数,用字母x分割纬度与精度(先纬后经,最后精度),如35.758134x-122.406722x100.0 |
__GEO__ | 用户终端设备的经纬度地理坐标;十进制保留3位小数,西经南纬保留负数,用字母x分割纬度与精度(先纬后经,最后精度),如35.7x-122.4x10000.0 |
__REQ_WIDTH__ | 广告请求中的广告位宽(请求数据中参数 pos.width,如果请求不填,则无需替换) |
__REQ_HEIGHT__ | 广告请求中的广告位高(请求数据中参数 pos.height,如果请求不填,则无需替换) |
__WIDTH__ | 实际广告位的宽,单位为像素 |
__HEIGHT__ | 实际广告位的高,单位为像素 |
__DOWN_X__ | 用户手指按下设备屏幕时的相对广告位横坐标;如无法获取时,请填“-999”。 |
__DOWN_Y__ | 用户手指按下设备屏幕时的相对广告位纵坐标;如无法获取时,请填“-999” |
__UP_X__ | 用户手指离开设备屏幕时的相对广告位横坐标,如无法获取时,请填“-999” |
__UP_Y__ | 用户手指离开设备屏幕时的相对广告位纵坐标,如无法获取时,请填“-999” |
__SC_DOWN_X__ | 用户手指按下设备屏幕时绝对横坐标;如无法获取时,请填“-999”。 |
__SC_DOWN_Y__ | 用户手指按下设备屏幕时绝对纵坐标;如无法获取时,请填“-999” |
__SC_UP_X__ | 用户手指离开设备屏幕时绝对横坐标,如无法获取时,请填“-999” |
__SC_UP_Y__ | 用户手指离开设备屏幕时绝对纵坐标,如无法获取时,请填“-999” |
__MANUFACTURER__ | 手机厂商 |
__UTC_TS__ | 当前业务开始时刻的UTC时间戳(例如点击按下,开始展现) |
__UTC_END_TS__ | 当前业务结束时刻的UTC时间戳(例如点击抬起) |
__VIDEO_DURATION__ | 视频 用户点击时,视频已播放时长秒数 |
💡 提示:以上宏变量主要用于反作弊校验。非必要宏若 URL 中未包含则无需替换。
6.2 竞败原因
| ID | 广告竞败原因 |
|---|---|
| 1001 | 返回广告超时 |
| 1002 | 请求广告超时 |
| 2001 | 广告主行业不支持,或行业id错误 |
| 2002 | 广告主未过审 |
| 2003 | 广告主审核拒绝 |
| 2004 | 广告创意未过审 |
| 2005 | 广告创意审核拒绝 |
| 3001 | 广告主屏蔽 |
| 3002 | 广告创意url被屏蔽 |
| 3003 | 无标题,或标题错误 |
| 3004 | 标题或文案触发敏感词屏蔽 |
| 3005 | 投放广告的包名被屏蔽 |
| 3006 | 无落地页,或错误 |
| 3007 | 无图片地址,或错误 |
| 3008 | 无视频地址,或错误 |
| 3009 | 下载类广告位无下载地址,或错误 |
| 3010 | 下载类广告无包名,或错误 |
| 3011 | 图片尺寸/类型不匹配(错误) |
| 3012 | 下载类广告包名未在商店上架 |
| 3013 | 落地页协议头屏蔽 |
| 4001 | 异常过高出价 |
| 4002 | 低于媒体底价 |
| 5001 | 竞价失败 |
| 6001 | 其他 |
| 6002 | 快应用过滤 |
6.3 事件上报机制
ADX 采用分布式 URL 上报模式,而非集中式 token 端点。
竞价响应的 BidExt.events[] 数组中定义了所有可触发的事件及其上报目标 URL。SSP 在相应时机对这些 URL 发起请求即可。 Url的数量可能有多条,需要分别触发
6.3.1 上报流程
触发某事件(如曝光)
│
├─ 1. 从 events[] 中查找 type 匹配的 EventTracker
│ 例:{ type: "impression", urls: [...], method: "IMAGE" }
│
├─ 2. 对每个 URL 执行宏替换(见 §6.1)
│
├─ 3. 根据 method 选择上报方式
│
│ ┌──────────────────────────────────────────┐
│ │ method = "IMAGE"(推荐用于曝光) │
│ │ → new Image().src = finalUrl │
│ │ → 浏览器静默 GET,不等待响应 │
│ ├──────────────────────────────────────────┤
│ │ method = "GET"(默认) │
│ │ → fetch(finalUrl, {method: 'GET'}) │
│ ├──────────────────────────────────────────┤
│ │ method = "POST" │
│ │ → fetch(finalUrl, {method: 'POST'}) │
│ └──────────────────────────────────────────┘
│
└─ 4. 记录日志(时间戳、事件类型、URLs、状态码)6.2.3 各事件触发时机
| 操作 | 触发的 event.type | 说明 |
|---|---|---|
| 广告渲染完成且可见 | impression | 通常使用 IMAGE 方式静默上报 |
| 用户点击广告区域 | click | 点击后打开落地页(deeplinks 优先) |
| 视频开始播放 | video_start | 仅视频类广告(ad_type=2/6) |
| 视频播放完毕 | video_complete | 仅视频类广告 |
| 用户关闭广告 | close | 插屏/激励/开屏广告 |
7. 错误码参考
7.1 响应码(AdxResponse.code)
| code | HTTP 状态码 | 含义 | 可能原因 | 建议处理 |
|---|---|---|---|---|
| 0 | 200 OK | 成功 | 正常 | 解析 data 字段获取竞价结果。检查 seatbid 是否为空数组判断 no-bid |
| 41000 | 200 OK | No Bid | 正常 | 放弃此次竞价机会,建议调低价格 |
7.2 常见问题排查
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 参数无效 1000 | 签名错误 | 确认签名是否正确 |
| 请求已过期 12002 | 请求已过期 | timestamp 过期 |
| 间歇性 401 | nonce 重复 | 确保每次请求使用全新的随机 nonce |
| 返回 400 | BidRequest 解析失败 | 确保加密的内容是合法的 JSON 且字段名符合 snake_case(Proto JSON Mapping) |
8. 调试与排障
8.1 自检清单
发送请求前逐项确认:
- [ ]
version="1.0" - [ ]
uuid= 分配的广告位 AccessKey(非租户ID) - [ ]
timestamp= 当前毫秒时间戳(Date.now()/time.Now().UnixMilli()/System.currentTimeMillis()) - [ ]
nonce= 24 字符随机字符串(每次请求全新) - [ ]
signature=URLSafeBase64(HMAC-SHA256(sk, "{version}{uuid}{timestamp}{nonce}{data}"))(无分隔符) - [ ]
data=URLSafeBase64(GCM_nonce(12B) \|\| AES-GCM-Ciphertext \|\| AuthTag(16B)) - [ ] 加密内容 = BidRequest PB 对象的 ProtoJSON 序列化结果(snake_case 字段名)
- [ ] Content-Type =
application/json - [ ] 请求体为 JSON 格式
- [ ]
BidRequest.id全局唯一 - [ ]
BidRequest.imp[]至少包含 1 个元素 - [ ]
imp[].slot_attribute.width和height已填写
8.2 日志记录建议
// RequestLog — 建议记录的请求日志字段(Go struct 示例)
type RequestLog struct {
Ts string // 发送时间(ISO 8601)
RequestId string // BidRequest.id
Uuid string // AccessKey(广告位标识)
HttpStatus int // HTTP 状态码
ResponseCode int32 // AdxResponse.code
TraceId string // AdxResponse.trace_id(关键!排查必备)
LatencyMs uint32 // AdxResponse.lengthy
HasBid bool // data.seatbid 是否非空
AdType *int32 // 有竞价时的广告类型
WinPrice *float64 // 胜出价格
}联系技术支持时,请务必提供
trace_id和对应的时间范围。
9. 版本管理
| 项目 | 说明 |
|---|---|
| 当前协议版本 | version: "3.3.0" |
| API 路径 | /api/v3/bid |
| 传输编码 | JSON (application/json) |
| 适用终端 | 仅移动端(iOS / Android) |
| 兼容策略 | 向后兼容更新仅增加可选字段 |
| 不兼容变更 | 发布新版本路径(如 /api/v2/bid) |
| 变更通知 | 提前 30 天邮件通知 |
文档更新记录
| 版本 | 日期 | 变更类型 | 变更内容 |
|---|---|---|---|
| v1.0.0 | 2025-03-25 | 初始发布 | 初版,定义 Protobuf 二进制传输格式 |
| v3.3.0 | 2026-05-26 | 重大修正 | 传输格式由 Protobuf 二进制修正为 JSON(application/json),明确 Proto 文件角色为数据结构契约+PB类生成工具,加密内容为 ProtoJSON 序列化的 BidRequest JSON;修正 UUID/AK 定义为"广告位标识"(非租户ID);补充 Device/App/User 等遗漏字段;数据结构全部使用 Proto message 格式;限定适用范围为移动端;补充在线调试工具说明;新增附录(os_boot_time 等字段获取示例、安装 APP 枚举) |
© 2026 ADX Platform. 本文档仅供已签约 SSP 合作伙伴使用,未经授权不得传播。
附录
获取 os_boot_time 系统启动时间
static time_t bootSecTime(){
struct timeval boottime;
size_t len = sizeof(boottime);
int mib[2] = { CTL_KERN, KERN_BOOTTIME };
if( sysctl(mib, 2, &boottime, &len, NULL, 0) < 0 ){
return 0;
}
return boottime.tv_sec;
}
- (NSString *)bootTimeInSec{
return [NSString stringWithFormat:@"%ld",bootSecTime()];
}获取 os_update_time 系统更新时间
- (NSString *)getSysU {
NSString *result = nil;
NSString *information = @"L3Zhci9tb2JpbGUvTGlicmFyeS9Vc2VyQ29uZmlndXJhdGlvblByb2ZpbGVzL1B1YmxpY0luZm8vTUNNZXRhLnBsaXN0";
NSData *data=[[NSData alloc]initWithBase64EncodedString:information options:0];
NSString *dataString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSError *error = nil;
NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:dataString error:&error];
if (fileAttributes) {
id singleAttibute = [fileAttributes objectForKey:NSFileCreationDate];
if ([singleAttibute isKindOfClass:[NSDate class]]) {
NSDate *dataDate = singleAttibute;
result = [NSString stringWithFormat:@"%.6f",[dataDate timeIntervalSince1970]];
}
}
return result;
}获取 os_birth_time 设备初始化时间
static NSString * getFileTime() {
struct stat info;
int result = stat("/var/mobile", &info);
if (result != 0) {
return @"";
}
struct timespec time = info.st_birthtimespec;
return [NSString stringWithFormat:@"%ld.%09ld", time.tv_sec, time.tv_nsec];
}获取 boot_mark 阿里反作弊标记
IOS示例
- (NSString *)getBoot{
NSString *timeString = nil;
int mib[2];
size_t size;
struct timeval boottime;
mib[0] = CTL_KERN;
mib[1] = KERN_BOOTTIME;
size = sizeof(boottime);
if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1)
{
timeString = [NSString stringWithFormat:@"%d.%d", (int) boottime.tv_sec, (int) boottime.tv_usec];
}
return timeString?:@"";
}Android示例
static jstring getBoot(JNIEnv *env, jclass) {
FILE *fp = fopen("/proc/sys/kernel/random/boot_id", "r");
char boot[TID1_LEN];
if (fp == NULL) {
// 获取失败
} else {
unsigned char c;
int i = 0;
while (i < TID1_LEN) {
c = fgetc(fp);
boot[i] = c;
i = i + 1;
}
if (ferror(fp)) {
// 获取失败
}
}
// fgets(boot,sizeof(boot),fp);
std::string sboot = boot;
return env->NewStringUTF(sboot.c_str());
}获取 update_mark 阿里反作弊标记
IOS示例
- (NSString *)getUpdate{
NSString *timeString = nil;
struct stat sb;
NSString *enCodePath = @"L3Zhci9tb2JpbGU=";
NSData *data=[[NSData alloc]initWithBase64EncodedString:enCodePath options:0];
NSString *dataString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
const char* dePath = [dataString cStringUsingEncoding:NSUTF8StringEncoding];
if (stat(dePath, &sb) != -1) {
timeString = [NSString stringWithFormat:@"%d.%d", (int)sb.st_ctimespec.tv_sec, (int)sb.st_ctimespec.tv_nsec];
}
else {
timeString = @"0.0";
}
return timeString?:@"";
}Android示例
// update
static jstring getUpdate(JNIEnv *env, jclass) {
struct stat sb;
int updates,updatens;
if (stat("/data/data", &sb) == -1) {
// 获取失败
} else {
updatens = (int) sb.st_atim.tv_nsec;
updates = (int) sb.st_atim.tv_sec;
}
std::string idRes = std::to_string(updates) + "." + std::to_string(updatens);
return env->NewStringUTF(idRes.c_str());
}获取 ver_code_hms 和 ver_code_ag
//获取AG版本号
private static String directGetAgVersionCode(Context context) {
String version;
version = getVersionCode(context, "com.huawei.appmarket");
if (version == null) {
version = "";
}
return version;
}
// 获取HMS版本号
public static String directGetHmsVersionCode(Context context) {
String version;
version = getVersionCode(context, "com.huawei.hwid");
if (version == null) {
version = "";
}
return version;
}
// 根据包名获取应用版本号
public static String getVersionCode(Context context, String pkgName) {
try {
PackageInfo pkgInfo = getPackageInfo(context, pkgName);
return pkgInfo == null ? null :
String.valueOf(pkgInfo.versionCode);
} catch (AndroidRuntimeException e) {
Log.w(TAG, "getVersionCode fail");
} catch (Exception e) {
Log.w(TAG, "getVersionCode fail");
}
return null;
}
// 根据包名获取PackageInfo
public static PackageInfo getPackageInfo(Context context, String
packageName) {
if (TextUtils.isEmpty(packageName)) {
return null;
}
PackageInfo info = null;
try {
if (context != null) {
PackageManager packageManager = context.getPackageManager();
if (packageManager != null) {
info = packageManager.getPackageInfo(packageName,
PackageManager.GET_META_DATA);
}
}
} catch (PackageManager.NameNotFoundException e) {
Log.w(TAG, "getPackageInfo NameNotFoundException");
} catch (Exception e) {
Log.w(TAG, "getPackageInfo Exception");
}
return info;
}安装APP枚举
| 序号 | 应用名称 |
|---|---|
| 1 | 淘宝 |
| 2 | 天猫 |
| 3 | 京东 |
| 4 | 拼多多 |
| 5 | 唯品会 |
| 6 | 苏宁 |
| 7 | 聚美优品 |
| 8 | 国美 |
| 9 | 大众点评 |
| 10 | 美团 |
| 11 | 饿了么 |
| 12 | UC浏览器 |
| 13 | 手机百度 |
| 14 | 天天快报 |
| 15 | 优酷 |
| 16 | 趣头条 |
| 17 | 米读 |
| 18 | 萌推 |
| 19 | 网易新闻 |
| 20 | 波波视频 |
| 21 | 腾讯新闻 |
| 22 | 知乎 |
| 23 | 爱奇艺 |
| 24 | 凤凰新闻 |
| 25 | 全民k歌 |
| 26 | QQ音乐 |
| 27 | 豌豆荚 |
| 28 | 京东金融 |
| 29 | 口碑 |
| 30 | 七猫 |
| 31 | 快手 |
| 32 | b站 |
| 33 | 百度地图 |
| 34 | 抖音 |
| 35 | 支付宝 |
| 36 | 考拉海购 |
| 37 | 携程 |
| 38 | 淘宝特价 |
| 39 | 每日优鲜 |
| 40 | 京东极速版 |
| 41 | 闲鱼 |
| 42 | 夸克 |
| 43 | 高德 |
| 44 | 美团外卖 |
| 45 | 网易严选 |
| 46 | 去哪儿 |
| 47 | 点淘 |
| 48 | 新氧医美 |
| 49 | 寺库奢侈品 |
| 50 | 微博 |
| 51 | 斗鱼 |
| 52 | 天眼查 |
| 53 | 贝壳 |
| 54 | 菜鸟裹裹 |
| 55 | 钉钉 |
| 56 | 飞猪 |
| 57 | 盒马 |
| 58 | 掌上生活 |
| 59 | 小红书 |
| 60 | 京东金融 |
| 61 | 滴滴出行 |
| 62 | 书旗小说 |
| 63 | 百度极速版 |
| 107 | 得物 |
| 109 | 1688 |
| 120 | 微信 |
| 567 | 转转 |
