全网vip解析(全网VIP解析 捷径)

昨天继续优化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
    }

这就是昨天闲暇时间的成果,我相信有志者、事竟成为了自己的追剧梦,共勉

一个医生的编程梦想,追求并快乐着

    
本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 cloud@ksuyun.com 举报,一经查实,本站将立刻删除。
如若转载,请注明出处:https://www.daxuejiayuan.com/22984.html