人群上传

更新时间:
复制为 MD 格式

适用功能

Quick Tracking「行为分析」-「用户洞察」-「人群管理」-「创建人群」

使用流程

1.1 权限校验

鉴权依据

API ID、API Secret。由于数据敏感,所以只在主账号中可见,具体展示位置为:管理控制台 > 采集信息

image.pngURL参数

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参数

{
    "name": "人群上传api",
    "idType": "userid",
    "idList": ["userid1", "userid2"]
}

鉴权签名

方法名 + 参数按照key进行字母排序。

/**
 * Quick Tracking后台主账号可查看
 */
String secret = "abcdef";

/**
 * 当前要请求的服务名
 */
String service = "portrait.userGroup.upload";

/**
 * 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 = "{
    "name": "人群上传api",
    "idType": "userid",
    "idList": ["userid1", "userid2"]
}";

String source = service
    + "\n" 
    + queryString
    + "\n"
    + bodyString;

API Secretsource进行加密

String sign = new HmacUtils(HmacAlgorithms.HMAC_SHA_1, secret).hmacHex(source);
<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 demo
 */
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.xxxx-poc.com/api/";
        String service = "portrait.userGroup.upload";

        String apiId = "axxxxxxxxxxxxV8p";
        String apiSecret = "xexxxxxxxxxxxxxxxxxxxxxxxxxxCu8";

        /**
         * 构造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("name", "人群上传api");
        body.put("idType", "userid");
        body.put("idList", Arrays.asList("userid1", "userid2"));

        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;
    }
}

1.2 人群上传

portrait.userGroup.upload

请求

  • idType枚举值:userid/utdid/imei/idfa

  • idList大小限制:100w,仅支持明文上传

{
    "name": "人群上传api",
    "idType": "userid",
    "idList": ["userid1", "userid2"]
}

响应

  • 响应中有本次人群上传的uploadId

{
    "code": 200,
    "msg": "SUCCESS",
    "sCode": 200,
    "sMsg": "SUCCESS",
    "data": {
        "uploadId": "upload_000_8dk6fd_b5onq2vjamm8",
        "groupId": "group_000_8dk6fd_b5onq2vlsiyo",
        "status": "uploading"
    },
    "success": true
}

1.3 人群上传状态

portrait.userGroup.uploadStatus

请求

  • 请求中必须包含本次人群上传返回的uploadId

{
  "uploadId": "upload_000_8dk6fd_b5onq2vjamm8"
}

响应

  • 返回人群上传状态

{
    "code": 200,
    "msg": "SUCCESS",
    "sCode": 200,
    "sMsg": "SUCCESS",
    "data": {
        "status": "done",
        "percent": 100.0,
        "total": 2,
        "match": 0,
        "matchRatio": 0.0
    },
    "success": true
}