1.配置点击监听,拿到媒体转换数据
/**
* 点击监听
*
* @param request
* @param response
*/
@RequestMapping("/click/{code}")
public void adClick(HttpServletRequest request, HttpServletResponse response) {
Map<String, Object> parameterMap = parameterMap(request);
OceanEngineReq req =null;
try {
req = MapUtils.mapToBean(parameterMap, OceanEngineReq.class);
} catch (Exception e) {
parameterMap.forEach((k,v)->{
System.out.println(k+"->"+v);
});
logger.error("媒体数据转化失败" + request.getRequestURI(), e);
}
try {
if(req!=null){
oceanEngineService.processOceanEngineData(request, req, MediumType.CLICK);
}
} catch (Exception e) {
logger.error("自归因失败" + request.getRequestURI(), e);
}
}
package com.youguo.wl.model.req;
import lombok.Data;
import lombok.ToString;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
/**
* @Classname OceanEngineReq
* @Description 描述
* @Date 2021/9/15 0015 10:09
* @@author lqh
*/
@Data
@ToString(callSuper = true)
public class OceanEngineReq extends BaseReq {
private static final long serialVersionUID = 4464749435603779280L;
/** 广告计划id **/
private String aid;
/** 广告计划名称 **/
private String aid_name;
/** 广告主id **/
private String advertiser_id;
/** 广告创意 id,长整型 **/
private String cid;
/** 广告创意名称 **/
private String cid_name;
/** 广告组 id **/
private String campaign_id;
/** 广告组名称 **/
private String campaign_name;
/**
* 创意样式 2=小图模式 3=大图模式 4=组图模式 5=视频
*/
private String ctype;
/**
* 广告投放位置 今日头条:1-10000,80000-110001 西瓜视频:10001-10099 火山小视频:30001-30099 抖音:40001-40099 穿山甲开屏广告:800000000
* 穿山甲网盟非开屏广告:900000000 通投广告位:33013 搜索:38016
*/
private String csite;
/** 转化id **/
private String convert_id;
/** 请求下发的id **/
private String request_id;
/** 这次请求的语言 **/
private String sl;
/** IOS 6+的设备id字段,32位 **/
private String idfa;
/** Android Q及更高版本的设备号的md5摘要,32位 **/
private String oaid_md5;
/**
* 操作系统平台 安卓:0 IOS:1 其他:3
*/
private String os;
/**
* 移动设备mac地址,转换成大写字母,去掉“:”,并且取md5摘要后的结果
**/
private String mac;
/** 移动设备 mac 地址,转换成大写字母,并且取md5摘要后的结果,32位 **/
private String mac1;
/**
* 媒体投放系统获取的用户终端的公共IP地址
**/
private String ip;
/** 用户代理(User Agent) **/
private String ua;
/** 位置信息,包含三部分:latitude(纬度),longitude(经度)以及precise(确切信息,精度) **/
private String geo;
/** 客户端发生广告点击事件的时间,以毫秒为单位时间戳 **/
private Long ts;
/** 回调参数,内容是一个加密字符串,在调用事件回传接口的时候会用到 **/
private String callback_param;
/** 直接把调用事件回传接口的url生成出来,广告主可以直接使用 **/
private String callback_url;
/** 手机型号 **/
private String model;
/** 对外广告位编码 **/
private String union_site;
/** 不同版本的中国广告协会互联网广告标识,CAID1是20201230版 **/
private String caid1;
/** 暂无CAID2 **/
private String caid2;
private String vid;
}
package com.youguo.wl.model.req;
import com.youguo.wl.base.util.DeviceIdUtils;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
/**
* @Classname BaseReq
* @Description 描述
* @Date 2021/9/15 0015 15:03
* @@author lqh
*/
@Data
public class BaseReq implements Serializable {
private static final long serialVersionUID = -4090116648703791619L;
/** 设备唯一key **/
private String deviceId;
/** 安卓的设备 ID 的 md5 摘要,32位 **/
private String imei;
/** 安卓id原值的md5,32位 **/
private String androidid;
/** Android Q及更高版本的设备号,32位 **/
private String oaid;
private boolean hasDevice=true;
public String getDeviceId() {
StringBuilder id=new StringBuilder();
if(StringUtils.isNotEmpty(this.imei)){
id.append(this.imei);
}
if(StringUtils.isNotEmpty(this.oaid)){
id.append(this.oaid);
}
if(StringUtils.isNotEmpty(this.androidid)){
id.append(this.androidid);
}
if(id.length()==0){
id.append("-1");
this.hasDevice=false;
}
return id.toString();
}
public void setImei(String imei) {
this.imei = DeviceIdUtils.dealImei(imei);
}
public void setAndroidid(String androidid) {
this.androidid = DeviceIdUtils.dealAndroidid(androidid);
}
public void setOaid(String oaid) {
this.oaid = DeviceIdUtils.dealOaid(oaid);
}
}
package com.youguo.wl.base.util;
/**
* 设备id处理
*
*/
public class DeviceIdUtils {
public static String dealImei(String imei) {
if(imei==null) {
return null;
}
imei = imei.trim();
if("".equals(imei) || "null".equals(imei.toLowerCase()) || imei.matches("0+")) {
return null;
}
return imei;
}
public static String dealOaid(String oaid) {
if(oaid==null) {
return null;
}
oaid = oaid.trim();
if("".equals(oaid) || "null".equals(oaid.toLowerCase()) || oaid.replaceAll("-", "").matches("0+")) {
return null;
}
return oaid;
}
public static String dealAndroidid(String androidid) {
if(androidid==null) {
return null;
}
androidid = androidid.trim();
if("".equals(androidid) || "null".equals(androidid.toLowerCase()) || androidid.matches("0+")) {
return null;
}
return androidid;
}
}
public Map<String,Object> parameterMap(HttpServletRequest request)
{
// logger.info(map.get("order[0][column]"));//排序字段列
//logger.info(map.get(ordebynamekey));//排序字段
//logger.info(map.get("order[0][dir]"));//排序方式
Map<String,String[]> prmap=request.getParameterMap();
Map<String,Object> parameterMap=new HashMap<>();
String key; String value[];
int lens;
int i;
StringBuffer valestr=new StringBuffer();;
for (Map.Entry<String, String[]> entry : prmap.entrySet())
{
key=entry.getKey();
value=entry.getValue();
// System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
lens=value==null?0:value.length;
valestr=new StringBuffer();
for(i=0;i<lens;i++)
{
if(i>0)
valestr.append(",");
valestr.append(value[i]);
}
parameterMap.put(key,valestr.toString());
}
//处理排序字段
// String ordebynamekey= "columns["+parameterMap.get("order[0][column]")+"][data]";
String ordebycolname;
value=prmap.get("order[0][column]");
lens=value==null?0:value.length;
String ordeyType = (String) parameterMap.get("order[0][dir]");
ordeyType=ordeyType==null?"":ordeyType.trim().toLowerCase();
boolean isfirst=true;
valestr=new StringBuffer();
if(ordeyType.equals("desc") && lens>0)
{
valestr.append(" order by ");
for(i=0;i<lens;i++ )
{
ordebycolname = "columns[" + value[i] + "][data]";;
if(!StringUtils.isBlank(ordebycolname))
{
if(!isfirst)
valestr.append(",");
valestr.append(request.getParameter(ordebycolname));
valestr.append(" desc");
isfirst=false;
}
}
}
else if(lens>0)
{
valestr.append(" order by ");
for(i=0;i<lens;i++ )
{
ordebycolname = "columns[" + value[i] + "][data]";;
if(!StringUtils.isBlank(ordebycolname))
{
if(!isfirst)
valestr.append(",");
valestr.append(request.getParameter(ordebycolname));
isfirst=false;
}
}
valestr.append(" asc ");
}
parameterMap.put("datatableorderby",valestr.toString());
return parameterMap;
}
2.从点击监听获取 callback_param 回调参数,内容是一个加密字符串,在调用事件回传接口的时候会用到,回传媒体,oaid必须传,否则媒体无法识别设备
private static String ACTIVATE_URL = "https://ad.oceanengine.com/track/activate/";
/**
* 转化事件回调服务
*
* @param callback
* 监测链接参数
* @param event_type
* 事件类型对应媒体api:0-激活,6-次留
* @param props = String.format("&imei=%s&oaid=%s&oaid_md5=%s&caid1=%s&caid2=%s&os=%s&conv_time=%s", req.getImei(),
* oaid, oaid_md5, caid1, caid2, os, System.currentTimeMillis() / 1000L);
* @return
*/
public static HashMap<String, String> uploadEven(String callback, Integer event_type,String props ) {
String url = ACTIVATE_URL +"?callback="+ callback +"&event_type="+ event_type+props;
try{
HashMap<String, String> result= HttpClientUtils.get(url);
if("ok".equals(result.get("result_code").toString())){
logger.info("回传媒体成功:事件{},参数{},结果{}",event_type,url,result.get("result_data"));
}else {
logger.info("回传媒体失败:事件{},参数{},结果{}",event_type,url,result.get("result_data"));
}
return result;
}catch (Exception e){
logger.error("回传媒体失败:事件{},参数{},原因{}",event_type,url,e);
}
return null;
}