作为最火的新闻app,今日头条有这很大的活跃用户群和日访问量。大流量决定了今日头条会位商品做广告。
1.如下为今日头条的广告收费方案(来自官方开发文档):
激活数是 APP 广告主衡量转化效果的重要指标之一,为满 今日头条(以下简称头条)广告主 对广告效果的监测需求,本文档介绍如何把从头条广告渠道分发的 APP 激活数回传给头条广告平台, 帮助广告主跟踪转化效果。 对于回调了激活数据的广告计划,头条支持 oCPC(目标激活成本出价)竞价方式,帮助优化转化。回调方案适用于 Android 和 iOS。
2.其数据流示意图:
3.需要了解的一些操作界面示意图:
4.今日头条广告激活联调的流程:以头条用户为例:
1) 头条用户点击广告,下载app此时会通知服务器;服务器会将其激活记录保存到数据库中;
2)用户安装app这是app会调用服务器接口,将该手机的相关唯一信息传递到后台,后台通过匹配该手机的app是否为今日头条广告下载;如果匹配成功,调用今日头条回调函数,通知记为一次激活状态进行扣费。
5.接下来不多说我们进行代码开发分析演示:
首先我们需要明确,本次开发需要提供两个接口:(1)服务器接收头条点击广告信息时的请求接口一;(2)广告app安装应用时需要调用接口通知服务器相关信息,用该信息进行匹配是否为头条界面被点击是下载的应用;匹配成功后服务器调用接口二通知头条广告服务器进行扣费(如果有需要可以设置服务器的扣费级别,在某种级别以上才调用接口二进行扣费)。
1) __参数__形式:
a) iOS 示例
http://xxxx.xxx.com?adid=__AID__&cid=__CID__&idfa=__IDFA__&mac=__MAC__&os=__OS__×tamp=__TS__&convert_id=__CONVERT_ID__&callback=__CALLBACK_PARAM__
b) 安卓示例
http://xxxx.xxx.com?adid=__AID__&cid=__CID__&imei=__IMEI__&mac=__MAC__&androidid=__ANDROIDID1__&os=__OS__×tamp=__TS__&convert_id=__CONVERT_ID__&callback=__CALLBACK_PARAM__
2)不多说按以上逻辑进行代码展示(安卓为例):
// 安卓获取头条推送数据
@RequestMapping(value = "/ttpushAndorid", method = RequestMethod.GET)
@ResponseBody
public String ttpushAndroid(String adid, String cid, String imei, String mac, String androidid,
String os, String timestamp, String convert_id, String callback) {
TouTiao touTiao = new TouTiao(adid, cid, "", mac, os, timestamp, convert_id, callback, imei,
"0", androidid);
logger.info("今日头条回馈安卓数据" + touTiao.toString());
touTiaoService.insertSelective(touTiao);
return "success";
}
3)匹配信息,进行今日头条激活回调
/**
* 客户端返回设备信息
*
* @param code
* @param responseCommand
* @return
*/
@RequestMapping(value = "/deviceInfo", method = RequestMethod.POST)
@ResponseBody
public ResponseCommand deviceInfo(@RequestBody String code, ResponseCommand responseCommand,
HttpServletRequest request) {
logger.info("调用设备信息接口"+code);
JSONObject JsonData = JSON.parseObject(code);
Deviceinfo deviceinfo = JSON.parseObject(JsonData + "", Deviceinfo.class);
logger.info("手机端推送信息:"+deviceinfo.toString());
Date date = new Date();
deviceinfo.setCreatetime(date);
deviceinfo.setUpdatetime(date);
deviceinfoService.saveDeviceInfo(deviceinfo);
// 判断本次注册的用户是否为头条推广路径,吸收的用户
String imei = new MD5Util().string2MD5(deviceinfo.getImei());
// 匹配os,idfa,imei来确定是否为头条推广的
logger.info("匹配os,idfa,imei来确定是否为头条推广的:"+deviceinfo.getOs()+","+deviceinfo.getIdfa()+","+imei+","+deviceinfo.getAndroidid());
List<TouTiao> touTiaos = touTiaoService.findTouTiaoByOsIdfaImei(deviceinfo.getOs(),
deviceinfo.getIdfa(), imei, deviceinfo.getAndroidid());
logger.info("配到的头条推送信息:"+touTiaos.get(0).toString());
if (touTiaos != null && touTiaos.size() > 0) {
String toutiaoWay = PropertiesUtil.getValue("WebConfig.properties", "toutiaoWay");
if ("1".equals(toutiaoWay)) {
//广告系统用于区别点击的唯一标识 ,来源于接口一的CALLBACK_PARAM
String callback_param = touTiaos.get(0).getCallbackUrl();
String muid = "";
//0–Android;1–iOS
String os = touTiaos.get(0).getOs();
//默认为安卓key
String key = "383e7775-1b52-425c-8066-7478a5abcaf1";
//安卓:IMEI 号取md5sum 摘要; IOS:IDFA 号原值
if (os != null && "0".equals(os)) {
muid = new MD5Util().string2MD5(touTiaos.get(0).getImei());
} else {
muid = touTiaos.get(0).getIdfa();
//IOS的key
key = "8da355c8-c7ac-4faf-935f-d7b5b0d258e8";
}
//激活效果统计时间
long conv_time = touTiaos.get(0).getCreatetime().getTime();
//比如来自 talkingdata的激活回调, 可以填 写 TD
String url = "http://ad.toutiao.com/track/activate/?callback=" + callback_param
+ "&muid=" + muid + "&os=" + os + "&source=td&conv_time=" + conv_time;
//使用 HMAC-SHA1 签名方法对对url进行签名
String sig = "";
try {
sig = new HmacSHA1Util().HmacSHA1Encrypt(url, key);
} catch (Exception e) {
logger.info("HMAC-SHA1 签名方法对对url进行签名失败");
e.printStackTrace();
}
//对其进行base64加密
sig = new Base64Util().getBase64(sig);
url =url+"&signature=" + sig;
logger.info("地址展示:"+url);
try {
String rel=HttpUtils.get(url);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return returnResult(ErrorCode.ERR_CODE_STATUS_TRUE, ErrorCode.ERR_CODE_SUCCESS,
responseCommand);
}
注:具体今日头条回调url的生成算法:
signature 生成方法:
1) 参数定义:
key:每个广告主都特有的密钥,只有广告主自己知道。key 的获取方式:广告主在头条广告后台(ad.toutiao.com)转化跟踪工具箱里创建转化之后,系统会自动生成密钥
url:每个调用接口二的 url
例: key = "945948789875"
url="http://ad.toutiao.com/track/activate/?callback=12334_334_434_2323_4334_2343_www.gdt.com&muid=KHK-SD-DFK&os=1&source=td&conv_time=1463414400"
2) 组合参数
sig = hmac.new(str(key), str(url), sha1).digest()
3) 参数加密
sig = base64.urlsafe_b64encode(sig)
url = url +‘&signature=’+ sig
4) 组装回调请求:
加密前 ULR 格式:
http://ad.toutiao.com/track/activate/?callback={callback_param}&muid={muid}&os={os}&source={source}&conv_time={conv_time}
加密之后 URL 格式:
http://ad.toutiao.com/track/activate/?callback={callback_param}&muid={muid}&os={os}&source={source}&conv_time={conv_time}&signature={signature}
例:
http://ad.toutiao.com/track/activate/?callback=12334_334_434_2323_4334_2343_www.gdt.com&muid=KHK-SDDFK&os=1&source=td&conv_time=1463414400”&signature=3ZWd3tXFXIN8rmySDgbYBIn5BAc=