今日头条(OCPC)广告激活数据对接-JAVA版

2023-11-05

最近在今日头条投广告,头条反馈可以按照实际激活数据的转换来付费,也就是说,只有用户真的下载并打开应用了才收费,过程类似与早年间的GHOST系统预装软件

下面说下头条的整个逻辑:

头条处理逻辑

1、用户在头条点击广告页,广告页引领用户去下载,用户下载后打开应用,头条吧这个用户的设备信息以及一些广告信息和回掉信息推送给监测服务器
2、应用将设备的唯一信息传递给监测服务器
3、监测服务器,视时机,将客户端传递的设备信息和头条传递近7天的设备信息进行匹配
4、匹配成功后调用接口回传给今日头条,那么这就完成了一次成功的转换,头条就开始扣你钱了

监测服务器处理逻辑

1、需要开发一个GET请求的接口用来接收头条的推送数据,最好分两个接口(IOS,android)
下面是源码:
// IOS获取头条推送数据
    @RequestMapping(value = "/ttpushIos", method = RequestMethod.GET)
    @ResponseBody
    public String ttpushIos(String adid, String cid, String idfa, String mac, String os,
            String timestamp, String convert_id, String callback) {


        TouTiao touTiao =
                new TouTiao(adid, cid, idfa, mac, os, timestamp, convert_id, callback, "", "0", "");

        logger.info("今日头条回馈IOS数据" + touTiao.toString());

        touTiaoService.insertSelective(touTiao);//持久化

        return "success";

    }
iOS和安卓的接口信息字段不一样,也可能会变,参照最新的头条文档就行,总之需要吧数据存储到本地
2、接受客户端传递的设备信息,这个就是普通的接口,自己写下就行,这里不贴代码了
3、接受到头条和客户端的设备信息后,监测服务器需要比对,并将信息反馈给头条
具体处理代码就不贴了,下面贴下签名和加密部分
// 使用 HMAC-SHA1 签名方法对对url进行签名
                String sig = "";
                try {
                    sig = new HmacSHA1Util().HmacSHA1Encrypt(url, key);
                } catch (Exception e) {
                    logger.info("HMAC-SHA1 签名方法对对url进行签名失败");
                    e.printStackTrace();
                }

下面是工具类的源码:
public class HmacSHA1Util {
    private static final String MAC_NAME = "HmacSHA1";
    private static final String ENCODING = "UTF-8";

    /**
     * 使用 HMAC-SHA1 签名方法对对encryptText进行签名
     * 
     * @param encryptText 被签名的字符串
     * @param encryptKey 密钥
     * @return 返回被加密后的字符串
     * @throws Exception
     */
    public static String HmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception {
        byte[] data = encryptKey.getBytes(ENCODING);
        // 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
        SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);
        // 生成一个指定 Mac 算法 的 Mac 对象
        Mac mac = Mac.getInstance(MAC_NAME);
        // 用给定密钥初始化 Mac 对象
        mac.init(secretKey);
        byte[] text = encryptText.getBytes(ENCODING);
        // 完成 Mac 操作
        byte[] digest = mac.doFinal(text);
        StringBuilder sBuilder = bytesToHexString(digest);
        return sBuilder.toString();
    }

    /**
     * 转换成Hex
     * 
     * @param bytesArray
     */
    public static StringBuilder bytesToHexString(byte[] bytesArray) {
        if (bytesArray == null) {
            return null;
        }
        StringBuilder sBuilder = new StringBuilder();
        for (byte b : bytesArray) {
            String hv = String.format("%02x", b);
            sBuilder.append(hv);
        }
        return sBuilder;
    }

    /**
     * 使用 HMAC-SHA1 签名方法对对encryptText进行签名
     * 
     * @param encryptData 被签名的字符串
     * @param encryptKey 密钥
     * @return 返回被加密后的字符串
     * @throws Exception
     */
    public static String hmacSHA1Encrypt(byte[] encryptData, String encryptKey) throws Exception {
        byte[] data = encryptKey.getBytes(ENCODING);
        // 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
        SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);
        // 生成一个指定 Mac 算法 的 Mac 对象
        Mac mac = Mac.getInstance(MAC_NAME);
        // 用给定密钥初始化 Mac 对象
        mac.init(secretKey);
        // 完成 Mac 操作
        byte[] digest = mac.doFinal(encryptData);
        StringBuilder sBuilder = bytesToHexString(digest);
        return sBuilder.toString();
    }
}

