Skip to content

Instantly share code, notes, and snippets.

@zhangbool
Last active May 15, 2023 08:34
Show Gist options
  • Save zhangbool/a611b501b206895eb29a99c59b17a6e2 to your computer and use it in GitHub Desktop.
Save zhangbool/a611b501b206895eb29a99c59b17a6e2 to your computer and use it in GitHub Desktop.

2023-05-11 打点字段为需求方提供,我方负责存储该数据并根据需求方要求分析该数据 仅b站用

[toc]

文件版本 修改人 修改内容 修改时间
V1 张丹峰 文档初步拟定 2023-05-11
V1.1 张丹峰 调整文档相关字段 2023-05-12
V2 张丹峰 字段又调整,增加国家字段等 2023-05-15

0, 注意声明

  • 默认情况下,所以字段一律使用小写
  • 不可使用带有空格的属性名和属性值,如果特殊需要,请使用“_”取代空格, 如“top_bar_notification”
  • 所有数据中不可携带制表符换行符等,"\t", "\n", "\r", "\01", 如有特殊,请先沟通
  • url中不可携带emoji等表情符,字符一律使用utf-8
  • 发送时异步发送,避免影响页面加载或者响应速度
  • 字符串类型,请避免‘-1’直接作为属性值传入,-1将作为null的默认符号

1, 请求方式

# 生产
https://collect.azazie.cn

# 请求地址
https://collect.azazie.cn/api/v1/emailEvent


# 测试(1个实例)
https://collect-test.azazie.cn
  • 请求密钥请联系数据搜集方获取

2, 字段解释

字段 是否必填 类型 参数含义 备注
did true string client_id 设备id,作为去重的唯一标识
c true string country US,CA
p false int platform 1,2,3,4, 分别代表:pc,mweb,ios, android, 如果没有请勿传改字段
lang true string language 语言
s true string Source utm-source,代表邮件发送平台, azius, reach, facebook
m true string Medium utm-medium, email, cpc, banner, 邮件统一用email
cp true string Campaign utm-campaign,代表campaign名称
ctt true string Content utm-content,代表邮件标题
a true string 事件类型 open/click
et true long email sent time 邮件发送时间,精确到ms
lgt true long log time 日志时间,精确到ms
p1 false string 预留字段01
p2 false string 预留字段02
p3 false string 预留字段03
p4 false string 预留字段04
p5 false string 预留字段05
p6 false string 预留字段06

注意:

如下四个字段均是通过:Source+Campaign+Content作为唯一值去后台数据库中查询得到

计划ID 邮件模版ID 邮件场景 发送人群ID

3, 签名方式

/**
 * 签名生成方法, 方法如下:
 
 * 1,把通用字段参数按照字典升序顺序排列(注意:不包含sign和具体事件参数的任何数据)
 
 * 2,然后拼接参数为name=Ivanl001&age=10&hobby=game形式,
 
 * 3,将所有大写转小写,然后拼接密钥:act=1&am=appstore&c=us&cv=v1.0.1&di=dfakfdafdaslfasdfasfdasfasdfdsa&entry=1&ip=10.0.0.1&ldt=1.22&lgt=1506047606608&nw=wifi&p=1&pl=1&sr=1080*960&secretkey=me02kunyfqcejqbdwlaf0ghs3j2r8wuu
 
 * 4,把待编码字符串进行base64编码:YWN0PTEmYW09YXBwc3RvcmUmYz11cyZjdj12MS4wLjEmZGk9ZGZha2ZkYWZkYXNsZmFzZGZhc2ZkYXNmYXNkZmRzYSZlbnRyeT0xJmlwPTEwLjAuMC4xJmxkdD0xLjIyJmxndD0xNTA2MDQ3NjA2NjA4Jm53PXdpZmkmcD0xJnBsPTEmc3I9MTA4MCo5NjAmc2VjcmV0a2V5PW1lMDJrdW55ZnFjZWpxYmR3bGFmMGdoczNqMnI4d3V1
 
 * 5,将base64编码后的字符串进行md5加密:c34b30f0f77b63ef80f1cc3b841b3a89
 */

//服务端加密源码参考:com.lebbay.common.utils.IMSignUtils
		//java代码参考

    //移除本身的sign字段
    String theSign = (String) map.remove("sign");

    /**
     * 签名生成方法, 方法如下:
     * 1,先把参数按照字典升序顺序排列,
     * 2,然后拼接参数为name=Ivanl001&age=10&hobby=game形式,
     * 3,将所有大写转小写,然后拼接密钥:name=Ivanl001&age=10&hobby=game&secretkey=abcdefghijklmn
     * 4,把待编码字符串进行base64编码
     * 5,将base64编码后的字符串进行md5加密
     */
    public static String createSign(Map<String, Object> params, String secretkey){

        StringBuilder sb = new StringBuilder();

        /*
         * 1, 先把参数按照字典升序顺序排列
         */
        Map<String, Object> sortParams = new TreeMap<>(params);

        /*
         * 2, 遍历排序的字典,并拼接"key=value"格式
         */
        for (Map.Entry<String, Object> entry : sortParams.entrySet()) {
            String key = entry.getKey();
            String value =  entry.getValue().toString().trim();
            if (!StringUtils.isEmpty(value)) {
                sb.append("&").append(key).append("=").append(value);
            }
        }

        /*
         * 3, 将所有大写转小写
         */
        String stringToSign = sb.append("&secretkey=").append(secretkey).toString().replaceFirst("&","").toLowerCase();
        log.info("-----组装后转小写结果是:-----" + stringToSign);

        /*
         * 4, base64编码
         */
        String basedStringToSign = new String(Base64.getEncoder().encode(stringToSign.getBytes()));
        log.info("-----base64转码后结果:-----" + basedStringToSign);

        /*
         * 5, 将base64编码后的字符串进行md5加密
         */
        String sign = DigestUtils.md5Hex(basedStringToSign);
        log.info("-----md5加密后结果是:-----" + sign);

        /*
         * 返回结果
         */
        return sign;
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment