那些年的Webview开发经验记录

获取网站视频真实链接

直接上工具类

直接调用即可,这个工具类会返回加载的网页中所有的链接,至于对链接怎么处理就是你们自己的事了, 亲测至今我所遇到的所有视频,它都可以捕获到其链接


import android.app.Activity;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.view.ViewGroup;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.SslErrorHandler;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;

import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by Administrator on 2018/3/22.
 */

public class ParseWebUrlHelper {
    private static ParseWebUrlHelper parseWebUrlHelper;
    private String webUrl;
    private Activity mAct;
    private WebView webView;
    private int timeOut = 20 * 1000;
    private OnParseWebUrlListener onParseListener;

    public static ParseWebUrlHelper getInstance() {
        if (parseWebUrlHelper == null) parseWebUrlHelper = new ParseWebUrlHelper();
        return parseWebUrlHelper;
    }

    public ParseWebUrlHelper init(Activity act, String url) {
        this.mAct = act;
        this.webUrl = url;
        ViewGroup mainView = (ViewGroup) mAct.findViewById(android.R.id.content);
        this.webView = new WebView(mAct);
        this.webView.setLayoutParams(new LinearLayout.LayoutParams(1, 1));
        mainView.addView(this.webView);
        initWebSettings();
        return this;
    }

    private void initWebSettings() {
        WebView mWebView = this.webView;
        mWebView.clearFocus();
        WebSettings mWebSettings = mWebView.getSettings();
        mWebSettings.setJavaScriptEnabled(true);
        mWebSettings.setDefaultTextEncodingName("utf-8");
        mWebSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
        mWebSettings.setPluginState(WebSettings.PluginState.ON);
        mWebSettings.setDisplayZoomControls(false);
        mWebSettings.setUseWideViewPort(true);
        mWebSettings.setAllowFileAccess(true);
        mWebSettings.setAllowContentAccess(true);
        mWebSettings.setSupportZoom(true);
        mWebSettings.setAllowContentAccess(true);
        mWebSettings.setLoadWithOverviewMode(true);
        mWebSettings.setBuiltInZoomControls(true);// 隐藏缩放按钮
        mWebSettings.setUseWideViewPort(true);// 可任意比例缩放
        mWebSettings.setLoadWithOverviewMode(true);// setUseWideViewPort方法设置webview推荐使用的窗口。setLoadWithOverviewMode方法是设置webview加载的页面的模式。
        mWebSettings.setSavePassword(true);
        mWebSettings.setSaveFormData(true);// 保存表单数据
        mWebSettings.setJavaScriptEnabled(true);
        mWebSettings.setTextZoom(100);
        mWebSettings.setDomStorageEnabled(true);
        mWebSettings.setSupportMultipleWindows(true);// 新加//我就是没有这一行,死活不出来。MD,硬是没有人写这一句!
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mWebSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            mWebSettings.setMediaPlaybackRequiresUserGesture(true);
        }
        if (Build.VERSION.SDK_INT >= 16) {
            mWebSettings.setAllowFileAccessFromFileURLs(true);
            mWebSettings.setAllowUniversalAccessFromFileURLs(true);
        }
        mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        mWebSettings.setLoadsImagesAutomatically(true);
        mWebSettings.setAppCacheEnabled(true);
        mWebSettings.setAppCachePath(mAct.getCacheDir().getAbsolutePath());
        mWebSettings.setDatabaseEnabled(true);
        mWebSettings.setGeolocationDatabasePath(mAct.getDir("database", 0).getPath());
        mWebSettings.setGeolocationEnabled(true);
        CookieManager instance = CookieManager.getInstance();
        if (Build.VERSION.SDK_INT < 21) {
            CookieSyncManager.createInstance(mAct.getApplicationContext());
        }
        instance.setAcceptCookie(true);
        if (Build.VERSION.SDK_INT >= 21) {
            instance.setAcceptThirdPartyCookies(mWebView, true);
        }
        mWebView.setWebViewClient(new MyWebViewClient());
        enabledCookie(webView);//启用cookie
    }
    public ParseWebUrlHelper setLoadUrl(String url){
        this.webUrl=url;
        return this;
    }
    public ParseWebUrlHelper startParse(){
        webView.loadUrl(this.webUrl);
        return this;
    }
    /*启用cookie*/
    private void enabledCookie(WebView web) {
        CookieManager instance = CookieManager.getInstance();
        if (Build.VERSION.SDK_INT < 21) {
            CookieSyncManager.createInstance(mAct);
        }
        instance.setAcceptCookie(true);
        if (Build.VERSION.SDK_INT >= 21) {
            instance.setAcceptThirdPartyCookies(web, true);
        }
    }

    public ParseWebUrlHelper setOnParseListener(OnParseWebUrlListener onParseListener) {
        this.onParseListener = onParseListener;
        return this;
    }

    private class MyWebViewClient extends WebViewClient {

        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            if(request.getUrl().toString().startsWith("intent")||request.getUrl().toString().startsWith("youku")){
                return true;
            }else{
                return super.shouldOverrideUrlLoading(view, request);
            }
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if(url.startsWith("intent")||url.startsWith("youku")){
                return true;
            }else{
                return super.shouldOverrideUrlLoading(view, url);
            }
        }

        /*解决ssl证书问题*/
        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            handler.proceed();
        }

        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
            onParseListener.onFindUrl(url);
            return super.shouldInterceptRequest(view, url);
        }

        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                String url = request.getUrl().toString();
                onParseListener.onFindUrl(url);
            }
            return super.shouldInterceptRequest(view, request);
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            // TODO: Implement this method
            super.onPageStarted(view, url, favicon);
            startConut();//加载超时处理
        }

    }
    /*解决webview加载超时问题*/
   private void startConut(){
        final Timer timer=new Timer();
        TimerTask timerTask=new TimerTask(){
            @Override
            public void run()
            {
                onParseListener.onError("解析视频超时,请检查网速或网络是否出现问题...");
                timer.cancel();
                timer.purge();
            }
        };
        timer.schedule(timerTask,timeOut,1);
    }

    public interface OnParseWebUrlListener {
        void onFindUrl(String url);
        void onError(String errorMsg);
    }
}

