本文只是提取了一些派派自动答题工具的部分代码进行说明。原理只是原生和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);
}
}
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的操作就行了