如何寫一個屬於自己的查成績app
一、準備工作
準備工具:電腦
軟體:Fiddler 4(哪個都行,只要抓包)
開啟我們學校的教務網站http://202.192.240.29/login!welcome.action
點選驗證碼框,會向伺服器傳送get請求,這是我抓到的請求內容
伺服器返回的是一個驗證碼
當我輸入驗證碼,然後點選登入,這是我抓到的包
這裡可以看到請求的內容是account=311500xxxx&pwd=xxxxxx&verifycode=84ga
這裡不用多講吧,account是學號,pwd當然是password啦,verifycode肯定是驗證碼啦。
當我們登入成功,伺服器回返回一個json資料,成功的code是0,message是“登入成功”,如果錯誤的話,code是-1,message會提示你錯誤的方式。
然後我們點選成績查詢。
這是我抓到的資料,這裡伺服器同樣返回的是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請求頭那裡,這樣我們就可以訪問了。
這是效果圖。
相關文章
- Python,寫一個簡單的屬於自己的『BaseEnum』類Python
- 如何釋出第一個屬於自己的npm包NPM
- 如何開發屬於自己的第一個Java程式?Java
- 如何開發屬於自己的第一個Java程式Java
- 實現一個屬於自己的React框架(一)React框架
- 直播原始碼如何搭建一個屬於自己的直播平臺?原始碼
- js視訊轉字元畫 —— 寫一個屬於自己的字元轉換器JS字元
- 如何免費做一個屬於自己穩定有效的圖床圖床
- 如何 DIY 一臺屬於你自己的電腦
- 一分鐘釋出一個屬於自己的npm包NPM
- 「山禾說成長」:手把手教你搭建一個完全屬於自己的技術部落格
- Flutter實戰(一)寫一個天氣查詢的APPFlutterAPP
- 寫一個屬於你的前端腳手架工具前端
- 論如何自己寫一個Python的模板語言Python
- 如何自己寫一個網路爬蟲爬蟲
- 如何用不到200行程式碼寫一款屬於自己的js類庫行程JS
- 萬字長文詳解如何搭建一個屬於自己的部落格(純手工搭建??)
- Flutter實戰1 --- 寫一個天氣查詢的APPFlutterAPP
- Flutter實戰2 — 寫一個天氣查詢的APPFlutterAPP
- Flutter實戰(二)寫一個天氣查詢的APPFlutterAPP
- Flutter實戰2 --- 寫一個天氣查詢的APPFlutterAPP
- 手寫一個自己的PromisePromise
- 基於Gitea打造一個屬於你自己的程式碼託管平臺Git
- 自己寫一個ProviderIDE
- 一文搞懂如何自己寫一個Python庫Python
- 200程式碼寫一套屬於自己的事件匯流排(EventBus)庫事件
- node中的http會了嗎? 來手寫一個屬於自己的'cgp-server'靜態服務HTTPServer
- 如何使用Typora寫出自己的第一個部落格
- 使用Vue製作一個屬於自己的音樂播放器!Vue播放器
- 如何搭建屬於自己的股票交易系統?
- 3、查詢平均成績大於等於60分的同學的學生編號和學生姓名和平均成績
- 建立動態陣列,輸入5個學生的成績,另外用一個函式檢查其中有無低於60分的,輸出不合格的成績陣列函式
- 親測三遍!8步搭建一個屬於自己的網站網站
- 打造屬於自己的underscore系列 ( 一 ) - 框架設計框架
- 記錄一條屬於自己的gitlab流水線Gitlab
- 跟大神一起製作一個屬於自己的Linux作業系統!Linux作業系統
- 建立屬於自己的NPM包NPM
- 如何讓自己成為一個專業的高階開發?
- 終於實現了一門屬於自己的程式語言