跳转到主要内容
PRODUCT DOCUMENTS

快速找到所需文档,高效完成接入与排障

浏览产品文档与友盟 Skill,展开目录并阅读正文。

开通OpenApi返还流程

第一步:在OpenAPI卡片中点击开通

点击【立即开通】后,弹出【确认开通Open API】对话框,可以选择:1.【开通并例行订阅】 即每天会自动将数据准备好,客户可随时下载,同时每天例行的数据准备会消耗流量费用;2.【仅开通】只会开通服务,但数据不会每天准备好,需要通过手动提交补投任务 或 OpenAPI 补投,此时只会按单次补投任务的流量来计费。

注:不论使用例行和单次补投哪种数据返还方式,都需要提前购买流量包。但对于首次开通数据返还服务的客户(不包括关闭再开通的情况),为方便测试使用,系统会默认免费补投近7天的历史数据。

image..png

开通Open API服务后,通过下面的开关可以开通和关闭例行订阅

image..png

通过查询可下载文件列表,可以获取可下载的文件

image..png

如需历史数据,需要通过OpenAPI补投

image

第二步:获取访问凭证

查看OpenAPI的访问凭证

第三步:访问OpenAPI文档

数据返还OpenAPI

进行API调试、查看API使用方式,至此完成通过OpenAPI以离线文件形式投递明细数据的服务开通。

Beta版本已支持通过OpenAPI单次获取近30日内、指定日期的明细数据离线文件下载地址,如有通过离线文件下载历史明细数据的需求,请您使用历史数据补投的OpenAPI先提交补投申请,DOP服务完成数据准备后,即可获取相关的离线文件下载地址。

正式版支持以订阅的方式进行数据主动投递,客户开通订阅服务后数据会每天例行准备好,客户每天可以例行下载,不需要提交补投任务。

第四步:获取SDK代码或示例

请到DOP的API调试页面获取基础OpenAPI代码

API调试

18

如上,您必须在调式参数填入任意参数,先点击「发起调用」后在右侧面板即可获取基础示例代码。

如果您需要结合3个相关接口进行整合满足下载需求,可参考如下示例Demo

数据返还OpenAPI的示例代码

package com.alibaba.lindorm.sql.demo.mybatis.service;

