oauth 验证码登陆

来源:互联网 发布:爱宝v6软件 编辑:程序博客网 时间:2024/06/06 19:53
oauth认证原理:本地存的不是用户密码,而是网站返回给的相当与该网站后门钥匙的密码总结:httpclient关于登陆时的验证码问题:其实就是网页的源码<input>节点上多了验证码的信息jericho-html-3.1.jar  html的解析包 //访问的豆瓣是html网页对html进行面向对象的封装.//Source是jar包中的一个类  Source source  = new Source(response.getEntity().getContent());//response.getEntity().getContent()是输入流    System.out.println( source.toString());//得到的是具体(错误)信息抢票神器的原理:获取网站http节点信息,生成post请求,建立一个for循环,得到的不是所要的code就一直请求判断是否需要验证码:传入网页url开启url连接   解析html(jericho-html-3.1.jar Sourse类)   迭代找到对应节点的value   例子: <img alt="请开启图片显示以获得验证码" src="/captcha/Wwlp6V4FsRJNcgVRuxy8hYdB/?size=m" /><br />            <p>            <span id="captcha_block">请输入上图中的单词</span>            </p>            <input type="text" name="captcha-solution" tabindex="3"/>            <input type="hidden" name="captcha-id" value="Wwlp6V4FsRJNcgVRuxy8hYdB"/>/** * 判断是否需要输入验证码 并返回验证码值 *这个过程相当于独立解析了html,和登陆与否没有直接联系 */public static String isNeedCaptcha(Context context) throws Exception{String loginurl = context.getResources().getString(R.string.loginurl);URL url = new URL(loginurl); URLConnection  conn  = url.openConnection(); Source source = new Source(conn); List<Element> elements = source.getAllElements("input"); for(Element element : elements){   String result = element.getAttributeValue("name");   if("captcha-id".equals(result)){   return element.getAttributeValue("value");   } } return null;}//验证码图片加载过程public static Bitmap getImage(String path) throws Exception{URL url = new URL(path);HttpURLConnection conn =  (HttpURLConnection) url.openConnection();InputStream is = conn.getInputStream();return  BitmapFactory.decodeStream(is);//直接转化为bitmap对象}String imagepath = getResources().getString(R.string.captchaurl)+result+"&size=s";//补全图片对应路径urlBitmap bitmap = NetUtil.getImage(imagepath);Message msg = new Message();msg.what=NEED_CAPTCHA;msg.obj = bitmap;//obj传递给handlerhandler.sendMessage(msg);case NEED_CAPTCHA:mCaptchaLinearLayout.setVisibility(View.VISIBLE);Bitmap bitmap = (Bitmap) msg.obj;mImageViewCaptcha.setImageBitmap(bitmap);break;更换用户帐号:将本地保存的后门密码变更new AsyncTask<Void, Void, Void>() {//onPreExecute 在异步任务执行之前调用的方法 // 运行在主线程里面的 // 初始化ui的操作@Overrideprotected void onPreExecute() {showLoading();super.onPreExecute();}// onPostExecute 在异步任务(后台任务)执行之后调用的方法 // 运行在ui线程中 , // @Overrideprotected void onPostExecute(Void result) {// doInBackground 后台执行的任务 // 方法运行在一个子线程当中 @Overrideprotected Void doInBackground(Void... params) {// 执行耗时的操作 

0 0