研发效能 Mitmproxy 实践之 APP 预览指定创意的广告

罗汉 · 2022年07月04日 · 最后由 孤舟蓑笠翁 回复于 2022年07月08日 · 5967 次阅读

一、背景

先说一个故事,代理商在广告平台投放了广告,突然被客户要求,想在投放的 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

最佳回复

直接用 Charles 的 maplocal 功能 mock 广告服务器返回的物料接口不就能稳定让某一条广告出现在宿主端了吗?

共收到 3 条回复 时间 点赞

直接用 Charles 的 maplocal 功能 mock 广告服务器返回的物料接口不就能稳定让某一条广告出现在宿主端了吗?

可以的,我们这个用户群体主要是产品和运营。

罗汉 回复

最麻烦的其实是三方广告 sdk,我们是拿不到他们的具体物料的,三方物料加密或者三方返回我们一大堆的数据,但是我们可能只需要其中的一部分字段,不找研发一个个对,确实这类广告是最不稳定出来的

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册