nodejs模拟登陆旧版正方教务系统
nodejs模擬登陸舊版正方教務(wù)系統(tǒng)
- nodejs模擬登陸學(xué)校教務(wù)系統(tǒng)
- 1、分析教務(wù)系統(tǒng)地址
- 2、分析請(qǐng)求頭和請(qǐng)求數(shù)據(jù)
- 3、對(duì)Cookie、__VIEWSTATE數(shù)據(jù)的獲取
- (1)獲取cookie
- (2)獲取__VIEWSTATE
- 4、得到用戶(hù)數(shù)據(jù)開(kāi)始模擬登陸
- 5、跳轉(zhuǎn)到教務(wù)系統(tǒng)個(gè)人主頁(yè)面
- 6、全部代碼
nodejs模擬登陸學(xué)校教務(wù)系統(tǒng)
因?yàn)閯傔M(jìn)入大一,學(xué)習(xí)了一些網(wǎng)頁(yè)設(shè)計(jì)的知識(shí),大一寒假期間,學(xué)習(xí)了解了一些微信小程序開(kāi)發(fā),并制作了登陸學(xué)校教務(wù)系統(tǒng)獲取課表的小程序,本篇文章主要講解的是舊版正方教務(wù)系統(tǒng)的模擬登陸,其他教程網(wǎng)絡(luò)上也有很多相似的教程,此教程僅供學(xué)習(xí)參考,使用的nodejs模塊為:
var request = require('request');//發(fā)送請(qǐng)求的模塊 var iconv = require('iconv-lite');//防止編碼錯(cuò)亂的模塊 var fs = require('fs');//儲(chǔ)存驗(yàn)證碼到本地的文件操作模塊 var readline = require('readline');//讀取用戶(hù)鍵盤(pán)輸入的模塊 var jsdom = require("jsdom");//解析網(wǎng)頁(yè)dom的模塊需要使用的請(qǐng)自行npm i xxxx
1、分析教務(wù)系統(tǒng)地址
學(xué)校教務(wù)系統(tǒng)的首頁(yè)為:http://218.195.117.143/
學(xué)校教務(wù)系統(tǒng)驗(yàn)證碼的為:http://218.195.117.143/CheckCode.aspx
2、分析請(qǐng)求頭和請(qǐng)求數(shù)據(jù)
我們隨意在用戶(hù)名密碼驗(yàn)證碼輸入欄中輸入數(shù)據(jù)點(diǎn)擊登陸,查詢(xún)控制臺(tái)數(shù)據(jù)如下:
分析數(shù)據(jù)我們可以發(fā)現(xiàn),我們這邊需要提供用戶(hù)名密碼驗(yàn)證碼,以及__VIEWSTATE和RadioButtonList1數(shù)據(jù),在請(qǐng)求頭上我們正常復(fù)制,僅僅在cookie上需要進(jìn)行一些操作。
后續(xù)我通過(guò)Fiddler抓包發(fā)現(xiàn)RadioButtonList1是教務(wù)系統(tǒng)登陸界面下的學(xué)生選項(xiàng),所以我們的主要問(wèn)題是在于cookie、__VIEWSTATE數(shù)據(jù)的獲取
3、對(duì)Cookie、__VIEWSTATE數(shù)據(jù)的獲取
(1)獲取cookie
獲取cookie首先我們考慮登陸的時(shí)候要保證驗(yàn)證碼對(duì)應(yīng)cookie,這樣我們輸入驗(yàn)證碼登陸的時(shí)候保證cookie對(duì)應(yīng)驗(yàn)證碼,這樣就能正常登陸了,因此我們首先創(chuàng)建cookie的全局變量,再通過(guò)request向驗(yàn)證碼發(fā)送get請(qǐng)求保存驗(yàn)證碼再保存cookie。
(2)獲取__VIEWSTATE
通過(guò)對(duì)教務(wù)系統(tǒng)網(wǎng)頁(yè)的代碼分析,我們發(fā)現(xiàn)__VIEWSTATE存在于網(wǎng)頁(yè)代碼中,所以我們?cè)谡?qǐng)求登陸頁(yè)面的時(shí)候通過(guò)分析網(wǎng)頁(yè)得到__VIEWSTATE即可。
獲取cookie和__VIEWSTATE代碼如下(代碼中有使用readline模塊讀取用戶(hù)輸入驗(yàn)證碼):
var request = require('request') var iconv = require('iconv-lite') var fs = require('fs') var readline = require('readline'); const jsdom = require("jsdom");let url = 'http://218.195.117.143/' let url2 = 'http://218.195.117.143/CheckCode.aspx'//創(chuàng)建readline接口實(shí)例(讀取用戶(hù)輸入要先創(chuàng)建readline接口實(shí)例) var rl = readline.createInterface({input: process.stdin,output: process.stdout });var cookie = '';; var __VIEWSTATE = ''; var answers = '';//驗(yàn)證碼//獲取__VIEWSTATE request(url, function (error, response, body) {var arr = body.split('"');__VIEWSTATE = arr[119];//這邊因?yàn)閼械萌ソ馕鰀om,干脆取巧直接解析字符串獲取console.log('__VIEWSTATE是:' + __VIEWSTATE);//輸出一下信息確認(rèn)內(nèi)容 });//獲取驗(yàn)證碼并儲(chǔ)存到本地, let stream = fs.createWriteStream("./code.jpg");request(url2, function (error, response, body) {cookie = response.headers["set-cookie"][0];//這邊通過(guò)response得到cookierl.question("請(qǐng)輸入驗(yàn)證碼:", function (answer) {answers = answer;//這邊得到用戶(hù)輸入的驗(yàn)證碼}); }).pipe(stream).on('close', function () {console.log(cookie); });4、得到用戶(hù)數(shù)據(jù)開(kāi)始模擬登陸
我們之前通過(guò)對(duì)請(qǐng)求的分析得到了post需要填入的數(shù)據(jù),這時(shí)候我們復(fù)制粘貼剛才的數(shù)據(jù),直接照著數(shù)據(jù)發(fā)送post請(qǐng)求(post請(qǐng)求部分代碼如下):
request.post({url: url, headers: {"Cookie": cookie}, encoding: null, form: {"__VIEWSTATE": __VIEWSTATE,"txtUserName": "這邊輸入賬號(hào)","TextBox1": '',"TextBox2": "這邊輸入密碼","txtSecretCode": answers,'RadioButtonList1': '%D1%A7%C9%FA','Button1': '','lbLanguage': '','hidPdrs': '','hidsc': ''} }, function (error, response, body) {var buf = iconv.decode(body, 'gb2312');//這里是對(duì)得到的網(wǎng)頁(yè)數(shù)據(jù)進(jìn)行編碼設(shè)置console.log(buf.toString()); });我們正常運(yùn)行該js,根據(jù)同目錄下生成的驗(yàn)證碼輸入驗(yàn)證碼信息,得到的截圖如下:
這邊其實(shí)我們可以看到以及登陸成功了,網(wǎng)頁(yè)上的信息提示我們跳轉(zhuǎn)到其他頁(yè)面,這邊我們?cè)僮鲆淮尉W(wǎng)頁(yè)跳轉(zhuǎn)測(cè)試效果。
5、跳轉(zhuǎn)到教務(wù)系統(tǒng)個(gè)人主頁(yè)面
request.get({url: url+'xs_main.aspx?xh=這邊填學(xué)號(hào)', encoding: null, headers: {"Cookie": cookie} }, function (e, r, b) {var buf2 = iconv.decode(b, 'gb2312');console.log(buf2.toString()); });截圖如下:
我們翻閱過(guò)輸出的信息后發(fā)現(xiàn)確實(shí)是我們成功登錄到教務(wù)系統(tǒng)的網(wǎng)頁(yè)代碼,因此我們模擬登陸教務(wù)系統(tǒng)的功能實(shí)現(xiàn)完成!
6、全部代碼
var request = require('request') var iconv = require('iconv-lite') var fs = require('fs') var readline = require('readline'); const jsdom = require("jsdom");let url = 'http://218.195.117.143/' let url2 = 'http://218.195.117.143/CheckCode.aspx'//創(chuàng)建readline接口實(shí)例(讀取用戶(hù)輸入要先創(chuàng)建readline接口實(shí)例) var rl = readline.createInterface({input: process.stdin,output: process.stdout });var cookie = '';; var __VIEWSTATE = ''; var answers = '';//驗(yàn)證碼//獲取__VIEWSTATE request(url, function (error, response, body) {var arr = body.split('"');__VIEWSTATE = arr[119];//這邊因?yàn)閼械萌ソ馕鰀om,干脆取巧直接解析字符串獲取console.log('__VIEWSTATE是:' + __VIEWSTATE);//輸出一下信息確認(rèn)內(nèi)容 });//獲取驗(yàn)證碼并儲(chǔ)存到本地, let stream = fs.createWriteStream("./code1.jpg");request(url2, function (error, response, body) {cookie = response.headers["set-cookie"][0];//這邊通過(guò)response得到cookierl.question("請(qǐng)輸入驗(yàn)證碼:", function (answer) {answers = answer;//這邊得到用戶(hù)輸入的驗(yàn)證碼request.post({url: url, headers: {"Cookie": cookie}, encoding: null, form: {"__VIEWSTATE": __VIEWSTATE,"txtUserName": "這里輸入學(xué)號(hào)","TextBox1": '',"TextBox2": "這里輸入密碼","txtSecretCode": answers,'RadioButtonList1': '%D1%A7%C9%FA','Button1': '','lbLanguage': '','hidPdrs': '','hidsc': ''}}, function (error, response, body) {var buf = iconv.decode(body, 'gb2312');//這里是對(duì)得到的網(wǎng)頁(yè)數(shù)據(jù)進(jìn)行編碼設(shè)置console.log(buf.toString());request.get({//跳轉(zhuǎn)到教務(wù)系統(tǒng)個(gè)人主頁(yè)面url: url+'xs_main.aspx?xh=這里輸入學(xué)號(hào)', encoding: null, headers: {"Cookie": cookie}}, function (e, r, b) {var buf2 = iconv.decode(b, 'gb2312');console.log(buf2.toString());});});}); }).pipe(stream).on('close', function () {console.log(cookie); });總結(jié)
以上是生活随笔為你收集整理的nodejs模拟登陆旧版正方教务系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 匕年级下册计算机计划,七年级下学期班主任
- 下一篇: 【造轮子/更新】打造一个简单的万能Exc