先说一个故事,代理商在广告平台投放了广告,突然被客户要求,想在投放的 APP 上能刷到广告真实的样子,并且能完整的体验广告流程。这让代理商为难了,因为广告投放出去了,最终的投放效果也都以数据呈现,曝光多少量、点击多少量等等。于是,代理商找到广告公司的运营,运营找到产品,产品找到测试同学,测试也会很无奈。
广告投放是一种策略型投放,有很大随机性,一般很难刷到某个具体创意的广告。
我们的诉求,如何在 APP 上预览指定创意的广告?
APP 一般通过嵌入的广告 SDK 提供的 API 来发起广告请求,随后广告 SDK 向广告服务端请求广告,广告服务端返回广告
广告 SDK 向广告服务端请求广告时,广告请求体有很多信息,如手机设备唯一标识 AndroidID、广告位 Slotid
在广告投放平台中创意是投放的最小维度,它是一串 ID,广告
服务端通过创意 ID,读取广告投放平台的数据库,把广告素材拼接成广告物料返回至手机 APP 端
物料定向平台提供一个前端界面用来做定向配置,
维度包括:
手机根据配置的广告位来请求广告
通过 MitmProxy 服务器,将广告请求转发至物料定向平台,这里用 Mock Service 代替,并得到用户配置规则列表
Mock Service 通过创意 ID,将拼接好的物料返回至 Mitmproxy 服务器
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()
]
@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') //返回拼接的广告物料
get_body()
def get_body(data):{
通过创意ID,查询数据库,读取数据库,拼接物料
}
1.截获广告请求,篡改广告服务端返回。即没有任何过滤条件,100% 下发至手机;
2.不受任何人群包、广告实验配置、用户分流、地域等影响,在用户配置的栏位上直接下发指定创意的广告;
3.无需是否是线上真实投放的广告,即零成本体验;
4.生效时间实时,配置即生效,即实时下发至手机。
1.手机需连代理,装证书;(每个手机装证书的难度不一样,不过只需装一次);
2.服务部署在测试服务器,且手机需与服务器在同一局域网,即公司内网人员使用,外部客户不支持;
3.拼接广告物料服务是按照广告服务端逻辑做的,若广告服务有逻辑代码改动,拼接广告物料服务也需做相应调整。
1.手机连了 Mitmproxy 服务代理后,会导致有些网络不可用,如进入应用商店无法下载 APK。
答:增加 SSL Proxying Setting 配置
2.线上广告接口内容是加密的,如何处理?
答:引入公司加解密服务,可加密,可解密,也有些公司的广告物料接口是不加密的
3.如何获取手机设备唯一标识 android_id?
答:定向手机有很多方案,设备标识有 imei、oaid、android_id,用现有抓包工具都可获取,或者使用 dumpweb 启动代理服务,可在线抓包
4.在手机 APP 上如何判断 Mock 广告成功?
答:可在广告渲染地方加一些特定标识,如显示广告来源的地方
5.开发该工具使用到了哪些框架?
答:Python+Mitmproxy+Flask