NodeJs模擬登陸正方教務(wù)
網(wǎng)上已經(jīng)有很多關(guān)于模擬登陸正方教務(wù)的作品了,基于 PHP,Python,Java,.Net 加上我自己嘗試的NodeJs,這幾門語言都可以實現(xiàn)模擬登陸,模擬登陸的技術(shù)點不是特別難,這里記錄一下利用 Node 碰到的一些坑,以及一些我自己的解決思路。
1. 收集模擬登陸信息
這一步最基礎(chǔ),通過 chrome 的 network 就可以查看跳轉(zhuǎn)的 post 或者 get 請求以及參數(shù)了。
注意勾選Preserve log 否則頁面跳轉(zhuǎn)你是看不到請求的。

注意點:出現(xiàn) (unable to decode value) 表示經(jīng)過 gbk 轉(zhuǎn)碼了,另外就是post的數(shù)據(jù)格式是 formdata

2. 登錄過程中 302 重定向
之前利用 PHP 就死在 重定向上,沒有搞定,總是會出現(xiàn) object moved to here.不同語言都有相關(guān)的解決辦法的,你用js庫,那就查看API,php是curl有這個方法的
3. NodeJs 自身
1、回調(diào)-----使用了 async 這個庫來解決回調(diào)。
2、異常處理-----express 框架就好了,自定義異常中間件,省心。
3、容易崩潰----- 使用 PM2 就好。
4、由于這里的使用場景相當(dāng)于是每個用戶登錄后,后端都要發(fā)送一次模擬登陸,如果碰到長時間目標(biāo)網(wǎng)站沒有響應(yīng),那么我采取了重試當(dāng)前操作的一種做法,所以如果響應(yīng)時間很長,那么是否可以先返回一個 loading 的狀態(tài),然后執(zhí)行完之后再通知前端?
這里我使用了 Socket-io 來搞定后端像前端定向通知的這么一種做法。
但是 socketio也有坑,就是服務(wù)端知道client id是可以發(fā)送數(shù)據(jù)給某一個客戶端的,但是前端如果一刷新頁面就會生成一個新的 client id,鑒于前端使用的單頁框架,在應(yīng)用啟動的時候就向服務(wù)端請求一個 token 然后 socket 在通信的時候帶上這個 token 和client id,并且保存在了 redis 中,這樣當(dāng)后端的異步請求抓取到數(shù)據(jù)的時候,只要通過這個 token 查找對應(yīng)的client id 即可。
5、代碼問題
剛開始犯了一個錯,就是拿客戶端編程的思維去寫 Node 結(jié)果發(fā)現(xiàn) 當(dāng)兩個用戶同時發(fā)送請求后,會導(dǎo)致變量數(shù)據(jù)發(fā)生沖突。換句話說,如果一開始定義了一個 aa 變量 A 用戶發(fā)送請求 寫入了數(shù)據(jù)到 aa ,B 用戶此時也是操作 了 aa 那么這個 aa其實就是出問題了,也就是說當(dāng)你啟動 NodeJs 之后,你所寫的全局變量將會永遠存在(很正常...)。
暫時解決的辦法就是 私有化,在入口統(tǒng)一使用了 new 的方式,這樣無論你并發(fā)多少個請求,相互之間的數(shù)據(jù)都不會受到影響。 不知道還有沒有更好的實現(xiàn)方式。
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關(guān)文章
nodejs入門教程三:調(diào)用內(nèi)部和外部方法示例
這篇文章主要介紹了nodejs入門教程之調(diào)用內(nèi)部和外部方法,結(jié)合實例形式分析了nodejs內(nèi)部與外部方法的定義與調(diào)用相關(guān)操作實現(xiàn)技巧,需要的朋友可以參考下2017-04-04
Nodejs Express 通過log4js寫日志到Logstash(ELK)
這篇文章主要介紹了Nodejs Express 通過log4js寫日志到Logstash(ELK),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
nodejs中art-template模板語法的引入及沖突解決方案
本篇文章主要介紹了nodejs中art-template模板語法的引入及沖突解決方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
node.js連接mongoose數(shù)據(jù)庫方法詳解
之前我們都是通過shell來完成對數(shù)據(jù)庫的各種操作的,在開發(fā)中大部分時候我們都需要通過程序來完成對數(shù)據(jù)庫的操作。而Mongoose就是一個讓我們可以通過Node來操作MongoDB的模塊2022-08-08

