前言

查豆瓣 使用的是 WebView 加载页面,在豆瓣的移动页面中存在两到三个的广告轮播图,比较影响阅读体验。所以开始着手看看怎么屏蔽掉广告。

在 WebView 中有以下三个方法可以考虑:

fun onPageFinished(view: WebView, url: String)

fun shouldInterceptRequest(view: WebView, request: WebResourceRequest): WebResourceResponse?

fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean

复制代码onPageFinished方法会在页面加载完毕后回调

shouldInterceptRequest方法会通知 host Application,也就是启动 WebView 的应用返回WebResourceResponse。如果本地应用返回null,则webView会正常加载资源

shouldOverrideUrlLoading会在Url被加载前被回调。实现此方法,返回true时WebView将不会加载该Url,否则将会正常加载Url

此方法仅在主动或被动调用WebView.load(url)方法时才会回调,而页面中的资源加载时是不会被回调的

比如主动显式调用:webview.load(url)

被动则是页面中点击链接之后加载

此方法不适用于POST请求

基于上述三个方法,我们看看能否做到:

禁止加载广告域名

给广告域名请求返回空的数据

在页面加载完毕后消除广告占位的div或类似元素

1. 禁止加载广告域名

根据shouldOverrideUrlLoading()方法的特性,我们几乎无法用之来屏蔽页面中加载的广告。

在实践中,一般在这处理网页对本地资源的调用,比如最常见的拉起 APP 的操作。

override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {

val url = request.url.toString()

if (url.startsWith("douban:")) {

// 拉起豆瓣 APP

handleAppRequest(view, url)

return true

}

return super.shouldOverrideUrlLoading(view, request)

}

复制代码

此方法看起来应该是不行了。这一步也应该没法轻易办到。

2. 给广告域名请求返回空的数据

我们把目光聚集到了shouldInterceptRequest()方法,实际上这个方法的功劳最大。我们很轻易就是实现了广告拦截。

override fun shouldInterceptRequest(view: WebView, request: WebResourceRequest): WebResourceResponse? {

return if (isAdDomain(request.url.toString())) {

createEmptyResource()

} else super.shouldInterceptRequest(view, request)

}

fun createEmptyResource(): WebResourceResponse {

return WebResourceResponse("text/plain", "utf-8", ByteArrayInputStream("".toByteArray()))

}

fun isAdDomain(url: String): Boolean {

return (!url.contains("douban")) or url.contains("baidu")

}

复制代码

前面提起的,此方法会在请求数据前回调。所以我们可以自己构建WebResourceResponse对象返回。

豆瓣的移动端对接的是百度的推广,所以基本上广告域名都带有baidu的关键字。所以我这样就已经足够了。

更一般的情况,我们可以自己维护规则列表或者,使用一些公开的规则列表。或者自己收集一下常见的大的推广联盟的链接就可以了。

3. 消除空白广告元素

我们给广告请求返回了空数据,但是原有的广告占位元素依然存在。所以我们要用到

onPageFinished()方法,来删除广告占位标签。

override fun onPageFinished(view: WebView, url: String) {

webView.evaluateJavascript(

"javascript:(" +

" function() {" +

" var len = document.getElementsByClassName('Advertisement').length; " +

" for(var i = 0; i < len; i ++){" +

" document.getElementsByClassName('Advertisement')[i].style.display = 'none'" +

" }" +

" }" +

")()"

) {

print(it)

}

}

复制代码

这里利用了WebView.evaluateJavascript()方法,执行了一段 JavaScript 代码:

javascript:(

function(){

var len = document.getElementsByClassName('Advertisement').length;

for(var i = 0; i < len; i ++ ){

document.getElementsByClassName('Advertisement')[i].style.display = 'none'

}

}

)()

复制代码

这里的代码需要你根据不同的页面来维护规则。比如豆瓣的移动端广告都用Advertisement作为类名。

所以获取了个数之后,降之隐藏。

结语

至此,我们简单地实现了对豆瓣移动端网页的拦截。

参考链接:

