V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wunonglin
V2EX  ›  问与答

如何反广告拦截?

  •  
  •   wunonglin · 102 天前 · 3058 次点击
    这是一个创建于 102 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例如:www.bilibili.com

    访问主站通过 GET www.bilibili.com 打开,

    然后 bilibili 所有接口(这里注意,是所有的接口)通过 POST www.bilibili.com 在 body 通过{cmd: "XXX"}的形式加载,

    这样是否可以达到屏蔽域名你也不能正常访问网站?

    第 1 条附言  ·  102 天前
    问题的本意是:“设计一个你不能屏蔽我网站的接口不然你就不能正常使用我的网站”

    例如正常的设计是:
    网站:www.bilibili.com
    用户接口 www.bilibili.com/api/user/1
    广告接口 www.bilibili.com/api/ad/2021-01-01

    按上面设计打开网站的话会去请求用户信息和广告信息。
    如果有人屏蔽了 www.bilibili.com/api/ad/* 这样会导致广告不能正常加载,达到屏蔽广告的效果。

    如果我这样设计:
    网站:GET www.bilibili.com
    用户接口 POST www.bilibili.com body:{cmd: "user", param: 1}
    广告接口 POSt www.bilibili.com body:{cmd: "ad", param:"2021-01-01"}

    这样如果你想屏蔽我的广告,那你获取不了我 body 的内容(除非装证书解了),
    你又不可能直接屏蔽 POST www.bilibili.com 因为网站所有的接口都是通过这里获取,如果屏蔽了网站会彻底打不开


    这样是否有可行性?或者有哪些没考虑到的需要补充
    43 条回复    2021-04-25 11:32:57 +08:00
    crclz
        1
    crclz   102 天前
    不是很清楚你的问题。

    如果你想问能否通过访问 b 站的接口,制作 bilibili 的克隆网站,那么这个问题的答案是会有服务端跨源策略禁止你的 POST 。

    如果你想依赖 b 站的接口制作一个 bilibili 第三方纯净客户端,那么是可行的( windows 商店好像有)
    wunonglin
        2
    wunonglin   102 天前
    @crclz #1 我的意思是设计一个“你不能屏蔽我网站的接口不然你就不能正常使用我的网站”
    crclz
        3
    crclz   102 天前
    哦我好像懂你的意思了。忽略我的上一条
    cmdOptionKana
        4
    cmdOptionKana   102 天前
    感觉不太行,我可以先把广告一起获取了,但不显示。
    oott123
        5
    oott123   102 天前   ❤️ 2
    一般没有这么费劲的,检查到广告加载失败直接罢工就是了

    但广告拦截软件还可以放过广告请求,但动态修改你的 DOM,然后你通过一个 js 去检测他有没有改你的 DOM,如果有你就再罢工……

    何必互相伤害呢,装了广告拦截的用户几乎都不是广告的受众,带不来什么收益,广告屏蔽对双方都好……
    cxe2v
        6
    cxe2v   102 天前
    ```
    例如正常的设计是:
    网站:www.bilibili.com
    用户接口 www.bilibili.com/api/user/1
    广告接口 www.bilibili.com/api/ad/2021-01-01
    ```
    你得用户接口不还是和广告接口不一样吗?依然可以制定匹配规则,精准屏蔽你的广告接口
    lichdkimba
        7
    lichdkimba   102 天前
    前后端不分离 可以直接没有广告接口啊。。。
    3dwelcome
        8
    3dwelcome   102 天前
    我猜测楼主想描述的,就是和小米电视广告屏蔽一样,不能简单只改 hosts,就把广告给删了。

    个人总结下来有四种方法:
    1 是和 bilibili 客户端一样,页面初始化的时候强制调用 www.bilibili.com/api 接口,再进入主页面,你肯定不能把 www.bilibili.com 给删掉吧。
    2 是请求用 websocket 处理,因为是流式数据,不可能只屏蔽广告其中一个请求。还可以自己写一点协议加密。
    3 是用 vue 之类属性监控方法,看 dom 有没有被外部脚本动态修改。
    4 运行过程中,用遍历 dom 方式,给 http 整体签个名。不符合服务器预设签名的,直接不显示内容,用户只会觉得是广告拦截的问题。


    其实最好的办法,就是检测在 chrome developer tool 里 content scripts, 所有会对你网站 DOM 进行恶意操作的脚本,都在这个列表里。只是目前不清楚怎么能获取。
    cpstar
        9
    cpstar   102 天前
    网站运营方这么搞,成本太高,除非自己就是广告渠道商。
    wunonglin
        10
    wunonglin   102 天前
    @oott123 #5
    @lichdkimba #7
    不一定是网页、例如其他设备

    @cxe2v #6 我说的是将正常的改成下面的


    @3dwelcome #8 是的。例如 host 、ssr 规则之类的就能去掉,提高去除门槛而已。websocket 也不错,只是要支撑很多人的情况下消耗太大。
    wolfie
        11
    wolfie   102 天前   ❤️ 1
    服务端渲染成,canvas 显示

    广告有没有获取、获取后有没有渲染、渲染后有没有被屏蔽、检查是否渲染和屏蔽代码 有没有被屏蔽。
    retanoj
        12
    retanoj   102 天前
    你咋绕过的人家,人家就咋绕过的你
    除非广告不是广告,广告就是正常的内容
    X-Force
        13
    X-Force   102 天前
    人家直接操作 CSS 或 DOM 移除相关内容就行,管你是什么接口获取的内容。
    wpyfawkes
        14
    wpyfawkes   102 天前
    我记得达尔盖的旗帜检测到广告被屏蔽就不会显示图片,楼主可以去研究下.😆
    wunonglin
        15
    wunonglin   102 天前
    @X-Force #13 java 、swift 、qt 也可以么
    joesonw
        16
    joesonw   102 天前 via iPhone
    1,获取路径也要证书解的
    2,屏蔽广告是浏览器插件,可以获取你所有请求信息(授权情况下),没有证书不证书一说。
    honeycomb
        17
    honeycomb   102 天前 via Android   ❤️ 1
    @wunonglin 实际上很多网页就是这么做的,把 html 元素的 id/class 标记成随机数,这样 adblocker 就很难去拦截它。
    为此 adblocker 发展出了更复杂的拦截功能。
    anti-adblock 也类似,可以用相同的 anti-anti-adblock 去反制。
    app 的 api 可以用代理实施中间人攻击,对付方法也有,用 tls 证书绑定,非越狱 /root 无解
    honeycomb
        18
    honeycomb   102 天前 via Android   ❤️ 6
    前几年 cnbeta 曾经和 adblocker 打过一架,几分钟更新一次前端代码,后来发现搞不过。
    现在它就把广告放到信息流里不和正常信息区分了,但是 adblocker 还是能认出来,因为它用了广告联盟的链接
    wunonglin
        19
    wunonglin   102 天前
    @honeycomb #18 原来这么精彩。领教了
    locoz
        20
    locoz   102 天前
    其实没啥卵用,无非就是处理成本的问题。你要搞特殊加载方式,别人就直接用透明代理检测内容做拦截,或者直接就 hook 你程序干掉广告内容的显示,实在不行就压根不用你的东西...
    locoz
        21
    locoz   102 天前
    @honeycomb #17 现在 Android 上对非系统应用是可以不需要 ROOT 、解 BL 锁的,直接套容器里弄个虚拟环境出来就随便搞了,所以也就只是 iOS 无解。
    pkookp8
        22
    pkookp8   102 天前 via Android
    后端把网页生成图片贴到前端,啥都能防
    natsji
        23
    natsji   102 天前 via Android
    shuntdown42
        25
    shuntdown42   102 天前
    反反广告拦截规则
    ad-edentw.txt:合并自 Adblock Warning Removal List 、ABP filters 、anti-adblock-killer-filters
    raw.githubusercontent.com/o0HalfLife0o/list/master/ad-edentw.txt
    IvanLi127
        26
    IvanLi127   102 天前 via Android
    可以,但是现在广告拦截不只是阻断接口的访问
    psllll
        27
    psllll   102 天前
    把广告做进正常的内容,参考动漫疯
    dream7758522
        28
    dream7758522   102 天前 via Android
    优酷爱奇艺不是已经实现了吗?开了过滤,直接不放视频了,一个大黑框提示关闭过滤
    iseki
        29
    iseki   102 天前
    这都是道高一尺魔高一丈的东西,你这么设计接口赶明人家反广告工具上 json path 信不信(
    tia
        30
    tia   102 天前
    你除非拿出和对方一样规模的团队 https://github.com/gorhill/uBlock
    nvkou
        31
    nvkou   102 天前 via Android
    学学游戏。看完广告获取令牌从而让用户主动走完流程。
    MaiKuraki
        32
    MaiKuraki   101 天前
    好像有点儿难反。建议起诉开发广告拦截的
    xingshu1990
        33
    xingshu1990   101 天前
    学学 youtube 学学泰国的广告,学学霓虹国的广告。
    国内的广告制造焦虑太明显,贩卖焦虑太明显。特别是近些年的在线教育,培养了太多的焦虑的父母,造就了太多的鸡娃。
    xingshu1990
        34
    xingshu1990   101 天前
    目的性太强烈,功利性太明显的广告,现在的大众都不想看。反而泰国好玩的广告,我可能连电视剧都不看了。
    yyyb
        35
    yyyb   101 天前   ❤️ 2
    一天到晚琢磨怎么反广告拦截不如提升一下广告质量和投放方法,你们还想强制用户吃屎不行?
    yyyb
        36
    yyyb   101 天前   ❤️ 1
    @MaiKuraki 建议立法,强制用户看广告,不看的一律终身监禁
    gamexg
        37
    gamexg   101 天前
    这个根本没难度
    第一,一般是第三方的广告平台,直接屏蔽广告平台域名完事,你没办法去改平台域名,如果上自己的反代,小心被当作作弊。
    第二,即使加载处无法屏蔽,也可以从 DOM 处屏蔽。我记得有个网站广告 DOM 没任何 id css 等标记,但是当时一样按位置解决了。

    靠谱的方法如上面讲的,js 探测,如果发现屏蔽广告就警告。但是要注意,探测的 js 别一样被人屏蔽了。
    不过这个只能对抗通用过滤,如果专门针对某个网站的油猴脚本,一样难以解决。因为 DOM 的方法可以被替换。
    InuYasha1987
        38
    InuYasha1987   101 天前 via Android
    @honeycomb 就从那时候起我不看 cnbeta 了
    newmlp
        39
    newmlp   101 天前
    这个反广告拦截实际上没啥意义,人家真不想看你广告你非要让人家看到,能带来什么收益呢?而且还要投入人力时间
    Cu635
        40
    Cu635   101 天前
    反广告拦截?
    注意在接广告的时候不要接那种恶心人的广告,注意筛选高质量广告。
    hui314
        41
    hui314   101 天前
    楼主应该是想说把接口做成类似 RPC 的形式,这样可以达到“设计一个你不能屏蔽我网站的接口不然你就不能正常使用我的网站”的意图。
    但是我可以 block 网站的某个元素。
    lichdkimba
        42
    lichdkimba   101 天前
    @wpyfawkes 达盖尔那个太低级了。。。。就是检测没显示就隐藏内容。。很容易写个小脚本解决
    domodomo
        43
    domodomo   100 天前
    你不如干脆上街抢劫算了
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   980 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 20:33 · PVG 04:33 · LAX 13:33 · JFK 16:33
    ♥ Do have faith in what you're doing.