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";//补全图片对应路径url
Bitmap bitmap = NetUtil.getImage(imagepath);
Message msg = new Message();
msg.what=NEED_CAPTCHA;
msg.obj = bitmap;//obj传递给handler
handler.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的操作
@Override
protected void onPreExecute() {
showLoading();
super.onPreExecute();
}
// onPostExecute 在异步任务(后台任务)执行之后调用的方法
// 运行在ui线程中 ,
//
@Override
protected void onPostExecute(Void result) {
// doInBackground 后台执行的任务
// 方法运行在一个子线程当中
@Override
protected Void doInBackground(Void... params) {
// 执行耗时的操作
oauth 验证码登陆
最新推荐文章于 2023-05-06 14:44:14 发布