教務系統
本文將講一下如何通過Node.JS登錄正方教務系統并獲取用戶信息。
本文涉及的正方教務系統有一個特點,就是地址中必須包含一串隨機代碼,例如:
鏈接地址后綴
本文要求【觀看者】有兩個要求網校哪個好,滿足其中任何一個即可理解。
對于有了解的人,會有專家指導。
如果你滿足以上任何一個條件,那么就可以看我一步步來啦~
如何獲取學校教務系統的IP地址?
通過【終端】ping學校教務系統,獲取IP。這一步是為了保證后面請求中驗證碼的正確性做準備。
【贏】
Win鍵+R鍵輸入xx.xxxx.xx
【蘋果】
?鍵+空格鍵輸入終端 ping xx.xxxx.xx
注意:需要刪除或
PS:教務系統IP獲取! ~
如何分析需要準備的一切?
登錄界面
【直觀看到】
用戶名 密碼 驗證碼 身份信息
【非直觀】---用瀏覽器F12打開控制臺
單擊單擊登錄按鈕單擊?.aspx 查找表單數據
請求清單
大致如上圖所示,此時你可能想知道為什么有這么多。別擔心,這些東西大部分都是因為學校懶得刪除而留下來的。您可以輸入您的個人信息正方教務系統,點擊登錄正方教務系統,查看需要輸入的內容。
PS:獲取所需的數據分析! ~
如何解決驗證碼問題?
我們登錄教務系統的難點只有兩個:一是接口請求,二是獲取驗證碼。這個老版本的教育系統是用.Net編寫的,所以我們只能通過請求下載來獲取驗證碼。
F12打開控制臺,從標簽上找到驗證碼。驗證碼的URL以.aspx結尾。
這時就無法按照傳統的圖像鏈接方法進行處理了。我們可以這樣理解。首先這個驗證碼必須是動態地址。那么我們如何獲取這個動態地址呢?我們有一個學術管理系統的鏈接,xxx.xxx.xxx/()/.aspx。我們來做個假設。我把xx.aspx放在鏈接后面的驗證碼上。是這樣嗎?好的? (經過我的實際實驗,是可以的,我們的驗證碼問題就解決了)
PS:獲取驗證碼問題的解決方案! ~
參數中有奇怪的長數據怎么辦?
請求參數的表單數據很長。這里都是什么?說實話,我不知道那是什么。我只是知道有這樣一個標簽隱藏在頁面結構中的一個小地方才能找到它。
隱藏標簽
您可以通過搜索[ctrl/? + F]找到該標簽。
PS:解決參數get又長又奇怪的問題! ~
如何編寫獲取驗證碼數據的接口?
const hostUrl = '學校教務系統IP'; const getCodeUrl = ctx => { return new Promise((resolve, reject) => { superagent .get(hostUrl) .charset('gb2312') .set(headers) .end(function(err, res) { console.log('res', res); const body = res.text; // 獲得重定向地址 const systemUrl = res.redirects[0]; // 獲得codeUrl后綴 $ = cheerio.load(body); const viewState = $('#form1 > input')[0].attribs.value; // 替換返回驗證碼地址 const codeUrl = systemUrl.replace(/default2.aspx/, 'CheckCode.aspx'); resolve({ codeUrl, viewState, systemUrl }); }); }); };
提供使用模塊的現成版本。
PS:獲取驗證碼數據接口獲取! ~
登錄界面怎么寫?
// 獲取系統主頁面 const getMainSystemUrl = payload => { // 傳參 const url = payload.systemUrl; const __VIEWSTATE = payload.__VIEWSTATE; const data = { __VIEWSTATE, txtUserName: payload.txtUserName, Textbox1: '', TextBox2: payload.TextBox2, txtSecretCode: payload.txtSecretCode, RadioButtonList1: '%D1%A7%C9%FA', Button1: '', lbLanguage: '', hidPdrs: '', hidsc: '' }; return new Promise((resolve, reject) => { superagent .post(url) .charset('gb2312') .set(headers) .send(data) .end(function(err, res) { const mainSystemUrl = res.redirects[0]; const body = res.text; $ = cheerio.load(body); const stuName = $('#xhxm') .text() .replace(/同學/, ''); resolve({ url: mainSystemUrl, name: stuName }); }); }); };
提供一個現成的,主要使用“解構賦值”和模塊。
PS:登錄界面搞定! ~
本文主要記錄模擬登錄正方教務系統時遇到的問題解決方法和思路。如果確實遇到困難,可以私信或者在下面評論,我會及時回復提供幫助。