昨天继续优化APP中的部分源码,原来是将所有探测到的广告链接加入到一个资源文件中,通过下方的一句代码给载入到APP中去实现过滤,从实际效果来看,并不理想,因为个别网站的广告程序域名处于不断变化之中,这样写死到IDE中的方法,并不能从根本上解决广告的问题,所以随之将广告地址放在个人服务器上,用github上一个开源库Rxhttp以实现随时从网络下载更新(在每次软件启动时更新一次),我个人只要维护后台广告库中的广告地址即可。
lifecycleScope.launch {
RxHttp.get(Utils.HOME + "AdBlock.txt")
.asList(String::class.java)
.subscribe({
Utils.buildAdMaps(it)
}, {
//网络连接失败,从本地载入广告链接过滤地址
//其实这玩意没什么用,既然网络连接不上了,还要广告库有个鸟用???
Utils.buildAdMaps(resources.getStringArray(R.array.adBlockUrls)
.toMutableList())
})
}
浏览器核心是腾讯的X5浏览器,据官方资料显示,这个浏览器核心启动速度快、视频支持能力强大,主要手机只要包装有腾讯的应用,核心包就不用再下载安装,会自动Copy,这点就很Nice了[笑哭],有兴趣的同学可以去官方查看资料。
查看资料(各种CSDN、腾讯官方、Google、百度、github,Ctrc+Ctrv)一顿疯狂输出,广告终于得以拦截在应用之外,因为现在并不是全网拦截,而是针对视频网站的拦截,所以广告库不是很大(大概100多条的样子),后期肯定会越来越庞大,为了之后效率考虑,要将不同的广告过滤地址适配到不同的网址中去,同时参考了AdBlock库的广告地址,它是长这样的——>>"ubmcmm.baidustatic.com$domain=default",其中domain代表的是要作用的域,以实现将庞大的广告地址适配到不同的网站去,照抄就完了,所以我的广告库是这样的
[
"ubmcmm.baidustatic.com$domain=default",
"gss1.bdstatic.com/$domain=default",
"cpro2.baidustatic.com$domain=default",
"cpro.baidustatic.com$domain=default",
"lianmeng.360.cn$domain=default",
"nsclick.baidu.com$domain=default",
"caclick.baidu.com/$domain=default",
"jieaogd.com$domain=default",
"publish-pic-cpu.baidu.com/$domain=default",
"hao61.net/$domain=default",
"pos.baidu.com$domain=default",
"cbjs.baidu.com$domain=default",
"cpro.baidu.com$domain=default",
"images.sohu.com/cs/jsfile/js/c.js$domain=default",
"union.sogou.com/$domain=default",
"sogou.com/$domain=default",
"5txs.cn/$domain=default",
"liuzhi520.com/$domain=default",
"yhzm.cc/$domain=default",
"jieaogd.com$domain=default",
"a.baidu.com$domain=default",
"c.baidu.com$domain=default",
"mlnbike.com$domain=default",
"alipays://platformapi$domain=default",
"alipay.com/$domain=default",
"vipshop.com$domain=default",
"govshenzhen.cn$domain=default",
"govhebie.cn$domain=default",
"img01.sogoucdn.com$domain=default",
".qq.com$domain=default",
"oskjfkdlsjfds.$domain=default",
"v1.cnzz.com$domain=default",
"bhtbnb.qqqwww987.space$domain=default",
"t-deksjdf.bhyd123.com$domain=default",
"v.smtcdns.com$domain=v.qq.com",
"tracking.ad-survey.com$domain=iqiyi.com",
"d-7c82fcfc-cache.71edge.com$domain=iqiyi.com",
"mm3.365dmp.com/vw?$domain=iqiyi.com",
"msg.qy.net$domain=iqiyi.com",
"nl-rcd.iqiyi.com$domain=iqiyi.com",
"piq.in-neo.cn/dar$domain=iqiyi.com",
"pmpmonitor.365dmp.com/dsp/$domain=iqiyi.com",
"qncdncnc.inter.71edge.com/videos$domain=iqiyi.com",
"ckm.iqiyi.com/pixel$domain=iqiyi.com",
"cm.cn.miaozhen.com/$domain=iqiyi.com",
"kscdncnc.inter.71edge.com$domain=iqiyi.com",
"61?C179?C110-1.ksyungslb.com/$domain=iqiyi.com",
"d-b65adbf3-cache.71edge.com$domain=iqiyi.com",
"yunfcdncnc.inter.71edge.com$domain=iqiyi.com",
"data.video.iqiyi.com/videos/other/$domain=iqiyi.com",
"data.video.iqiyi.com/videos/vts/$domain=iqiyi.com",
"pagesdk.js$domain=youku.com",
"playersdk.js$domain=youku.com",
"mf.atm.youku.com/mf$domain=youku.com",
"pagead2.googlesyndication.com$domain=mgtv.com",
"ad-banner$domain=mgtv.com",
"da.mgtv.com/new_video$domain=mgtv.com",
"y.da.hunantv.com/$domain=mgtv.com",
"m.aty.sohu.com/h$domain=sohu.com",
"mg.rywnvzd.cn/$domain=default",
"www.gov$domain=btnull.org",
"oksdfjkskd$domain=benbenji.com",
"pc.stgowan.com$domain=benbenji.com",
"ssh.bznxc6721.xyz$domain=benbenji.com",
"eew2ss.kbneks00.online$domain=benbenji.com",
"osdfjsk5$domain=benbenji.com",
"=http://m.benbenji.com$domain=benbenji.com",
"=http://www.benbenji.com$domain=benbenji.com",
"show-g.mediav.com$domain=360kan.com",
"show-3.mediav.com$domain=360kan.com",
"static.mediav.com/js/mvf_g4.js$domain=default",
"e.so.com$domain=360kan.com",
"w.77nnv9.xyz$domain=default",
"zl.shenhl.top$domain=default",
"mg.npftmqv.cn$domain=default",
"api.otantgi.cn$domain=default",
"xothl.gbcnvip15.com$domain=default",
"xg.svvbrkk.cn$domain=default",
"mg.aztsefz.cn$domain=default",
"hf.sxmcwlw.com$domain=default",
"xg.adbeuch.cn$domain=default",
"mg.rdlbkvo.cn$domain=default",
"cdn.yuetx.cc$domain=default",
"api.otantgi.cn$domain=default",
"ssh.mzya5718.xyz$domain=default",
".huixianjiaoyuedu.com$domain=default",
"j.gxlsjt.com$domain=default",
"img13.360buyimg.com$domain=default",
"199tv.info$domain=default",
"zhiboo1.hsxdsyy.com/common/u/p_mromxr/y.js$domain=default",
"js.quanmindi.com$domain=daishudy.com",
"kkl.eatncx.cn/$domain=default",
"/ad?$domain=default",
"/ad/$domain=default",
"/adimages/$domain=default",
"/ads/$domain=default",
"/adserver/$domain=default",
"/advert/$domain=default",
"/apfbanners/$domain=default",
"/banners/$domain=default",
"/bannersource$domain=default",
"/cgi-bin/ads$domain=default",
"/clicktrack$domain=default",
"/counter/$domain=default",
"/hittrack$domain=default",
"/images/ads/$domain=default",
"/images/banners/$domain=default",
"/pagead/$domain=default",
"ark.letv.com$domain=le.com",
"/pics/banner/$domain=default",
"/smartbanner/$domain=default",
"/template/sideads/$domain=default",
"/viewad/$domain=default",
"/show_ads$domain=default",
"noon.chinahugh.top$domain=default",
"jr.captivias.site$domain=benbenji.com",
"askdjfsl.alictibet.com$domain=benbenji.com",
"osdfjsk5.dikematou.com/$domain=benbenji.com",
"ef.laijd.cn$domain=default",
"sbhf.js$domain=default",
"v.smtcdns.com$domain=default",
"tytx.m.cn.miaozhen.com$domain=default",
"dfmvelyvokgr.hbhuatie.com$domain=www.duwy.cn",
"tv-8.js$domain=tvyan.com",
"tv-9.js$domain=tvyan.com",
"tv-13.js$domain=tvyan.com"
]
PS:重点来了,所谓万事具备,只欠东风,广告库有了,后台服务器有了,网络更新库也有了,So,要怎么实现拦截呢[思考][思考]
过程不再详表,反正对一个菜鸟来说,你懂得,就是各种文档看呗,经了解,WebView有这么一个函数shouldInterceptrequest( p0: WebView, p1: WebResourceRequest ): WebResourceResponse?,它的作用就是可以将一个网页中所需要用到的各种资源,以请求的方式载入到网页中去,大家看到了,这个函数可以返回WebResourceResponse?,那就好办了,对于广告地址,我们不让他请求,直接返回null就可以了嘛。于是有了下面这段代码
override fun shouldInterceptRequest(
p0: WebView,
p1: WebResourceRequest
): WebResourceResponse? {
var webUrl = ""
val handler = Handler(Looper.getMainLooper())
try {
handler.post { webUrl = p0.url }
} catch (e: Exception) {
e.printStackTrace()
}
var count = 0
while (webUrl.isEmpty() || count < 5000) {
count++
}
val requestUrl = p1.url.toString()
return if (!Utils.isHad(webUrl, requestUrl)) {
//嗅探视频地址 如果不是大站的视频才嗅探,大站不嗅探,因为无法播放
if (!Utils.isJiexiUrl(webUrl, context)) {
//先初步确定是不是带关键字的网址:mp4,m3u8
if (Utils.isVideoUrl(requestUrl)) {
// application/vnd.apple.mpegurl :m3u8
// application/vnd.apple.mpegURL
// video/mp4 :mp4
//视频地址 url
RxHttp.get(requestUrl)
.asOkResponse()
//回调在主线程上,以便更新UI
.observeOn(AndroidSchedulers.mainThread())
.life(context as BrosWerAndPlayerParent)
.subscribe { response ->
//分析返回请求头的类型,进一步确认视频链接是否正确
//个别网站会返回image/png,操了,如无名小站
val type = response.headers["Content-Type"]
if (type.equals("application/vnd.apple.mpegurl", true) ||
type.equals("video/mp4", true) ||
type.equals("image/png", true)
) {
//视频地址
//println(url)
sniffVideoUrlcallback?.callback(requestUrl)
}
}
}
}
super.shouldInterceptRequest(p0, p1)
} else {
++i
WebResourceResponse(null, null, null)
}
}
}
大家不要小瞧了上面这段不是很长的代码,着实费了番功夫[发怒](又掉了不少头发),其中的这句代码handler.post { webUrl = p0.url },浪费了差不多半个下午的时间,最后在一处国外网站上得出来的这句代码,调试信息已经不记得了,大概意思是取得webview的Url需要在主线程中取得,下方while空循环是为了取得weburl再进行下面的代码,实际测试中,有时weburl会还没取到(因为会进入到循环中,所以肯定会有延迟),就已经开始验证是否是广告链接了,这样domain就不能发挥作用了,所以让等个5000循环或weburl已经取得为止,暂时没想到别的好方法,有大神经此处不妨指点一二。
验证广告链接的函数是长下面这样的,至此,广告链接过滤已基本成熟,我又做了个配置后台的PC端程序,实现简单化和智能化,主要是软件的严苛程度比人更严谨,以避免出现人工填写后台端的疏漏而导致app的大面积出错。至此一步,app的首页列表、广告过滤、VIP解析接口全部实现去本地化,实现统一服务器部署,当然,首页列表可以选择自定义顺序及列表块,本人用RoomData实现了自定义首页列表的个性化设置。
/**
* 是否广告链接
* @param webUrl 网页链接,地址栏中的链接
* @param sourceUrl 资源链接,请求欲加载的资源链接
* @return true-广告链接 false-非广告链接
*/
fun isHad(webUrl: String, sourceUrl: String): Boolean {
adburls.forEach {
if (webUrl.contains(it.key)) {
it.value.forEach { s ->
if (sourceUrl.contains(s)) {
return true
}
}
}
}
adburls[default]?.forEach {
if (it.contains(sourceUrl)) {
return true
}
}
return false
}
这就是昨天闲暇时间的成果,我相信有志者、事竟成,为了自己的追剧梦,共勉!
一个医生的编程梦想,追求并快乐着
如若转载,请注明出处:https://www.daxuejiayuan.com/22984.html