js逆向爬虫某openLaw网站
生活随笔
收集整理的這篇文章主要介紹了
js逆向爬虫某openLaw网站
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.解析思路:
??????按照常規步驟進行抓包:輸入錯誤的賬號密碼,找到post/get請求地址—>看請求表單數據是否加密—>全局搜索加密關鍵字—>找到與之相關聯的js加密函數,扣出js代碼
這里我們可以看到,有四個參數,其中_csrf是未知的,password是經過加密的,其余兩個字段是很簡單的。
2. _csrf關鍵字
我們先全局搜索一下,可以找到_csrf其實就在網頁中,是在網頁中生成的,所以我們就需要抓取“login.jsp?$=deny”這個數據包,這里是get請求
import re,requests# 先請求一次網頁,獲取頁面中的csrf def get_csrf():try:csrfUrl = "http://openlaw.cn/login.jsp?$=deny"session = requests.session()response = session.get(csrfUrl, headers=headers, timeout=5)if (response.status_code == 200):# 編譯正則表達式,帶上re.Spattern = re.compile('name="_csrf" value="(.*?)"/>', re.S)# findall是將返回結果以元組型列表result = re.findall(pattern, response.text)return resultexcept Exception as e:print(e)拓展:我第一次寫的時候就出現了如下的錯誤提示,其實是re.S在使用compile編譯時沒有編譯到,以后要注意這點
在爬取網頁數據時,
p=re.compile('<div class="card-title">(.*?)</div>') data=re.findall(p,html.text,re.S)出現錯誤:
ValueError: Cannot process flags argument with a compiled pattern
原因:如果re.findall() 中有flags項,如re.S(正則中‘.’代表在每行中的任意字符,每一行遇到換行符‘\n’結束,re.S作用是將‘\n’當成是普通字符,這樣就把整個html文檔看成了一個字符串。
正確寫法:
3.password加密
依舊全局搜索這個關鍵字,找到password這個關鍵字,發現這個generateEncryptPassword(生成加密密碼)很可疑,最終輸出加密密碼的函數其實是keyEncrypt函數(完整js加密代碼,參考我的GitHub)
var $publicKey = '-----BEGIN PUBLIC KEY-----\n\ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0zI8aibR9ZN57QObFxvI\n\ wiRTmELItVVBLMrLd71ZqakR6oWUKkcAGgmxad2TCy3UeRe4A0Dduw97oXlbl5rK\n\ RGISzpLO8iMSYtsim5aXZX9SB5x3S9ees4CZ6MYD/4XQOTrU0r1TMT6wXlhVvwNb\n\ fMNYHm3vkY0rhfxBCVPFJoHjAGDFWNCAhf4KfalfvWsGL32p8N/exG2S4yXVHuV6\n\ cHDyFJAItKVmyuTmB62pnPs5KvNv6oPmtmhMxxsvBOyh7uLwB5TonxtZpWZ3A1wf\n\ 43ByuU7F3qGnFqL0GeG/JuK+ZR40LARyevHy9OZ5pMa0Nwqb8PwfK810Bc8PxD8N\n\ EwIDAQAB\n\ -----END PUBLIC KEY-----\n\ '; var encryptPassChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz*&-%/!?*+=()"; var rsaEncrypt = new JSEncrypt(); rsaEncrypt.setPublicKey($publicKey); var keyEncrypt = function(data) {var passPhrase = generateEncryptPassword(32);var iv = CryptoJS.lib.WordArray.random(128 / 8).toString(CryptoJS.enc.Hex);var salt = CryptoJS.lib.WordArray.random(128 / 8).toString(CryptoJS.enc.Hex);var key = CryptoJS.PBKDF2(passPhrase, CryptoJS.enc.Hex.parse(salt), {keySize: 128 / 32,iterations: 1000});var aesEncrypted = CryptoJS.AES.encrypt(data, key, {iv: CryptoJS.enc.Hex.parse(iv)});var aesKey = passPhrase + ":::" + salt + ":::" + aesEncrypted.iv;var encryptedMessage = aesEncrypted.ciphertext.toString(CryptoJS.enc.Base64);var encryptedKey = rsaEncrypt.encrypt(aesKey);var encrypted = encryptedKey + ":::" + encryptedMessage;return encrypted; };var generateEncryptPassword = function(length) {var randomstring = '';for (var i = 0; i < length; i++) {var rnum = Math.floor(Math.random() * encryptPassChars.length);randomstring += encryptPassChars.substring(rnum, rnum + 1);}return randomstring; };4.完整代碼
import re import requests import execjs# 請求登錄url url = "http://openlaw.cn/login" # 構造請求頭 headers = {"Origin": "http://openlaw.cn","Referer": "http://openlaw.cn/login.jsp","Upgrade-Insecure-Requests": "1","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36" }# 先請求一次網頁,獲取頁面中的csrf def get_csrf():try:csrfUrl = "http://openlaw.cn/login.jsp?$=deny"session = requests.session()response = session.get(csrfUrl, headers=headers, timeout=5)if (response.status_code == 200):pattern = re.compile('name="_csrf" value="(.*?)"/>', re.S)result = re.findall(pattern, response.text)return resultexcept Exception as e:print(e)def get_pwd():with open('main.js', 'r', encoding='utf-8') as f:js_code = f.read()# 編譯js函數ctx = execjs.compile(js_code)# 執行js中的getPassword函數,參數為passwordresult = ctx.call('getPassword', 'a123456')return result# 第二次post請求模擬登錄openLaw網站 def login():data = {"_csrf": (get_csrf())[0],"username": "badwoman","password": get_pwd(),"_spring_security_remember_me": "true"}try:# 模擬登錄openLawresponse = requests.post(url=url, headers=headers, data=data, timeout=5)if (response.status_code == 200):return response.textreturn Noneexcept Exception as e:print(e)if __name__ == '__main__':login()總結
以上是生活随笔為你收集整理的js逆向爬虫某openLaw网站的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android Webview post
- 下一篇: sqlplus连接mysql_sqlpl