android广告拦截原理,WebView 广告拦截浅析相关推荐

  1. 安卓网页广告拦截_Android webview广告过滤的实现

    现在大部分的android平台的浏览器都具有广告过滤的功能,同时大部分网站都有广告.广告行业是个盈利巨大的产业,就我看来,现在绝大部分的互联网产品,一般有两种营利模式:免费有广告和会员无广告:他们大部 ...

  2. android自带的webview有广告,android webview 拦截广告

    要想对Webview实现一些高级操作,需要使用WebViewClient,下面是关于Webview的几个常用回调函数: 1.public boolean shouldOverrideUrlLoadin ...

  3. 秋式广告杀手:广告拦截原理与杀手组织

    2019独角兽企业重金招聘Python工程师标准>>> 上一贴很火热:秋天新作品:秋式广告杀手,每年帮大伙多活7-8天!,大伙表示整套的意愿很强烈,当然对软件的原理兴趣更有倾向性. ...

  4. Android webview广告过滤的实现

    WebViewClient的几个回调函数(本文章转自  某某某  ) 要想对Webview实现一些高级操作,首先要学习WebViewClient的用法,这是Webview几个常用回调函数 1.publ ...

  5. 用bho方式拦截中国电信流氓广告

    中国电信的流氓广告已经弹了好几年了,现在还在弹,每天都会弹几个互联星空八卦新闻和各类网游戏广告,烦死了. 看过有人用bho拦截成功,近日也搜索资料自己做了一个,并且增加了配置文件,实现了添加拦截新网址 ...

  6. 火绒弹窗拦截_弹窗广告的克星:火绒安全软件图文使用教程

    现在很少有人说电脑中病毒但是经常有人发唠叨说弹窗广告太过烦人,特别是 FF 新鲜事.FF 新推荐.今日热点(搜狐微门户)等的弹窗广告更是烦不胜烦,哪怕是删除相关进程或文件也不行. 那么是不是我们对这些 ...

  7. html广告拦截网吧,网吧广告拦截软件是怎么安装的

    4.默认不拦截广告,如需要拦截,请打开桌面上的广告关闭器控制台,选择需要拦截的广告分类,右键选择拦截. 5.程序升级:直接使用安装包,选择修复或升级,会自动替换新的客户端程序到开机命令 6.程序卸载: ...

  8. Android手机安全软件之电话拦截功能浅析

    目前中国市场,骚扰电话大量的充斥手机用户的生活,因此手机安全软件的电话拦截功能受到广泛关注和使用.但第三方应用级电话拦截功能的效果并不理想,比如拦截电话时已经响了一声.或出现短暂的来电界面,多款安全软 ...

  9. html弹出广告怎么设置,电脑弹出广告太多怎样设置拦截(两种工具)

    马上又到双11购物节了,我们的电脑又开始频繁的弹出广告,电脑弹出广告太多怎么办,今天教大家解决设置拦截弹窗广告. 双十一流氓程序又开始泛滥了,如何让电脑弹窗拦截下面分享方法. 火绒安全广告拦截 方法步 ...

最新文章

  1. win7为什么打开桌面上的计算机很卡很慢,windows7很卡怎么处理_windows7系统卡慢的解决方法...
  2. python添加模块搜索路径
  3. pth大小为0,占用空间不为0
  4. Spring工作原理分析
  5. NanoPC-T3 64位裸机编程 —— 启动和运行状态切换
  6. .unl 文件 导入 mysql_mysql数据导出导入
  7. 初中生学计算机应用有什么好方面,计算机有哪些专业 初中毕业学习相关专业有发展吗...
  8. 【BZOJ 1053】反素数【素数基本知识】
  9. Java经典基础项目——《学生教务系统》立项需求说明书
  10. AutoIT如何制作自动化安装脚本-SketchUp 2017
  11. 1078 字母三角形
  12. 钉钉第三方企业应用开发快速入门
  13. laravel+容联.云通讯 实现手机短信验证用户注册
  14. pg服务管理 与 psql常用命令
  15. windows下修改中用户名为英文
  16. vue 2 组件之间传值
  17. xml学习(1)xml的几种文件格式
  18. 益智游戏网开发之路二(网址yzyx.info)
  19. Android系统intent大全
  20. ccie路由器技术有哪些?

热门文章

  1. 域名解析错误怎么办?
  2. Volumes 数据卷管理
  3. nodejs计算时间间隔_Js时间间隔计算的函数(间隔天数)
  4. 获取图片地址并下载图片
  5. linux pdf 笔记软件,可以编辑在PDF上做笔记的笔记软件:Xournal
  6. 部分HP笔记本无法使用GHOST软件解决方法
  7. 四川2021高考体考成绩查询,2021年四川体育专业考试成绩查询网址:https://www.sceea.cn/...
  8. Linux挂载群晖NFS共享文件夹
  9. 简约生活的72条观念
  10. app 上架到苹果应用商店