1.需求,每天需要從不同的網站下不同的東西,需要你去寫一個爬蟲來搞。
2.執行。打開網站,輸入用戶名密碼,登錄,執行一系列操作
3.模擬登錄,Java模擬登錄我直接用httpclient,後面在用連接池
4.找到對方網站的publicKey
找對方的publicKey比較麻煩,
第一步,F12打開查看結構切到源代碼,如下:
小弟前端不太熟悉,但是大概能猜出來,jquery一般都是什麼什麼組件。secuity下面有一個jsencrypt.min.js這個應該是rsa組件app.****.js應該就是編譯後源代碼
切換到網絡
沒有發現公鑰或者私鑰什麼的點擊Fetch/XHR只有一個請求,並沒有找到需要的東西
那就只能看編譯後的源代碼:打開以後是這樣子的有點懵逼,看到是webpack打包了。沒找,硬着頭皮找
先了解webpack的打包以後的結構:參考網站:賊詳細
https://app.yinxiang.com/fx/970ae39c-9964-4aae-aa96-7e81fee4ef8f
從上面的網站了解到webpack的結構,那麼就可以執行了,找到源代app.***.js,然後百度js格式化,我用的是:
https://tool.oschina.net/codeformat/js/
格式化以後,複製到文件中查看結構
找到如下代碼以後,看頁面的標籤,並沒有看到什麼有用的標籤或者什麼東西,後來想到,有使用jsencrypt,來做加密,那麼源碼肯定有引用
找JSEncrypt,確定登錄方法,開始找公鑰或者私鑰,看到下面代碼
n.setPublicKey(o.constant.privateKey)
在做這個代碼上面往上翻,看o是什麼,是那個函數
那就開始找
找這個方法,找到一個敏感詞彙:沒想到居然有 privateKey的詞彙。
找到這個公鑰,開始加密,既然這個網站用的 JSEncrypt 那我也直接用,省事
然後在加密的時候發現有一行代碼:
(0, s.sha256)(e.username + e.password)???還用了sha256?我淦
t.showLoading(), t.axios({ method: "post", url: p.loginUrl, headers: { username: n.encrypt(e.username), tenantId: e.tenantId, appId: e.tenantId, password: n.encrypt(e.password), mac: n.encrypt((0, s.sha256)(e.username + e.password)) } })...
繼續做:s.sha256,然後看看s是什麼,往上翻代碼發現:
s = n("OQ+U"),
嗯哼,用的js-sha256,那麼就直接用,完事測試
java代碼:
@PostMapping("/encrypt") public String getEncrypt( Encrypt encrypt){ boolean flag = false; //創建HttpPost請求 HttpPost httpPost = new HttpPost("http://****/****/***/***"); httpPost.setHeader("Accept", HttpCommons.Accept); httpPost.setHeader("User-Agent",HttpCommons.userAgent); try { httpPost.setHeader("****","****"); httpPost.setHeader("****","****"); httpPost.setHeader("****","****"); httpPost.setHeader("username",encrypt.getUsername()); httpPost.setHeader("password",encrypt.getPassword()); CloseableHttpResponse response = null; //使用HttpClient發起請求 response = (CloseableHttpResponse) httpClient.execute(httpPost); //判斷響應狀態碼是否爲200 if (response.getStatusLine().getStatusCode() == 200) { //如果爲200表示請求成功,獲取返回數據 String content = EntityUtils.toString(response.getEntity(), "UTF-8"); HashMap hashMap = JSON.parseObject(content, HashMap.class); if(hashMap.get("msg").equals("登錄成功") && Integer.valueOf(hashMap.get("code").toString()) == 0){ System.out.println(content); }else{ System.out.println(content); } } } catch (Exception e) { e.printStackTrace(); } return "ok"; }
測試結果