关于Android与HTTP模拟验证码登录爬坑之旅

这是我的第一篇博客 希望用博客记录我的安卓学习之路  希望自己能把写博客这件事情坚持下去

最近在做安卓端模拟登录的问题 遇到问题整了好几个晚上也没弄好 终于在大神指点下想到了错误的原因 感觉很有纪念意义 所以想记录一下


首先我的登录网站是我们学校的图书馆系统 okhttp暂时还没有开始学习 所以我先在AS的gradle中引用

android {
    useLibrary 'org.apache.http.legacy'
}

使用旧版本的HTTPCLIENT进行HTTP请求 


因为之前 我做过了类似的POST请求 但是没有验证码 所以这次我主要卡在了验证码的获取 但其实总体思路是一样的 

我访问的网页验证码图片 是JS随机生成的数字添加在页面后缀 我的第一想法是先GET到页面JSOUP解析 然后获取图片SRC 在进行GET图片地址DOWN下来 进行登录 

但这样肯定不行的 并且JSOUP只能解析HTML 对于动态生成的无能为力 所以我放弃了 并且这样得到的图片也不是我POST请求时同步的验证码

而最正确的思路还在于一个东西 叫做COOKIE 服务器通过它识别用户的身份信息 我们要做的 就是先通过访问验证码地址获得COOKIE 然后拿着这个COOKIE去进行

POST请求  至于验证码随机生成的数字后缀这些 都是不重要的  因为服务器不是通过它和我们认识的 我们的纽带是COOKIE 并且通过实验也能反证 即使拿着相同后缀的验证码放入浏览器中 每次得到的结果也是不同的

 

说一些我遇到的坑 

1.拿到的COOKIE是直接访问图片,RESPONSE返回的COOKIE。我一开始是尝试先GET到LOGIN页面,然后获得LOGIN页面的COOKIE。再对图片进行访问。但这两者的COOKIE其实是不同的应该。这是我一直卡住的地方 

2.看看那些内容是POST表头必须要带的,了解了他们的含义

 httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
//  httpPost.addHeader("Accept-Encoding","gzip, deflate");
//  httpPost.addHeader("Accept-Language","zh-CN,zh;q=0.8");
  httpPost.addHeader("Referer", "http://xxxx");
  httpPost.addHeader("Origin","http://xxxx");
  httpPost.addHeader("Host","xxxx");
HOST是主页 REFERER是引用页,表示从哪个页面过来。比如我从LOGIN进入了READER页,REFERER就是.LOGIN这样 还有一些接受的格式之类 

3.在断点测试的时候还是发现了很多小失误 比如

List<NameValuePair> list=new ArrayList<NameValuePair>();
list.add(new BasicNameValuePair("number","XXX"));
list.add(new BasicNameValuePair("passwd","XX"));

UrlEncodedFormEntity entity=new UrlEncodedFormEntity(list,"utf-8");
httpPost.setEntity(entity);
不要忘记将表单内容添加到POST请求中 

 不要对错表单信息 我就想PASSWD当做了PASSWORD卡了好久

 AbstractHttpClient absclient=(AbstractHttpClient)httpclient ;
                        List<Cookie> cookies=absclient.getCookieStore().getCookies();
                        cookieStore=absclient.getCookieStore();
                        ((AbstractHttpClient) httpclient).setCookieStore(cookieStore);
                        for(int i=0;i<cookies.size();i++){
                            Cookie cookie=cookies.get(i);
                            String cookieName=cookie.getName();
                            String cookieValue=cookie.getValue();
                            editor.putString("cookieName",cookieName);
                            editor.putString("cookieValue",cookieValue);
                            editor.commit();
//                        Log.d("insw","cookieName-->"+cookieName);
//                        Log.d("insw","cookieValue-->"+cookieValue);
                        }
 HTTPCLIENT需要强制转换成父类 才能使用GETCOOKIESTORE和SETCOOKIESTORE





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值