base64加密
 // 对其进行base64加密
                sig = new Base64Util().getBase64(sig);
                url = url + "&signature=" + sig;
工具类源码:
public class Base64Util {
    // 加密
    public static String getBase64(String str) {
        byte[] b = null;
        String s = null;
        try {
            b = str.getBytes("utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        if (b != null) {

            s = Base64.encodeBytes(b);
        }
        return s;
    }

    // 解密
    public static String getFromBase64(String s) {
        byte[] b = null;
        String result = null;
        if (s != null) {
            try {
                b = Base64.decode(s);
                result = new String(b, "utf-8");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    public static void main(String[] args) {
        String string1 = "你好nnnn!";
        System.out.println(getBase64(string1));
        System.out.println(getFromBase64(getBase64(string1)));
    }
}

广告主配置:

以上都准备号了之后,下面进入头条网站,新建转化,下面说下这几个东西都怎么填写
需要用户填写的就是1、2、5项
对于第5项
填写过程中,一定要仔细比对,一旦提交不能更改,只能再次新建
其余的就可以参照头条的API文档进行编写了
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

今日头条(OCPC)广告激活数据对接-JAVA版 的相关文章

随机推荐

  • Liunx创建新用户登录异常:/usr/bin/xauth: error/timeout in locking authority file /home/liuqidong/.Xauthority

    Liunx创建新用户登录异常 usr bin xauth error timeout in locking authority file home liuqidong Xauthority 问题1 在服务器上创建新的用户userA 在使用s
  • c++ 中vector的count是unsigned int而C#中泛型的count为int

    需要注意的 在使用一个返回值之前 要知道这个返回值是什么类型的 不要根据自己的臆断来写 否则c 很多bug不知道原因 十分注意 对比的时候 是自动转成unsigned int类型进行比较的 Orz C 中的泛型 用count都是int类型
  • 连通图的桥(对桥和割点的理解)

    题目链接 https cn vjudge net problem UVA 796 顺便总结一下 对于连通图的桥和割点 首先 从tarjan的角度来说 dfn数组代表的是当前节点的编号 也就是时间戳 low数组代表的是当前节点能够到达的最早的
  • 利用SqlServer触发器自动更新表updatetime字段值

    本文主要记录了使用SqlServer数据库触发器自动更新表的 更新时间updatetime 字段 在 MySQL数据库中 某行数据创建时间字段 createtime 行最新更新时间字段updatetime 可建表时分别用 datetime
  • 【k8s集群管理工具篇】安装kubernetes集群管理工具 - Kuboard v3版本

    k8s集群管理工具篇 安装kubernetes集群管理工具 Kuboard v3版本 一 kuboard介绍 1 kuboard解释 2 kuboard的V3版本 二 安装kuboard 1 下载yaml文件 2 安装kuboard 三 查
  • 使用PIL实现图像的二值化和灰度化DIY

    使用PIL实现图像的二值化和灰度化并输出保存 精简版代码如下 图片二值化 from PIL import Image img Image open r W PY newpicpic bbvvasd jpg 模式L 为灰色图像 它的每个像素用
  • 编译KArchive在windows10下

    使用QT6和VS2019编译KArchive的简要步骤 安装 Qt 我是用源码自己编译的 F qtbuild 安装CMakefile并配置环境变量 安装Git 下载ECM源码 https github com KDE extra cmake
  • linux安装mysql的两种方式

    一 安装到linux 1 安装mysql server 1 在安装之前查看下系统是否已经安装了mysql ls usr share 2 安装mysql server sudo apt get install mysql server 3 再
  • Linux查看并杀死进程

    Linux查看并杀死进程 查看进程 方法一 lsof i 80 i lt 条件 gt 列出符合条件的进程 协议 端口 ip 方法二 netstat anp grep 进程ID a或 all 显示所有连线中的Socket n或 numeric
  • 基于springboot,hdfs的网盘系统(查看,上传,下载,删除,新建文件)

    基于maven的springboot项目 项目目录如下 类路径如下 HDFSREQUEST package cn object demo02 controller import lombok Data import lombok AllAr
  • JAVA中常用的Queue的介绍

    目录 1 java中队列的分类以及队列的介绍 2 PriorityQueue队列的介绍 2 1 PriorityQueue继承结构和方法解读 2 2 PriorityQueue的构造器的实现 3 Deque 双向队列 的简单介绍 3 1 A
  • H . 真签到题

    题目链接 题目描述 Fibonacci 数列 f n f n 1 f n 2 前n项为1 1 2 3 5 8 给出n m 需要你计算出满足条件的对数 i j 的个数 且i lt j 条件是 1 lt gcd f i f j lt n i j
  • 2021-01-23MNIST 测试实战

    通过多个 step 来完成整个训练集的一次迭代 叫做一个 Epoch 在实际训练时 通常需要对数据集迭代多个 Epoch 才能取得较好地训练效果 for epoch in range 20 完成一个 Batch 的数据训练 叫做一个 Ste
  • Docker笔记--查看本地镜像、搜索镜像、拉取镜像和删除镜像

    目录 1 查看本地镜像 2 搜索镜像 3 拉取镜像 4 删除镜像 1 查看本地镜像 sudo docker images 其中 REPOSITORY 表示镜像的名称 TAG 表示版本号 默认下载最新版本latest IMAGE ID表示镜像
  • 创业之路-67]:创业公司不同的产品模式

    模式1 科研型 预研型 3 5年 市场还不成熟 需求还没有显性 属于预测性需求 行业内还没有的成熟的产品形态 行业和自身的技术也都不成熟 还需要一定的酝酿期和技术积累 产品研发通常需要三年以上 甚至五年以上 需要投资资金烧钱 做未来的事 前
  • python读取fits第三方库_python-astropy.io.fits从具有多个HDU的大型fits文件中读取行

    我有一个约50GB的fits文件 其中包含多个HDU 它们都具有相同的格式 一个带有1E5对象和1E6时间戳的 1E5 x 1E6 数组 HDU描述了不同的物理属性 例如磁通 RA DEC等 我只想从每个HDU中读取5个对象 即 5 x 1
  • Databend 开源周报 第 97 期

    Databend 是一款现代云数仓 专为弹性和高效设计 为您的大规模分析需求保驾护航 自由且开源 即刻体验云服务 https app databend cn What s On In Databend 探索 Databend 本周新进展 遇
  • v.douyin.com生成制作抖音缩短口令网址php接口方法

    v douyin com是抖音官方的接口 可以制作头条 火山 抖音短视频等官方域名的任意生成接口 可以推广抖音号 第三方网址 头条文章等 效果非常号 这里记录下api接口 纯技术php生成 具体规则可以去抖音的开放平台去申请对应接口 这里用
  • 原码,反码,补码

    版权声明 本文为博主原创文章 未经博主允许不得转载 https blog csdn net Jason M Ho article details 78700434 数值在计算机中是以补码的方式存储的 在探求为何计算机要使用补码之前 让我们先
  • 今日头条(OCPC)广告激活数据对接-JAVA版

    最近在今日头条投广告 头条反馈可以按照实际激活数据的转换来付费 也就是说 只有用户真的下载并打开应用了才收费 过程类似与早年间的GHOST系统预装软件 下面说下头条的整个逻辑 头条处理逻辑 1 用户在头条点击广告页 广告页引领用户去下载 用