Android视频嗅探

本文讲述在Android中使用原生或者集成三方浏览器Crosswalk,利用原生WebViewClient中的shouldInterceptRequest接口、XWalkResourceClient中的onLoadStarted、shouldInterceptLoadRequest这两个API完成视频嗅探。其主要原理还是利用了WebView提供的拦截机制。

1 视频嗅探

最近在开发一个视频嗅探客户端,在调研解决方案的时候看到Web逆向之通过Android中WebView获取网站视频真实链接这篇文章,里面提供了一个工具类,可以用来嗅探视频。其原理是通过WebViewClient中的shouldInterceptRequest接口来拦截所有的资源加载请求。虽然可以达到视频嗅探的目的,由于拦截所有的资源加载请求,势必会影响页面加载速度。

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

shouldInterceptRequest.png

图1  拦截效果

2 集成CrossWalk

  1. 在线集成 采用在线集成的方式,在repositories中添加crosswalk的仓库地址。

      repositories {
        maven { 
            url 'http://maven.aliyun.com/nexus/content/groups/public' 
        }
        maven {
            url 'https://download.01.org/crosswalk/releases/crosswalk/android/maven2'
        }
        maven {
            url 'https://maven.google.com'
        }
    }
    
  2. 直接下载库文件 下载指定版本的库文件,使用 Import Module 导入或者放入libs文件夹,然后 add as library 即可。

3 使用onLoadStarted事件回调

CrossWalk的XWalkResourceClient中有一个onLoadStarted函数,在资源加载的时候调用。相较于WebViewClient中的shouldInterceptRequest,明显调用次数更少,可以显著提高页面加载性能。

@Override
public void onLoadStarted(XWalkView view, String url) {
    super.onLoadStarted(view, url);
    Log.d("MainActivity", "onLoadStarted url:" + url);
}

这里还需要做一个正则匹配,如果当前url的地址包含了视频文件的格式,则表示嗅探成功。经过试验,目前碰到的所有连接均可捕获。