Java 模擬58登錄

Java 模擬 58登錄 (一) 分析

標籤(空格分隔): Java


實習期間需要做一個模擬58登錄然後爬取簡歷,第一次做項目遇到很多坑
同時網上關於58登錄的又沒有很多資料,遇到了很多坑,這裏記錄一下,方便自己以及他人學習

源代碼放在Github
有關實現的分析,可以參考我的另一篇博客 Java 模擬58登錄(二) 實現

前言

這裏是通過手機動態碼的方式來登錄58, 而非帳號密碼, 適用於第三方網站登錄使用
原因是模擬密碼登錄的時候, 當我用其他人賬號在我這裏登錄58的時候就會出現賬號登錄限制
需要手機動態碼驗證之後纔可以登錄,所以決定直接手機動態碼的登錄。

如果你知道這裏的機制或者知道如何避免,請告知我[email protected]

分析

一 記錄Http Request請求

首先是登錄58, 查看登錄期間的Http Request請求
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

https://passport.58.com/mobile/getcode?

參數
參數
Response

jQuery18305434571389149673_1515995590693({“code”:0,“data”:{“exist”:0,“tokencode”:“GhxN2kozUcU8wsbkzGXbMmst8G4_0sSg”},“msg”:“動態碼已發送”})

5 發送login請求

Request URL

https://passport.58.com/mobile/pc/login?

參數
login參數

Response

jQuery18305434571389149673_1515995590693({“code”:0,“data”:{“fingerprint”:“84E63543A0E4DF048727E0037314879E66AE767A7311EA8C”},“msg”:“成功”})

以上便是整個登錄的流程

三 總結

由於是第一次做Java項目,很多都不懂而且前期公司網不好半天才能刷出個界面,然後導致這個功能做了很久.
最初我試着用selenium框架去模擬登錄,但是!!!公司網絡不行並且我覺得這樣效率太慢了就沒有進行下去,後面轉入Java模擬登錄
前期很多時間都放在了去讀Js代碼,手動模擬添加部分cookie,以及模擬java加密過程,其實這三個後面發現都是在做無用功
然後自己登錄成功後發現其他人賬號不能登錄,又轉到手機動態碼登錄。。。

做這個功能最大的體會就是,做項目先不要深入的去了解某一個環節(這裏我花了幾天都在讀js代碼,Java模擬js加密),應該顯示着做出一個最簡單的demo,遇到問題再去學習解決

最後這個模擬登錄還是很在很多問題,希望有了解的人可以告訴應該怎麼做才最好

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章