以下效果是破解趣看天下app的接口实现在自己app上面自动阅读的

Android 自动阅读脚本应用 365 破解 源码 文章 百度 QQ活动  第1张


其的文章都是用h5的,说白了就是原生和h5的交互的,好了,既然是h5的就好办了。

原本打算将项目分享出来的,但是项目里面包含破解出来的一些加密方式,如果放出来总感觉不太好,所以还是不分享源码只分享大致的原理算了,当然,你也可以自己反编译破解去拿加密算法的。

好了,现在开始说写这个项目的流程了。

按照惯例最开始还是先抓包看一下应用的数据,我抓包的工具是Charles,这个挺好用的,经过抓包分析,应用的数据包结构并不复杂,关键的字段是sign,这个字段很明显就是一个用来检验数据,用MD5的加密,不过其参数有一系列之多,具体是啥就不讲了,再讲就过分了。具体过程怎样的这里就忽略了,反正最后重要的只有两个参数token和sign ...

获取到相应的参数和接口现在开始项目了。

1. 在WebView初始化的时候添加一个

webView.addJavascriptInterface(new QKjsObjext(), "local");

public class QKJsObject extends BaseJsObject {
 
    private OnWebHtmlListener listener;
 
    @JavascriptInterface
    public void getContent(String html) {
}

用于与h5的交互,这里的话主要是获取h5的页面内容,下面是在页面加载完onPageFinished的方法里面执行的

webView.loadUrl("javascript:window.local.getContent(document.getElementsByClassName(\"content\")[0].innerHTML);");

那个h5页面其实加载完的时候并没有完全显示文章的内容,需要点击一个按钮查看全文才显示全部内容的,其实这个好处理,分析其的网页代码发现,那个查看全文的按钮的class是spread


于是就是实现一个自动点击就行了

 webView.loadUrl("javascript:var aa = document.querySelectorAll(\".spread\");aa[0].click();");

上面是一个完整的页面显示,下面开始写自动滑动的,其实这个也很简单,主要是采用命令的方式实现滚动

 ShellCmdUtils.execShellCmd("input swipe 600 600 100 100");

这里写一个定时执行命令就能实现自动滑动了,大体下面那样,下面是删减了一些逻辑代码的

TimeThread countDown = new TimeThread(handler);
handler.post(countDown);
/**
     * 执行滚动
     */
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            ShellCmdUtils.execShellCmd("input swipe 600 600 100 100");
            count++;
        }
    };
/**
     * 定时器
     */
    private class TimeThread implements Runnable {
        private Handler mHandler;
 
        public TimeThread(final Handler mHandler) {
            this.mHandler = mHandler;
        }
 
        @Override
        public void run() {
            mHandler.postDelayed(countDown, 4000);
        }
    }

由于阅读情况以及是否有金币这些都是h5自己请求获取结果的,尴尬,本想获取h5的请求结果的,但是不知道怎么获取,后来百度了一番还没有找到方法,于是我就换了一种玩法就是拦截h5的ajax请求,不让其请求出去,拿其的参数用我们自己的网络框架进行请求。拦截的方法是shouldInterceptRequest

 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                if (listener.shouldInterceptRequest(view, request)) {
                    return new WebResourceResponse(null, null, null);
                }
                return super.shouldInterceptRequest(view, request);
            }
 
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
                if (listener.shouldInterceptStringRequest(view, url)) {
                    return new WebResourceResponse(null, null, null);
                }
                return super.shouldInterceptRequest(view, url);
            }

中途小挫折:由于h5的脚本配置有本地储存的东西,我没有配置相应的参数,ajax居然不执行请求,后来配置了就可以了,这是分析脚本发现一个关键词 localStorage 发现的 

webView.getSettings().setDomStorageEnabled(true);//默认是false

201608221471799628341101.gif