
一名二三线城市物联网行业程序员,从硬核游戏已转为休闲玩家,非著名脑洞开发者。感谢您抽出时间来阅读我的文章,开心地多啃了三根草。
想必现在小伙伴们浏览网站、APP等应用时,经常会遇到的一个东西,那就是 广告。
想当初互联网刚刚兴起的时候,广告还没有这么铺天盖地,就像娇羞的黄花大闺女,即使出现,也只是躲在一个小角落里。
但现在的广告,就像猛虎下山,恨不得怼你脸上:

许多人开始麻木,或者说许久这么过来,已经习惯被侵犯主动选择权,但卡卡想说 不!
今天卡卡将利用python将这些广告剔除,还自己一片净土。
本次卡卡利用的手段,就是通过 mitmproxy 来实现的。
mitmproxy 是一款开源的抓包工具,支持 SSL 的 HTTP 代理,可用于 HTTP 通信调试、发起中间人攻击等场景,并能配合自定义 python 脚本扩展功能。
与 Fiddler 或 Wireshark 等工具不同的是,mitmproxy 不仅能够截获并查看、分析请求,还可通过自定义脚本进行二次开发,实现更灵活的抓包与调试操作。
所以,它最重要的特点即为:可以用python编码,发起中间人攻击。

mitmproxy 像一个中间人一样,将我们的请求转发给服务器,然后再将服务器返回的数据,转交给我们。
在这转交的过程中,我们就可以利用python脚本进行数据篡改,这就是我们本次脚本的核心。
明白了是怎么回事,我们就准备动手,拦截广告。
pip install mitmproxy我们有三种运行方式:
我们可以首先运行 mitmweb 来查看:

运行成功后会打开浏览器,出现一个网页:

此时,需要设置代理:

设置成功后,登录:http://mitm.it/

下载相应的证书并安装。
如果 mitm.it 出现 "If you can see this, traffic is not going through mitmproxy.",则表示你的代理没有添加成功,无法访问。
安装完证书,我们再来查看 mitmweb 的网页,你会发现有不少接口,说明你已经成功运行:

在编写代码之前,我们使用 F12 打开浏览器的控制台,通过 Network(网络) 来寻找广告对应的链接:

如何寻找广告链接:全凭经验与直觉!
可以看到产生广告的目标链接有 https://pagead2.googlesyndication.com(谷歌广告相关链接非常多,不单单只有这一个)。
为了最快见效,现在卡卡将把包含 google 的所有链接返回的内容全部篡改,这样就能安全去除广告:
# main.pyfrom mitmproxy import httpdefrequest(flow: http.HTTPFlow) -> None:"""拦截请求阶段""" url = flow.request.pretty_url.lower() host = flow.request.host.lower()if host.find('google') != -1:print(f'禁用 {url}{host}') flow.response = http.Response.make(404, b'')return终端运行:
mitmdump -s main.py 此时再回到之前充满广告的网站一看,果然清清爽爽,安全无异味:

mitmproxy 能干的事情非常多,今天卡卡只是用了一个小小的案例,就将讨厌的广告全部去除,而聪明的你可能会想出更多使用它的方法。
往期回顾:
凭什么python框架加了异步性能就提升了,同步和异步到底有什么区别?