蘭州理工大學 毛東航 馬思明 毛姝然
甘肅政法學院 張金霞
基于android的教務管理系統
蘭州理工大學 毛東航 馬思明 毛姝然
甘肅政法學院 張金霞
隨著計算機技術的進步,各高校已經陸續的開始利用教務管理系統進行學校的日常管理,為滿足實際需要,基于B/S 架構并支持移動智能端的教務管理與校園信息系統的研發與應用已成為研究熱點。本設計將用網絡請求框架OkHttp、抓包工具httpwatch、Jsoup庫解析HTML、正則表達式等知識實現 Android 端訪問教務管理系統,比如進行課表查詢、學生選課、成績查詢以及教學評價等功能。Android 教務系統的開發與實現很好地實踐了我校智慧校園的建設。
Jsoup;正則表達式;HttpWatch;OKHttp
通過開發一款 Android 手機軟件,實現手機端訪問教務管理系統,比如進行 課表查詢、學生選課、成績查詢以及教學評價等。目前很多高校教務系統采用的是正方教務系統,但是教務相關的數據庫是不會對外開放的,我們想要查到成績等一系列教務操作就得自己抓包得到我們想要的數據。我們需要掌握的知識有網絡請求框架、抓包工具、解析HTML、正則表達式。本設計用okhttp流程是首先使用OkHttp網絡請求框架來模擬登錄教務系統,然后利用Jsoup庫來解析獲取到的html代碼,最后只要處理下數據將其顯示到界面上就可以了,android界面布局及設計采用2014年谷歌推出的界面設計語言-Material Design。
抓包工具有很多,Fiddler這個工具很強大,還有谷歌瀏覽器內置的開發者工具等等。但是對于本次設計,我們采用較簡單的httpwatch,首先下載好破解版的httpwatch,然后訪問教務系統登錄頁面,在IE瀏覽器工具欄中打開httpwatch,點擊Record按鈕就開始抓包。
http協議是互聯網上應用最為廣泛的一種網絡協議。HTTP請求格式主要有四部分組成,分別是:請求行、請求頭、空行、消息體,每部分內容占一行。服務器接收處理完請求后返回一個HTTP相應消息給客戶端,HTTP響應消息的格式包括:狀態行、響應頭、空行、消息體,每部分內容占一行。我們用到的請求方法是get和post,它的工作原理是客戶端向服務器發出一條http請求,服務器收到請求后會返回一些數據給客戶端,然后客戶端再對這些數據進行解析和處理就可以了。
我們先來看看驗證碼的請求地址吧,確保點擊了Record按鈕后,點擊登錄界面上的看不清換一張,從HttpWatch記錄的信息可以知道發送了GET請求,這里我們最需要關心的是獲取驗證碼的請求地址。我們在Overview可以看到請求地址,請求返回狀態為200,訪問成功(如圖1所示)。

圖1 獲取驗證碼抓包數據
填好用戶名,密碼及驗證碼后點擊登錄按鈕,登錄成功后,發現發送了POST請求,與GET請求不同的是我們不僅僅要關注請求的地址,還要關心請求Header以及Post的數據,而這三項可以分別在Http-Watch中的Overview, Header和POST Data這三個選項卡中查看。這里我們看到登錄成功后,狀態碼是302,而不是200,說明這里進行了重定向,我們能發現302請求下面那個GET請求的URL和你瀏覽器地址欄的網址是一樣的,也就是我們點擊登錄后,數據是發送給302那個地址的,最后才重定向到這個200的地址來(如圖2所示)。所以我們后面設置登錄的Header時,Referer的值就直接設置這個狀態碼為200的地址就可以了,數據驗證成功后直接跳轉到這兒。對于POST data中的每一項都要傳,沒有值的傳空字符串,亂碼的查看源代碼就能獲得值(如圖3所示)。查詢課表和查詢成績等也是類似的操作,均為GET請求,就不必再看POST data這一項數據。

圖2 登錄post請求頭

圖3 post請求登錄的數據
在過去,Android上發送HTTP請求一般有兩種方式:HttpURLConnection和HttpClient。由于HttpClient存在API數量過多、擴展困難等缺點,在Android6.0系統中,HttpClient的功能完全被移除,標志著此功能正式被棄用,然而現在有許多出色的網絡通信庫都可以替代原生的HttpURLConnection,而其中OkHttp是最出色的一個,現在已經成了廣大Android開發者首選的網絡通信庫。在使用OKHttp之前,我們需要先在項目中添加OKHttp庫的依賴,編輯app/build.gradle文件在dependencies閉包中添加:compile ‘com.squareup.okhttp3:okhttp:3.4.1’。
Jsoup是用來提取和操作存儲在Html代碼中的數據的Java開源庫。用法簡單,功能強大,提供了一套十分完備的API,讓我們能夠輕松的解析Html代碼。它可以從URL,字符串或文件中解析Html,Jsoup本身就可以發送GET,POST等一系列請求,并解析Html代碼,但它也存在一些不足,如果頁面代碼是AJAX是動態生成的,那么可能會發生抓取不到數據的情況,可能要自己模擬AJAX請求才行。我們項目里也只是用Jsoup來解析OkHttp請求成功后返回的字符串數據。使用Android Studio編寫代碼,需要在項目的build.gradle中添加依賴:compile 'org.jsoup:jsoup:1.9.2'。利用Jsoup來抽取數據,重點是能找出所要查找元素的唯一特性,就能快速定位,最后利用抽取文本、屬性等方法就能得到我們想要的數據了。
正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。構造正則表達式的方法和創建數學表達式的方法一樣。也就是用多種元字符與運算符可以將小的表達式結合在一起來創建更大的表達式。正則表達式的組件可以是單個的字符、字符集合、字符范圍、字符間的選擇或者所有這些組件的任意組合。登錄成功時,查看部分HTML代碼。學生姓名位于id為”xhxm”的span標簽中,由于這個id是唯一的,所以直接通過Element nameElement = document.getElementById("xhxm"); 查找元素,在利用Element的html()方法取得內容,最后使用正則表達式取得學生姓名。Pattern p = Pattern.compile("(.+)[^同學]");
當OkHttp成功獲取驗證碼后,會返回的byte[]數據。我們可以通過BitmapFactory提供的decodeByteArray()方法將字節數組轉化為Bitmap,但是如果直接將Bitmap設置為ImageView的background,驗證碼圖片會特別小,所以再利用Matrix按比例縮放我們的Bitmap,最后就可以使用setBackground()方法設置ImageView的背景圖片了。
[1]孫振興.大學校園移動信息化平臺的研究[D] .大慶:東北石油大學,2011.
[2]李童浩.基于Android的校園信息交互平臺的設計與開發[D].蘭州:蘭州大學,2012.
[3]劉宗平.淺析數字化校園建設中的移動校園平臺建設[J].科技創新與應用,2013(14):83.