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