调用

//初始化
this.parseWebUrlHelper=ParseWebUrlHelper.getInstance().init(this.mAct,"");
//解析网页中视频
parseWebUrlHelper.setOnParseListener(new ParseWebUrlHelper.OnParseWebUrlListener() {
                    @Override
                    public void onFindUrl(String url) {
                        Log.d("webUrl",url);
                        //*****处理代码
                    }
                    @Override
                    public void onError(String errorMsg) {
                    //****出错监听
                    }

问题

Q:webview某些视频加载不出来问题
A:http://blog.csdn.net/u013148839/article/details/65448474
Q:webview拦截请求
A:https://segmentfault.com/a/1190000006805635
Q:webview由于证书问题导致不能正常加载网页问题:
A:http://blog.csdn.net/sd19871122/article/details/54632199

他人总结

1.http://www.cnblogs.com/lee0oo0/p/4026774.html

获取webview完整源码[包括iframe源码]

主要问题

动态加载
iframe嵌套

0.window也算一个frame
1.得到frame
2.判断frame的url是否已被查找
3.判断frame是否是同域名
4.同域名直接正常查找
5.不同域名直接单独加载frame的url,当成一个新的页面处理
6.一直查找直到发现一个video标签

iframe链接单独打开被检测到问题

次要问题

去除Chrome反调试
无限断点反调试

参考:https://blog.csdn.net/zzgzzg00/article/details/79504827

完结

编程这种事真是太容易跑偏了,我明明最根本的目的就是为了获取网站视频链接的,然后发现有些网站的源码获取不全,然后目的就悄然变成了去获取源码,然后折腾了几天依然没解决这个获取源码的问题,然后猛然记起以前研究过相同的问题,并且还写了一篇获取视频链接的文章,这才是真正的造轮子吧,明明已经研究过一次了,相同的问题明明已经遇到过一次了,为何这次又掉坑里了?而且掉坑里几天了,居然没意识过来,唉,笨啊,真实不长记性啊,到了最后才发现我获取源码的目的就是为了获取视频链接,说来还是我以前写的这篇文章发挥了作用:Web逆向之通过Android中WebView获取网站视频真实链接

参考

1.攻破iframe围城
2.Python爬虫关于多层嵌套iframe的解决
3.爬虫获取:解决动态加载数据和frame框架问题
4.java爬虫进阶 —— ip池使用,iframe嵌套,异步访问破解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jitcor

觉得有用,不赏点?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值