關於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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章