适用分析模型
适用于事件分析、漏斗分析、留存分析和Session分析模型。
使用流程
1. 新建报表
点击Quick Tracking控制台首页的行为分析模块,进入到行为分析页面。
在行为分析页面,可通过筛选框与搜索框筛选,快速找到需要导出数据的应用。
点击行为分析 - 分析,进入到行为洞察页面。根据数据导出需求,创建报表:
2. 获取报表ID
点击右上角功能区更多按钮,进入报表列表,查看已经保存的报表。
选对对应的报表,点击复制报表ID进行复制。
3. 使用OpenAPI获取报表数据
3.1 权限校验
鉴权依据
API ID、API Secret。由于数据敏感,所以只在主账号中可见,具体展示位置为:管理控制台 > 采集信息。
URL参数
http://xxx.yyy.com/api/{service}?api_id=abcdef&api_sign=abcdef&api_ts=123456
参数名 | 描述 | 备注 |
api_id | API ID | Quick Tracking后台主账号可查看 |
api_sign | 签名 | 具体逻辑见“鉴权签名” |
api_ts | 时间戳 | 毫秒 重要 该时间戳务必写为:请求时的时间戳,时区和Quick Tracking服务部署的服务器一致。如果该时间与Quick Tracking服务收到请求时的时间戳差异较大,会报错。 |
http://xxx.yyy.com/ | 前台页面管理域名 | 登录Quick Tracking后浏览器前台展示域名 |
body参数
{
"dataSourceId": "32772108106530",
"reportId":"rh2m151qj7bmh67uiqv46il4vfn8vckc",
"timeUnit":"day",
"fromDate":"2021-12-01",
"toDate": "2021-12-23"
}
鉴权签名
方法名 + 参数按照key进行字母排序。
/**
* Quick Tracking后台主账号可查看
*/
String secret = "abcdef";
/**
* 当前要请求的服务名
*/
String service = "analysis.report.data";
/**
* 1.获取URL参数,如apiId=abcdef&sign=abcdef&ts=123456
* 2.按照key排序,移除sign,结果apiId=abcdef&ts=123456
*/
String queryString = sort("api_id=abcdef&api_ts=123456");
/**
* POST接口,body内容
*/
String bodyString = "{
"dataSourceId": "32772108106530",
"reportId":"rh2m151qj7bmh67uiqv46il4vfn8vckc",
"timeUnit":"day",
"fromDate":"2021-12-01",
"toDate": "2021-12-23"
}";
String source = service
+ "\n"
+ queryString
+ "\n"
+ bodyString;
用API Secret对source进行加密
String sign = new HmacUtils(HmacAlgorithms.HMAC_SHA_1, secret).hmacHex(source);
sign = 1cfc10a297397e91f1e50e1f41ac24b8c45fd53d
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.3.0</version>
</dependency>
package com.alibaba.umeng.base.product.advanced.controller;
import com.alibaba.fastjson.JSONObject;
import okhttp3.*;
import org.apache.commons.codec.digest.HmacAlgorithms;
import org.apache.commons.codec.digest.HmacUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
/**
* @author mingpeng.spc
* @date 2022/01/07
*/
public class OpenApiControllerTest {
private static final MediaType APPLICATION_JSON = MediaType.parse("application/json; charset=utf-8");
private final static Logger LOGGER = LoggerFactory.getLogger(OpenApiControllerTest.class);
public static void main(String[] args) {
String URL = "http://pre.aplus.emas-poc.com/api/";
String service = "analysis.report.data";
String apiId = "avWYU24hvdl62V8p";
String apiSecret = "xezIgkcrtZ2yLQA4LYgBuyUo6Re2hCu8";
/**
* 构造URL参数
*/
String query = new StringBuilder()
.append("api_id=").append(apiId)
.append("&")
.append("api_ts=").append(System.currentTimeMillis())
.toString();
/**
* 构造body参数
*/
JSONObject body = new JSONObject();
body.put("dataSourceId", "69412108036695");
body.put("reportId", "7f6o7no8gks3uebieto2lmlv6o6728bj");
body.put("timeUnit", "day");
body.put("fromDate", "2021-12-31");
body.put("toDate", "2022-01-06");
String bodyString = body.toJSONString();
/**
* service
* query
* body
*/
StringBuilder valueToDigest = new StringBuilder()
.append(service)
.append("\n")
.append(query)
.append("\n")
.append(bodyString);
String sign = new HmacUtils(HmacAlgorithms.HMAC_SHA_1, apiSecret).hmacHex(valueToDigest.toString());
try {
Response response = post(URL + service + "?" + query + "&api_sign=" + sign, bodyString);
System.out.println(response.body().string());
} catch (Exception e) {
LOGGER.info("invoke post error", e);
}
}
/**
* HTTP Post
* @param URL URL
* @param body 请求body
* @return
*/
private static Response post(String URL, String body) throws IOException {
LOGGER.info("http post start, URL = {}, body = {}", URL, body);
RequestBody requestBody = RequestBody.create(APPLICATION_JSON, body);
Request request = new Request.Builder()
.URL(URL)
.post(requestBody)
.build();
Response response = new OkHttpClient().newCall(request).execute();
LOGGER.info("http post success");
return response;
}
}
3.2 数据获取
大数据量下olap:大数据量不可能通过API一次性获取,服务器承担不了大数据量下接口的数据返回,需要通过离线下载中心扩展OpenAPI接口,增加3个接口(仅支持事件分析)。
(1)analysis.report.download:下载规则的全量数据。
请求
和report.data请求一致。
{
"dataSourceId":"84702206076390",
"reportId":"kpunvt6keavnim9ip7qt2ku8gpnvf5i1",
"timeUnit":"day",
"fromDate":"2025-02-14",
"toDate":"2025-02-20"
}
响应
响应中有本次下载的分析AnalysisId
{
"code": 200,
"msg": "SUCCESS",
"sCode": 200,
"sMsg": "SUCCESS",
"data": {
"analysisId": "segmentation_adhoc_download_1740119826316",
"taskId": 36282502216715
},
"traceId": "1ecbb42517401198225971041d33fc",
"success": true
}
(2)analysis.report.downloadStatus:轮询获取本次下载的状态。
请求
请求中必须包含上次下载返回的analysisId
{
"analysisId": "segmentation_adhoc_download_1740119826316",
"dataSourceId": "84702206076390"
}
响应
返回下载状态以及总共的行数。
{
"code": 200,
"msg": "SUCCESS",
"sCode": 200,
"sMsg": "SUCCESS",
"data": {
"totalRows": 9,
"status": "RUNNING/SUCCESS/FAILED"
},
"traceId": "1ecbb42517401201253501044d33fc",
"success": true
}
(3)analysis.report.downloadPageData:分页获取离线下载的结果数据。
请求
和report.download请求一样,但多了参数anlakysisId,页码page,分页尺寸pageSize。
{
"analysisId": "segmentation_adhoc_download_1740119826316",
"dataSourceId": "84702206076390",
"reportId": "kpunvt6keavnim9ip7qt2ku8gpnvf5i1",
"timeUnit": "day",
"fromDate": "2025-02-14",
"toDate": "2025-02-20",
"page": 2,
"pageSize": 5
}
响应
分组情况下和report.data结果一致,结构如下:
{
"code": 200,
"msg": "SUCCESS",
"sCode": 200,
"sMsg": "SUCCESS",
"data": {
"groupNames": ["SDK版本", "分辨率"],
"date": [
"2025-02-14",
"2025-02-15",
"2025-02-16",
"2025-02-17",
"2025-02-18",
"2025-02-19",
"2025-02-20"
],
"firstTitle": "SDK版本,分辨率",
"groupKeys": ["sdk_version", "screen"],
"data": [
[
["10.3.2", "1920*1360"],
886.0,
886.0,
120.0,
120.0,
144.0,
144.0,
124.0,
124.0,
123.0,
123.0,
126.0,
126.0,
128.0,
128.0,
123.0,
123.0
],
[
["10.3.2", "1136*640"],
885.0,
885.0,
117.0,
117.0,
126.0,
126.0,
136.0,
136.0,
101.0,
101.0,
134.0,
134.0,
150.0,
150.0,
123.0,
123.0
],
[
["12.5.6", "2234*1080"],
852.0,
852.0,
128.0,
128.0,
125.0,
125.0,
122.0,
122.0,
122.0,
122.0,
120.0,
120.0,
112.0,
112.0,
125.0,
125.0
],
[
["10.3.2", "2234*1080"],
849.0,
849.0,
114.0,
114.0,
102.0,
102.0,
137.0,
137.0,
129.0,
129.0,
134.0,
134.0,
124.0,
124.0,
110.0,
110.0
]
],
"groupTitle": [
"页面浏览(预置)的设备ID的触发设备数",
"test"
]
},
"traceId": "1ecbb42517401219809291032d3bdf",
"success": true
}
无分组情况下,结构如下:
{
"code": 200,
"msg": "SUCCESS",
"sCode": 200,
"sMsg": "SUCCESS",
"data": {
"indicatorNames": [
"任意事件(预置)的设备ID的触发次数",
"页面浏览(预置)的设备ID的触发设备数"
],
"data": [
["总计", "394800.0", "8187.0"],
["2025-02-14", "56400.0", "1192.0"],
["2025-02-15", "56400.0", "1194.0"],
["2025-02-16", "56400.0", "1197.0"],
["2025-02-17", "56400.0", "1198.0"],
["2025-02-18", "56400.0", "1198.0"],
["2025-02-19", "56400.0", "1195.0"],
["2025-02-20", "56400.0", "1198.0"]
]
},
"traceId": "1ecbb42517401228310921091d3bdf",
"success": true
}
请求
名称 | 类型 | 是否必须 | 描述 |
dataSourceId | String | 必填 | |
reportId | String | 必填 | 报表id |
timeUnit | String | 必填 | hour/day/week/month |
fromDate | String | 必填 | yyyy-MM-dd |
toDate | String | 必填 | yyyy-MM-dd |
dataSourceId获取方式如下
打开需要导出数据的报表,在页面URL中,platform后的数字即为dataSourceId。
或者,右键选择检查 > Network,即可看到dataSourceId。
{
"dataSourceId":"74612111122219",
"reportId":"on3t8cosv298bt80it2st38o562ga95u",
"timeUnit":"day",//请求为小时颗粒度,需要fromDate和toDate相等才可
"fromDate":"2021-12-08",
"toDate":"2021-12-14"
}
返回
{
//返回日期
"date":[
"2021-12-08",
"2021-12-09",
"2021-12-10",
"2021-12-11",
"2021-12-12",
"2021-12-13",
"2021-12-14"
],
//分组名称
"groupNames":[
],
//指标名称
"indicatorNames":[
"邀请点击人数",
"邀请成功领取奖励",
"邀请成功转化率"
],
"firstTitle":"指标名称",
"total":3,
//数据返回
"data":[
[ //指标一的返回结果数据
"邀请点击人数", //指标一名称
1501, //指标一在所选时间范围内的合计结果
162, //最小日期结果数据
547,
176,
187,
128,
237,
183 //最大(近)日期结果数据
],
[
//指标二的返回结果数据
"邀请成功领取奖励",//指标二名称
185, //指标二在所选时间范围内的合计结果
28, //最小日期结果数据
67,
11,
14,
17,
32,
16 //最大(近)日期结果数据
],
[
//指标三的返回结果数据
"邀请成功转化率",
0.1232, //指标二在所选时间范围内的合计结果
0.1728, //最小日期结果数据
0.1224,
0.0625,
0.0748,
0.1328,
0.135,
0.0874 //最大(近)日期结果数据
]
],
"groupKeys":[
],
"groupTitle":[
]
}