import com.alibaba.fastjson.JSON;
import com.aliyun.dop20221130.Client;
import com.aliyun.dop20221130.models.*;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.Common;
import com.aliyun.teautil.models.RuntimeOptions;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DopTest {
    // 获取友盟OpenAPI的accessKeyId
    private static final String ACCESS_KEY_ID = "您的AK";

    // 获取友盟OpenAPI的accessKeySecret
    private static final String ACCESS_KEY_SECRET = "您的SK";

    /**
     * 主题包和表映射
     * */
    public enum PackageTableEnum{
        /**
         * U-APP主题包
         * */
        UAPP(1, Arrays.asList(UAPP_TABLES.split(","))),

        /**
         * U-WEB主题包
         * */
        UWEB(2, Arrays.asList(UWEB_TABLES.split(","))),

        /**
         * U-PUSH主题包
         * */
        UPUSH(3, Arrays.asList(UPUSH_TABLES.split(","))),

        /**
         * U-MINI小程序主题包
         * */
        UMINI(4, Arrays.asList(UMINI_TABLES.split(","))),
        ;

        Integer packageId;
        List<String> tables;

        PackageTableEnum(Integer packageId, List<String> tables) {
            this.packageId = packageId;
            this.tables = tables;
        }

        public static PackageTableEnum getByTable(String table) {
            PackageTableEnum[] packageTableEnums = PackageTableEnum.values();
            for(PackageTableEnum packageTableEnum : packageTableEnums) {
                if (packageTableEnum.getTables().contains(table)) {
                    return packageTableEnum;
                }
            }
            return null;
        }

        public Integer getPackageId() {
            return packageId;
        }

        public List<String> getTables() {
            return tables;
        }
    }

    // U-APP分析主题包支持返还的表名(29张),也可以根据自己需要自定义指定
    private static final String UAPP_TABLES = "dws_ump_log_uapp_channel_1d," +
            "dws_ump_log_uapp_version_top_1d," +
            "dws_ump_log_uapp_1d," +
            "dwd_ump_log_uapp_error_di," +
            "dws_ump_log_uapp_channel_label_new_1d," +
            "dws_ump_log_uapp_error_version_1d," +
            "dws_ump_log_uapp_channel_profile_rate_cw," +
            "dws_ump_log_uapp_retention_1d," +
            "dws_ump_log_uapp_version_os_1d," +
            "dws_ump_log_uapp_channel_top_1d," +
            "dwd_ump_log_uapp_launch_di," +
            "dwd_ump_log_uapp_event_json_di," +
            "dws_ump_log_uapp_version_device_1d," +
            "dws_ump_log_uapp_all_device_model_30d," +
            "dws_ump_log_uapp_retention_channel_1d," +
            "dws_ump_log_uapp_error_os_1d," +
            "dws_ump_log_uapp_retention_version_1d," +
            "dws_ump_log_uapp_error_channel_1d," +
            "dws_ump_log_uapp_user_count_td," +
            "dws_ump_log_uapp_version_1d," +
            "dws_ump_log_uapp_duration_activity_1d," +
            "dws_ump_log_uapp_all_os_30d," +
            "dim_ump_device_uapp_model_specs," +
            "dws_ump_log_uapp_version_os_newuser_7d," +
            "dws_ump_log_uapp_newuser_7d," +
            "dws_ump_log_uapp_30d," +
            "dws_ump_log_uapp_channel_newuser_7d," +
            "dws_ump_log_uapp_version_device_newuser_7d," +
            "dwd_ump_log_uapp_retail_event_ekv_di," +
            "dim_ump_uapp_app_key";

    // U-WEB分析主题包支持返还的表名(2张),也可以根据自己需要自定义指定
    public static final String UWEB_TABLES = "dwd_ump_log_uweb_di," +
            "dwd_ump_log_uweb_event_di";

    // U-PUSH分析主题包支持返还的表名(3张),也可以根据自己需要自定义指定
    public static final String UPUSH_TABLES = "dwd_ump_log_upush_uninstall_di," +
            "dwd_ump_log_upush_launch_di," +
            "dwd_ump_log_upush_message_di";

    // U-MINI分析主题包支持返还的表名(4张),也可以根据自己需要自定义指定
    public static final String UMINI_TABLES = "dwd_ump_log_mini_program_launch_di," +
            "dwd_ump_log_mini_program_event_di," +
            "dwd_ump_log_mini_program_retail_event_ekv_di," +
            "dws_ump_log_mini_program_retail_base_1d";

    /**
     * 使用AK&SK初始化账号Client
     * 获取AK&SK地址https://devs.umeng.com/api/credentials
     * */
    public static Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
        Config config = new com.aliyun.teaopenapi.models.Config()
            .setAccessKeyId(accessKeyId)
            .setAccessKeySecret(accessKeySecret);
        // 访问的域名
        config.endpoint = "dop.openapi.umeng.com";
        return new Client(config);
    }

    /**
     * A、获取指定时间范围、指定表的返还文件目录可下载的文件列表信息(start和end时间窗口为30天,start和end时间均不能为>=today的时间)
     * @param start     开始时间 yyyyMMdd格式
     * @param end       开始时间 yyyyMMdd格式
     * @param tableName 需要返还的表名
     * @return
     */
    public static GetOssMetaListResponse getOssDirMetas(String start, String end, String tableName) throws Exception {
        Client client = createClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        GetOssMetaListRequest getOssMetaListRequest = new GetOssMetaListRequest()
                .setStart(start)
                .setEnd(end)
                .setTableName(tableName);
        Map<String, String> headers = new HashMap<>();
        try {
            GetOssMetaListResponse response = client.getOssMetaListWithOptions(getOssMetaListRequest, headers, new RuntimeOptions());
            //System.out.println("获取OssMeta列表:" + JSON.toJSONString(response));
            return response;
        } catch (TeaException error) {
            // 如有需要,请打印 error
            throw error;
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 如有需要,请打印 error
            throw error;
        }
    }

    /**
     * B、数据返还进行oss文件下载
     * @param ds 时间 yyyyMMdd格式,ds不得>=today的时间
     * @param tableName 需要数据返还下载的表名
     * @return
     * */
    public static GetOssMetaDownloadResponse getOssMetaDownloadFiles(String ds, String tableName) throws Exception {
        Client client = createClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        GetOssMetaDownloadRequest getOssMetaDownloadRequest = new GetOssMetaDownloadRequest()
                .setDs(ds)
                .setTableName(tableName);
        java.util.Map<String, String> headers = new java.util.HashMap<>();
        try {
            // 复制代码运行请自行打印 API 的返回值
            GetOssMetaDownloadResponse ossMetaDownloadsResp = client.getOssMetaDownloadWithOptions(getOssMetaDownloadRequest, headers, new com.aliyun.teautil.models.RuntimeOptions());
            return ossMetaDownloadsResp;
        } catch (TeaException error) {
            // 如有需要,请打印 error
            Common.assertAsString(error.message);
            System.out.println("download errors:" + JSON.toJSONString(error));
            throw error;
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 如有需要,请打印 error
            Common.assertAsString(error.message);
            throw error;
        }
    }

    /**
     * C、任务补投递
     * @param start 开始时间 yyyyMMdd格式
     * @param end   结束时间 yyyyMMdd格式
     * @param packageId 主题包ID
     * */
    public static SubmitBackfill4ApiResponse submitBackfill4Api(String start, String end, Integer packageId) throws Exception {
        Client client = createClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        SubmitBackfill4ApiRequest submitBackfill4ApiRequest = new SubmitBackfill4ApiRequest()
                .setPackageId(packageId)
                .setStart(start)
                .setEnd(end);
        java.util.Map<String, String> headers = new java.util.HashMap<>();
        try {
            // 复制代码运行请自行打印 API 的返回值
            SubmitBackfill4ApiResponse submitBackfill4ApiResp = client.submitBackfill4ApiWithOptions(submitBackfill4ApiRequest, headers, new RuntimeOptions());
            return submitBackfill4ApiResp;
        } catch (TeaException error) {
            // 如有需要,请打印 error
            throw error;
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 如有需要,请打印 error
            throw error;
        }
    }

    /**
     * 实现按照指定时间范围+表名的数据返还需要3个接口配合(A+B接口组合查询,C接口单次补投递)
     * */
    public static void main(String[] args_) throws Exception {
        // 需要数据返还时间范围(startDate和endDate时间窗口为30天)
        String startDate = "20221226";
        String endDate = "20221227";
        // 需要数据返还下载的主题包
        PackageTableEnum packageTableEnums = PackageTableEnum.UAPP;
        try {
            for(String table : packageTableEnums.getTables()) {
                GetOssMetaListResponse ossDirMetasResp = getOssDirMetas(startDate, endDate, table);
                if (ossDirMetasResp == null || ossDirMetasResp.getStatusCode() != 200) continue;
                List<GetOssMetaListResponseBody.GetOssMetaListResponseBodyData> metas= ossDirMetasResp.getBody().getData();
                //如果meta是空,说明还没有生成目录,需要单独去提交一下补投的接口,补投递的接口提交后后台大约10分钟左右会补投完毕
                //System.out.println("meta size:" + metas.size()+ " detail=" +
                // JSON.toJSONString(metas)+" start=" + startDate + " end=" + endDate + " table=" + table);
                for(GetOssMetaListResponseBody.GetOssMetaListResponseBodyData meta : metas) {
                    String ds = meta.getDs();
                    GetOssMetaDownloadResponse ossMetaDownloadResp = getOssMetaDownloadFiles(ds, table);
                    if (ossMetaDownloadResp == null || ossMetaDownloadResp.getStatusCode() != 200) continue;
                    System.out.println("日期=" + ds + ",表名=" + table + ",下载链接=" + JSON.toJSONString(ossMetaDownloadResp.getBody().getData()));
                }
            }
        } catch (Exception e) {
            // 如有需要,请打印 error
            System.out.println("ERR:" + JSON.toJSONString(e));
        }

        //----返还数据进行补投递(指定时间范围内 + 主题分析包)----
        //补投调用时机:当获取Meta列表接口的data为空,则需要补投递(例如:补投UAPP主题包,就会回补该主题包下29张表)
        //即当根据[时间范围+表名]去查询可返回下载的Meta目录列表时,如果没返回(说明主题包没投递过),则需要根据[该时间范围+该表对应的主题包]去提交一次补投任务
        PackageTableEnum packageTableEnum = PackageTableEnum.getByTable("dwd_ump_log_mini_program_event_di");
        SubmitBackfill4ApiResponse backfillResp = submitBackfill4Api(startDate, endDate, packageTableEnum.getPackageId());
        //System.out.println("补投递提交结果:" + JSON.toJSONString(backfillResp, SerializerFeature.PrettyFormat));
    }
}

第五步:快速预览下载的ORC文件

使用友盟数据返还下载的文件,当前只支持orc格式,可借助orc提供的工具进行快速预览

  1. 下载orc Java 工具到本地 地址:orc-tools

  2. 数据预览 java -jar orc-tools-1.7.2-uber.jar data -n 5 xxxx.orc

image

orc-tools 更多详细使用参见官方介绍 : https://orc.apache.org/docs/java-tools.html