Android获取h5代码

本文只是提取了一些派派自动答题工具的部分代码进行说明。原理只是原生和js的交换而已,下面就说说我的思路吧。刚开始玩派派的时候,是一个朋友分享了一个二维码给我,通过访问二维码进入答题界面,进去随便答题一下都有几分钱,后来无意中发现这个链接只要刷新就可以重新开始,每次都这样,每次都有几分钱,后来登录上app看,钱是存在的,然后才有了这个自动点击工具。不过后来玩了三天,发现虽然提示有几分钱,但是app上面的余额并没有增长了,可能人家发现了这个漏洞进行修复了,也可能是人家的套路,让你玩多几次先,之后把你耍了,哈哈。

我先是自定义了一个webView

import android.content.Context;
import android.net.http.SslError;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.ProgressBar;

import com.kawa.videoplay.R;

/****
 * <pre>
 *  Project_Name:    
 *  Copyright:      
 *  Created:         Kawa on 2017/10/27 15:50.
 *  E-mail:          
 *  Desc:            
 * </pre> 
 ****/

public class MyWebView extends LinearLayout {

    private Context mContext;
    private WebView webView;
    private ProgressBar progressBar;
    private JsObject jsObject;

    public MyWebView(Context context) {
        this(context, null, 0);
    }

    public MyWebView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MyWebView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    private void init(Context context) {
        mContext = context;
        LayoutInflater.from(mContext).inflate(R.layout.wg_web_view, this);
        webView = (WebView) findViewById(R.id.wg_web_view);
        progressBar = (ProgressBar) findViewById(R.id.wg_web_view_progressBar);

        webView.getSettings().setBuiltInZoomControls(false);
        webView.getSettings().setUseWideViewPort(false);
        webView.getSettings().setJavaScriptEnabled(false);
        webView.getSettings().setUseWideViewPort(true);
        webView.getSettings().setLoadWithOverviewMode(true);
        jsObject = new JsObject();
        webView.addJavascriptInterface(jsObject, "local_obj");
        webView.loadData("", "text/html", null);
        initWebViewClient();
    }

    /**
     * 初始化WebView事件监听
     */
    private void initWebViewClient() {
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                if (listener!=null){
                    listener.onInitWebView(view);
                }
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return handlerUrl(url);
            }

            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                //super.onReceivedSslError(view, handler, error);
                handler.proceed();
            }
        });
        webView.getSettings().setJavaScriptEnabled(true);
        //设置进度调
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
                if (newProgress == 100) {
                    progressBar.setVisibility(View.GONE);
                } else {
                    progressBar.setVisibility(View.VISIBLE);
                    progressBar.setProgress(newProgress);
                }
            }
        });
    }

    /**
     * 设置网页片段
     *
     * @param data
     */
    public void setUrl(String data) {
        if (TextUtils.isEmpty(data)) {
            return;
        }
        webView.loadUrl(data);
    }

    class JsObject {

        private OnWebViewListener listener1;

        @JavascriptInterface
        public void showSource(String html) {
            if (listener1 !=null){
                listener1.onWebViewListener(html);
            }
        }

        @JavascriptInterface
        public void showHtml(String html) {
            if (listener1 !=null){
                listener1.onWebViewHtml(html);
            }
        }


        @JavascriptInterface
        public String toString() {
            return "local_obj";
        }

        public void setOnWebViewListener(OnWebViewListener l){
            listener1 = l;
        }

    }

    private boolean handlerUrl(String url) {
        Log.e("1212", url);
        return false;
    }

    private OnWebViewListener listener;

    public void setOnWebViewListener(OnWebViewListener l){
        listener = l;
        jsObject.setOnWebViewListener(listener);
    }

    public interface OnWebViewListener{
        void onWebViewListener(String content);
        void onInitWebView(WebView view);
        void onWebViewHtml(String content);
    }
}


核心代码1:

   jsObject = new JsObject();
        webView.addJavascriptInterface(jsObject, "local_obj");

这个JsObject类的代码

class JsObject {

        private OnWebViewListener listener1;

        @JavascriptInterface
        public void showSource(String html) {
            if (listener1 !=null){
                listener1.onWebViewListener(html);
            }
        }

        @JavascriptInterface
        public void showHtml(String html) {
            if (listener1 !=null){
                listener1.onWebViewHtml(html);
            }
        }


        @JavascriptInterface
        public String toString() {
            return "local_obj";
        }

        public void setOnWebViewListener(OnWebViewListener l){
            listener1 = l;
        }

    }

调用JsObject的方法:

  webView.loadUrl("javascript:window.local_obj.showSource(document.getElementById(\"roundTime\").innerHTML);");

上面的调用是获取h5上面id为roundTime的html元素

调用的时候记得local_obj,这个是引用名,一定要跟核心代码1设置的名字一样,之后才接方法名,showSource这个是JsObject的方法,传入值那个,就是一般的js的操作就行了
 
 

猜你喜欢

转载自blog.csdn.net/u014476720/article/details/78644329