今日頭條移動 APP 廣告啟用資料API對接實踐

NO IMAGE

作為最火的新聞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__&timestamp=__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__&timestamp=__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=