android 破解验证码登录

1.添加依赖库

compile 'com.rmtheis:tess-two:6.2.0'

2.下载文字库,解压放到手机文件夹根目录

下载地址: http://download.csdn.net/download/qq_33063279/10231538

下完之后需要放入到手机根目录

先看网页的js源码 ,注意这几个字段,后期需要赋值:


可以看到验证码其实是一个url,破解时其实就是访问一次该页面,然后带着返回的cookie再请求验证码的url,拿到图片之后进行识别,识别完了再返回webView里面通过注入js方式将用户名,用户密码和验证码赋值,然后执行js里面的login方法

下面上代码:

package cn.gotocity.gyled.activity;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.webkit.CookieManager;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.googlecode.tesseract.android.TessBaseAPI;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import cn.gotocity.gyled.R;
import cn.gotocity.gyled.bean.WebLoginBean;
import cn.gotocity.gyled.utils.LogUtil;

/**
 * Created by Administrator on 2018/1/30.
 */

public class LoginWebViewActivity extends BaseActivity{private String DATAPATH = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator;
    private String DEFAULT_LANGUAGE = "eng";
    WebView webView;
    WebLoginBean bean;
    String username;
    String password;
    String code;
    String cookie;
    String imgeCode;
    boolean mainfail;
    private Handler handler = new Handler(){@Override
        public void handleMessage(Message msg) {if(msg.what == 1){String js = "javascript:$('#j_username').val('"+ username +"');" +"$('#j_password').val('"+ password +"');" +"$('#j_code').val('"+code+"');" +"doLogin();"+"void(0)";
                LogUtil.showLog("....main...js....."+js);
                webView.loadUrl(js);
            }else{cookie = "";
                webView.loadUrl(bean.getLoginUrl());
            }super.handleMessage(msg);
        }};

    @Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        //取消状态栏
        setContentView(R.layout.fragment_webview_main);
        webView = (WebView)findViewById(R.id.web_view);
        username = bean.getUsername();
        password = bean.getPassword();

        //设置主页流浪器登录界面
        WebSettings webSettings = webView.getSettings();

        webSettings.setJavaScriptEnabled(true);
        webSettings.setUseWideViewPort(true);
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setDisplayZoomControls(false);
        webSettings.setAllowFileAccess(true); // 允许访问文件
        webSettings.setBuiltInZoomControls(false); // 设置显示缩放按钮
        webSettings.setSupportZoom(false); // 支持缩放
        webSettings.setDomStorageEnabled(true);
        webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);

        webView.setWebViewClient(new WebViewClient() {@Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl(url);
                if(url.equals("登陆后的url")){//破解成功
                    mainfail  = true;
                }else{//破解失败 重新破解登录
                    mainfail  = false;
                    Message message = new Message();
                    message.what = 2;
                    handler.sendMessage(message);
                }return true;
            }@Override
            public void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);
                CookieManager cookieManager = CookieManager.getInstance();
                cookie = cookieManager.getCookie(url);
                //开始破解验证码图片
                startMainWebView();
            }});
        webView.loadUrl(bean.getLoginUrl());
        webView.setWebChromeClient(new WebChromeClient());
    }private void startMainWebView(){//验证码图片url 可打开url,查看页面源码得到
        imgeCode = "验证码图片url";
        new Thread(new Runnable() {@Override
            public void run() {Bitmap bitmap = null;
                bitmap = returnMainBitmap(imgeCode);
                saveMyBitmap(bitmap,"main");
                TessBaseAPI tessBaseAPI = new TessBaseAPI();
                tessBaseAPI.init(DATAPATH, DEFAULT_LANGUAGE);//参数后面有说明。
                tessBaseAPI.setImage(bitmap);
                code = tessBaseAPI.getUTF8Text();
                tessBaseAPI.clear();
                tessBaseAPI.end();
                if(mainfail){code = code+"!" ;
                }LogUtil.showLog("......MainCode....."+code);
                if(!TextUtils.isEmpty(code)){if(isNumeric(code)){LogUtil.showLog("----Main--验证码全是数字-------");
                        Message message = new Message();
                        message.what = 1;
                        handler.sendMessage(message);
                    }else{LogUtil.showLog("---Main---验证码有问题-------");
                        mainfail = false;
                        Message message = new Message();
                        message.what = 2;
                        handler.sendMessage(message);
                    }}else{LogUtil.showLog("---Main---验证码为空-------");
                    Message message = new Message();
                    message.what = 2;
                    handler.sendMessage(message);
                }}}).start();
    }private boolean isNumeric(String str){for (int i = 0; i < str.length(); i++){if (!Character.isDigit(str.charAt(i))){return false;
            }}return true;
    }/**
     * 根据图片的url路径获得Bitmap对象
     */
    private Bitmap returnMainBitmap(String url) {URL fileUrl = null;
        Bitmap bitmap = null;
        try {fileUrl = new URL(url);
        } catch (MalformedURLException e) {e.printStackTrace();
        }try {HttpURLConnection conn = (HttpURLConnection) fileUrl.openConnection();
            conn.setRequestProperty("Cookie", cookie);
            conn.setDoInput(true);
            conn.connect();
            InputStream is = conn.getInputStream();
            bitmap = BitmapFactory.decodeStream(is);
            is.close();
        } catch (IOException e) {e.printStackTrace();
        }return bitmap;
    }public void saveMyBitmap(Bitmap mBitmap,String bitName)  {File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+bitName + ".jpg");
        FileOutputStream fOut = null;
        try {fOut = new FileOutputStream(f);
        } catch (FileNotFoundException e) {e.printStackTrace();
        }mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut);

        try {fOut.flush();
        } catch (IOException e) {e.printStackTrace();
        }try {fOut.close();
        } catch (IOException e) {e.printStackTrace();
        }}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部