1. 程式人生 > >如何寫一個屬於自己的查成績app

如何寫一個屬於自己的查成績app

一、準備工作

準備工具:電腦

軟體:Fiddler 4(哪個都行,只要抓包)

開啟我們學校的教務網站http://202.192.240.29/login!welcome.action


 

點選驗證碼框,會向伺服器傳送get請求,這是我抓到的請求內容


伺服器返回的是一個驗證碼


當我輸入驗證碼,然後點選登入,這是我抓到的包


這裡可以看到請求的內容是account=311500xxxx&pwd=xxxxxx&verifycode=84ga

這裡不用多講吧,account是學號,pwd當然是password啦,verifycode肯定是驗證碼啦。

 

當我們登入成功,伺服器回返回一個json資料,成功的code0message是“登入成功”,如果錯誤的話,code-1message會提示你錯誤的方式。

 

 

然後我們點選成績查詢。


這是我抓到的資料,這裡伺服器同樣返回的是json資料,這很有利於我們的解析。

       到這裡,我們的前期準備工作已經完成,下一步,幹嘛呢?

 

二、主要思路

    這裡我開始介紹,我的主要思路。當然這裡需要你對http協議有那麼一點的認識,強烈推薦一本快速入門的書《圖解

http》。

       我們可以看到,我每次傳送post請求或者get請求時都會有這麼一個東西Cookie:JSESSIONID=BCA9EDDA29865D38E7D7344D975D78A6這是啥東西呢?因為http協議是無狀態的,那麼我們要怎麼確認當前使用者就是剛剛登陸的使用者呢?所以這裡就有了JSESSIONID要是不明白,請百度(JSESSIONID),然後你看看應該就會明白了,這裡假設你已經明白了。

   這個JSESSIONID是當我們第一次開啟教務網站的時候,伺服器給我們分配的。有圖有真相,看圖。


       這裡的Set-Cookie: JSESSIONID=428F8358B38BB1C1B9B344E5D1D79DA2;Path=/; HttpOnly我們主要關心這個JSESSIONID=428F8358B38BB1C1B9B344E5D1D79DA2(這裡為啥跟上面不一樣呢,因為我重新打開了瀏覽器,系統又重新給我分配的),這裡的set-cookie就給我們設定了JSESSIONID,這裡就是我們當前登入的唯一標識,所以我們每次傳送請求的時候都要帶上它。

 

 

 

三、具體實現(Java實現)

 

       class myVerifyThread extends Thread{

        @Override

        public void run() {

            try {

                HttpClient httpClient = newDefaultHttpClient();

                HttpGet httpGet = new HttpGet(“http://202.192.240.29/yzm?d=1515824347343”);

               httpGet.setHeader("Accept","*/*");

               httpGet.setHeader("Connection","keep-alive");

               httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132Safari/537.36");

                HttpResponse httpResponse =httpClient.execute(httpGet);

                if(httpResponse.getStatusLine().getStatusCode() == 200) {

                    SaveCookies(httpResponse);//儲存獲得的JSESSIONID

                    // 請求和響應都成功了

                    byte[] bytes;

                    bytes =EntityUtils.toByteArray(httpResponse.getEntity());

                    Message message=new Message();

                    Bundle bundle=new Bundle();

                   bundle.putByteArray("verify",bytes);

                    message.setData(bundle);

                    message.what=1001;

                   handle.sendMessage(message);//獲取驗證碼

                }

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

 

這裡是想伺服器傳送get請求,也就是獲得驗證碼。

這裡把獲得驗證碼傳送出去。


這裡把驗證碼顯示出來。

   下面這個函式是儲存從服務那邊獲得的JSESSIONID



然後我們實現登入功能。

   



這裡我們再把JSESSIONID給新增到請求頭那裡去,這樣我們就完美欺騙了伺服器,我就是剛剛第一訪問你的那個我。(其他的頭可以根據抓包那裡的頭來設定)

   



這裡解析伺服器返回我們的json資料。


 

到這裡大家應該都懂了吧。

   具體思路就是給伺服器傳送http請求,然後儲存伺服器返回的JSESSIONID,然後我們訪問的時候都要把JSESSIONID新增到post請求頭那裡,這樣我們就可以訪問了。

 


    歡迎關注我的公眾


有問題可以給我留言。