一、背景

先说一个故事,代理商在广告平台投放了广告,突然被客户要求,想在投放的 APP 上能刷到广告真实的样子,并且能完整的体验广告流程。这让代理商为难了,因为广告投放出去了,最终的投放效果也都以数据呈现,曝光多少量、点击多少量等等。于是,代理商找到广告公司的运营,运营找到产品,产品找到测试同学,测试也会很无奈。
广告投放是一种策略型投放,有很大随机性,一般很难刷到某个具体创意的广告。
我们的诉求,如何在 APP 上预览指定创意的广告?

二、设计思路

1、广告请求链路

APP 一般通过嵌入的广告 SDK 提供的 API 来发起广告请求,随后广告 SDK 向广告服务端请求广告,广告服务端返回广告

2、APP 设备维度

广告 SDK 向广告服务端请求广告时,广告请求体有很多信息,如手机设备唯一标识 AndroidID、广告位 Slotid

3、广告服务端如何拼接广告物料

在广告投放平台中创意是投放的最小维度,它是一串 ID,广告
服务端通过创意 ID,读取广告投放平台的数据库,把广告素材拼接成广告物料返回至手机 APP 端

三、架构设计

1、配置规则

物料定向平台提供一个前端界面用来做定向配置,
维度包括:

1.手机设备唯一标识。用来定向某个生效的手机;

2.广告位 Slotid。用来定向生效的广告栏位;

3.创意 ID。用来指定创意广告

2、广告请求

手机根据配置的广告位来请求广告

3、请求物料

通过 MitmProxy 服务器,将广告请求转发至物料定向平台,这里用 Mock Service 代替,并得到用户配置规则列表

4、拼接物料

Mock Service 通过创意 ID,将拼接好的物料返回至 Mitmproxy 服务器

5、根据规则返回物料

Mitmproxy 服务器将物料返回至手机,手机渲染并展示广告,从而达到了预览指定创意广告的目的

四、伪代码片段

1、Mitmproxy 代理服务

from mitmproxy import http
from mitmproxy import flowfilter
class demo(){
    def init(){
        self.filter = flowfilter.parse(host) //过滤该域名流量
    }
    def request(self, flow: http.HTTPFlow) -> None:{
    if flowfilter.match(self.filter, flow){ //匹配该流量时进行截获
        resquest_body = flow.request.data.content //获取广告请求体
        response_body =get_v4_json(resquest_body)//获取通过创意ID拼接好的物料
        if response_body:
            flow.response = http.HTTPResponse.make(200, body, {"Content-Type": "application/json"}) //将拼接好的物料返回给APP
    }
   }
}
addons = [
    demo()
]

2、Mock Service 服务

1.拼接广告物料入口

@app.route('/ad/v4/json', methods=['POST'])
def v4_json(): //广告拼接物料服务
    data = request.get_json() //获取广告请求体
    body = ad_model.get_body(data) //拼接广告物料
    return Response(simplejson.dumps(body), mimetype='application/json') //返回拼接的广告物料

2.拼接广告物料get_body()

def get_body(data):{
    通过创意ID查询数据库读取数据库拼接物料
}

五、结束语

1、优点

1.截获广告请求,篡改广告服务端返回。即没有任何过滤条件,100% 下发至手机;
2.不受任何人群包、广告实验配置、用户分流、地域等影响,在用户配置的栏位上直接下发指定创意的广告;
3.无需是否是线上真实投放的广告,即零成本体验;
4.生效时间实时,配置即生效,即实时下发至手机。

2、缺点

1.手机需连代理,装证书;(每个手机装证书的难度不一样,不过只需装一次);
2.服务部署在测试服务器,且手机需与服务器在同一局域网,即公司内网人员使用,外部客户不支持;
3.拼接广告物料服务是按照广告服务端逻辑做的,若广告服务有逻辑代码改动,拼接广告物料服务也需做相应调整。

3、常见问题

1.手机连了 Mitmproxy 服务代理后,会导致有些网络不可用,如进入应用商店无法下载 APK。
答:增加 SSL Proxying Setting 配置
2.线上广告接口内容是加密的,如何处理?
答:引入公司加解密服务,可加密,可解密,也有些公司的广告物料接口是不加密的
3.如何获取手机设备唯一标识 android_id?
答:定向手机有很多方案,设备标识有 imei、oaid、android_id,用现有抓包工具都可获取,或者使用 dumpweb 启动代理服务,可在线抓包
4.在手机 APP 上如何判断 Mock 广告成功?
答:可在广告渲染地方加一些特定标识,如显示广告来源的地方
5.开发该工具使用到了哪些框架?
答:Python+Mitmproxy+Flask


↙↙↙阅读原文可查看相关链接,并与作者交流