Java 模擬 58登錄 (一) 分析
標籤(空格分隔): Java
實習期間需要做一個模擬58登錄然後爬取簡歷,第一次做項目遇到很多坑
同時網上關於58登錄的又沒有很多資料,遇到了很多坑,這裏記錄一下,方便自己以及他人學習
源代碼放在Github
有關實現的分析,可以參考我的另一篇博客 Java 模擬58登錄(二) 實現
前言
這裏是通過手機動態碼的方式來登錄58, 而非帳號密碼, 適用於第三方網站登錄使用
原因是模擬密碼登錄的時候, 當我用其他人賬號在我這裏登錄58的時候就會出現賬號登錄限制
需要手機動態碼驗證之後纔可以登錄,所以決定直接手機動態碼的登錄。
如果你知道這裏的機制或者知道如何避免,請告知我[email protected]
分析
一 記錄Http Request請求
首先是登錄58, 查看登錄期間的Http Request請求
其中,connect和clientid對我們模擬登錄沒有影響
可以發現大致的流程如下
- 發送Get請求(data?), 獲取 token
- 發送Get請求(getcode?), 請求發送手機驗證碼, 同時獲得一個tokencode
- 發送Get請求(login?), 輸入手機號,動態碼以及其他相關參數來發送登錄請求
- 登錄成功
二 查看Http Request請求詳細內容
1 查看登錄Js代碼
我們先看下登錄的關鍵js代碼,看都需要哪些參數
function codeCommitLogin() {
loginClickLog("from=PC_login_sj_dlqq");
$("#loginMobileButton").attr("disabled", "disabled");
var source = $("#source").val();
var mobile = $("#loginMobile").val();
var mobilecode = $("#loginMobilecode").val();
var validatecode = $("#validatecodeMobile").val();
var token = $("#tokenMobile").val();
var tokencode = $("#tokencodeMobile").val();
var path = $("#path").val();
var rsaModulus = $("#rsaModulusMobile").val();
var rsaExponent = $("#rsaExponentMobile").val();
var timesign = (new Date).getTime() + timespan;
var isremember = $("#isremember_id_new_mobile").prop("checked");
var fingerprint = "";
if (typeof fingerPrint != "undefined") {
fingerprint = fingerPrint.get()
}
if (typeof Fingerprint2 != "undefined") {
var fp = new Fingerprint2;
var finger2 = fp.get()
} else {
var finger2 = ""
}
var p = encryptString(timesign + encodeURIComponent(mobile), rsaExponent, rsaModulus);
var url = "//passport.58.com/mobile/pc/login?callback=?&mobile=" + p + "&mobilecode=" + mobilecode + "&source=" + source + "&token=" + token + "&tokencode=" + tokencode + "&fingerprint=" + fingerprint + "&isremember=" + isremember + "&finger2=" + finger2 + "&path=" + path;
$.getJSON(url, function(result) {
codeSuccessCommitLoginFunction(result)
})
}
2 參數分析
- 這裏的話,finger2和fingerprint是唯一確定瀏覽器的參數,每個瀏覽器都有不同的值
這裏直接從瀏覽器拷貝,沒有影響
- timeSpan時間戳, 表示的是整個登錄的時間+常數1411093327735
- 密文p, 是timesign + encodeURIComponent(mobile)的密文,rsaModulus 和 rsaExponent ,加密參數,58一直不變
- 其他參數直接和request請求一致,或者酌情設置
3 獲取token
請求的URL
Request URL:https://passport.58.com/frontend/data?callback=jQuery18308426383909637498_1515994624659&_=1515994624692
Response
jQuery18305434571389149673_1515995590691({“code”:0,“data”:{“remainTime”:0,“token”:“7pjUnv6fhBONHh7A_4HrN_2rH4is-gC8”,“rsaModulus”:“xxx固定值xxx”,
“rsaExponent”:“010001”,“totalTime”:60,“mobile”:“手機號”},“msg”:""})
如上,其中callback參數中jQuery18308426383909637498_1515994624659和_=1515994624692,一個表示回調的函數+時間戳,一個應該是發送請求時候的時間戳,這裏可以參考jquery資料
那麼這個請求是頁面剛加載就發送的請求,從response可以看出主要是獲取token參數
4 獲取tokencode
Request URL
參數
Response
jQuery18305434571389149673_1515995590693({“code”:0,“data”:{“exist”:0,“tokencode”:“GhxN2kozUcU8wsbkzGXbMmst8G4_0sSg”},“msg”:“動態碼已發送”})
5 發送login請求
Request URL
參數
Response
jQuery18305434571389149673_1515995590693({“code”:0,“data”:{“fingerprint”:“84E63543A0E4DF048727E0037314879E66AE767A7311EA8C”},“msg”:“成功”})
以上便是整個登錄的流程
三 總結
由於是第一次做Java項目,很多都不懂而且前期公司網不好半天才能刷出個界面,然後導致這個功能做了很久.
最初我試着用selenium框架去模擬登錄,但是!!!公司網絡不行並且我覺得這樣效率太慢了就沒有進行下去,後面轉入Java模擬登錄
前期很多時間都放在了去讀Js代碼,手動模擬添加部分cookie,以及模擬java加密過程,其實這三個後面發現都是在做無用功
然後自己登錄成功後發現其他人賬號不能登錄,又轉到手機動態碼登錄。。。
做這個功能最大的體會就是,做項目先不要深入的去了解某一個環節(這裏我花了幾天都在讀js代碼,Java模擬js加密),應該顯示着做出一個最簡單的demo,遇到問題再去學習解決
最後這個模擬登錄還是很在很多問題,希望有了解的人可以告訴應該怎麼做才最好