當爬蟲遇到js加密


當爬蟲遇到js加密

  我們在做python爬蟲的時候經常會遇到許多的反爬措施,js加密就是其中一種。

  破解js加密的方法也有很多種:

    1.直接驅動瀏覽器抓取數據,無視js加密。

    2.找到本地加密的js代碼,使用python的相關庫直接運行js代碼。

    3.找到本地加密的js代碼,理清加密邏輯,然后用python代碼來模仿js代碼的流程,生成我們想要的加密的數據。

  這里我們簡單介紹一下第三種,也是最難的一種。

  • 目標網站:http://tool.liumingye.cn/music/?type=qq&name=%E4%BD%A0%E5%A5%BD(測試)
  • 在谷歌瀏覽器輸入該網址之后,打開F12開發者工具,訪問該鏈接,很容易在里面找到name為'a8ba90546fd6dc43e933a46c80d9e5df'的請求,這條請求內容就是我們想要的。

  • 觀察這條請求的url:http://lab.liumingye.cn/api/ajax/search/text/5L2g5aW9/page/1/type/qq/token/a8ba90546fd6dc43e933a46c80d9e5df,在這里面也很容易發現只有兩個變化的參數[`5L2g5aW9`,`a8ba90546fd6dc43e933a46c80d9e5df`](多輸入幾次不一樣的關鍵詞也可以發現規律)

  • 這兩個參數肯定都和輸入的關鍵字有關系,后面32位的字符串猜測是md5生成的(md5加密生成的字符串是32位),因為md5加密不可逆,所以網站后台也無法通過該字符串來獲取用戶輸入的關鍵字。所以我們猜測第一個變化的字符串就是由關鍵字直接加密變化來的,而且是可逆的。

  • 可逆的加密方式第一個想到的就是利用base64加密,自己試了下,果然這個字符串就是通過base64生成的。
  • 因為md5不可逆,所以必須找到它是如何生成的。復制這個字符串在前面請求中的返回值中查找,結果找不到。這時可以判定該字符串不是由服務器返回,而是本地通過js生成的,我們只用找到加密的js代碼就可以了。
  • 正常的訪問網站只會加載兩個js腳本,一個是空的,另一個名為:`localstorage.js?v=20190301`,查看這個請求的響應,里面有串`whir.res.loadJs("main", "https://lmy.nos-eastchina1.126.net/music/js/main.js?v=20190301", "20190301")`,復制這條代碼里面的鏈接,會自動下載這個js腳本(谷歌瀏覽器)

  • 下載完成后打開,剛才我們猜測該字符串是通過md5生成的,所以我們直接ctrl+f搜索'md5',搜索完成之后會出現兩個匹配的結果,第一個是一個函數的形式,第二個出現在字符串中,很顯然我們要的是第一個,包裹這條函數的完整行代碼是:'url':_0x940f42[_0x2699('0x43f', '(0%N')](_0x940f42[_0x2699('0x440', '94!y')](_0xd3b949 + _0x940f42['xrghN'], _0x36a191) + _0x2699('0x441', 'hn#I'), md5(_0x36a191 + _0x940f42['tFjdt']))

  • 很顯然這段代碼做了一定的處理,我們無法直接得知這里面是什么內容。我們先從md5括號里面的找起,復制'_0x36a191'到完整的js代碼里面查找,然后會找打一段比較長的代碼:

    `_0x36a191 = _0x940f42['BMdWK'](_0x940f42['BMdWK'](_0x940f42['jTMsB'](_0x940f42[_0x2699('0x4c0', '94!y')](_0x2699('0x4c1', 'S]7#') + window[_0x2699('0x4c2', '7l)O')](utf8[_0x2699('0x4c3', 'hn#I')](_0x581614))[_0x2699('0x4c4', 'Kj]n')](/\//g, '*'), _0x2699('0x4c5', '%L%W')), _0x44fdca), '/type/'), _0x5ebc3e);`,這個看上去還要繼續分析,我們暫時不管它。

  • 第二個要找的就是'_0x940f42['tFjdt']',先復制'tFjdt'到js代碼里面查找,然后會發現_0x940f42['tFjdt'] = _0x2699('0x437', 'gKGX')。
  • 接着在繼續找下去會有點麻煩,我們直接打開剛才訪問的鏈接,打開Console,復制_0x2699('0x437', 'gKGX')到控制台回車,結果給我們返回了一個"tool.liumingye.cn"的字符串。最后我們得知_0x940f42['tFjdt'] == "tool.liumingye.cn",然后再按這種方式查找別的,以此類推。

  • 最后我們會發現之前的

    'url':_0x940f42[_0x2699('0x43f', '(0%N')](_0x940f42[_0x2699('0x440', '94!y')](_0xd3b949 + _0x940f42['xrghN'], _0x36a191) + _0x2699('0x441', 'hn#I'), md5(_0x36a191 + _0x940f42['tFjdt']))

    變成了

    'url': http://lab.liumingye.cn/api/ + ajax/search/ + _0x36a191 + /token/, md5(0x36a191 + tool.liumingye.cn)

    而我們分析的鏈接為

    `http://lab.liumingye.cn/api/ ajax/search/ text/5L2g5aW9/page/1/type/qq /token/ a8ba90546fd6dc43e933a46c80d9e5df

    兩鏈接一減,很容易的出_0x36a191 = text/5L2g5aW9/page/1/type/qq, md5(0x36a191 + tool.liumingye.cn) = a8ba90546fd6dc43e933a46c80d9e5df

  • 最后我們把_0x36a191 和 'tool.liumingye.cn' 相加,然后把得到的新的字符串通過md5加密,得到的新的字符串就是最后結尾的字符串了!

最終代碼很簡單,只要是分析它的加密方式

 1 def get_token(base64str):
 2     """
 3     獲取token
 4     :param base64str:
 5     :return: md5的字符串類型
 6     """
 7     md5 = hashlib.md5()
 8     salt = 'tool.liumingye.cn'
 9     code = 'text/%s/page/1/type/qq%s' % (base64str, salt)
10     md5.update(code.encode())
11     return md5.hexdigest()
12 
13 
14 def get_base64(key_word):
15     """
16     將輸入的關鍵字轉化為base64
17     :param key_word:
18     :return: base64str
19     """
20     key_word = key_word.encode()
21     base64str = base64.b64encode(key_word)
22     base64str = base64str.decode()
23     return base64str
24 
25 
26 def get_content(base64str, token):
27     url = 'http://lab.liumingye.cn/api/ajax/search/text/%s/page/1/type/qq/token/%s' % (base64str, token)
28     headers = {'User-Agent': 'Mozilla/5.0'}
29     response = requests.get(url, headers=headers).json()
30     return response['data']['list'] if response['code'] == 200 else None
31 
32 
33 
34 def main(key_word):
35     base64str = get_base64(key_word)
36     token = get_token(base64str)
37     result = get_content(base64str, token)
38     print(result)
39 
40 
41 if __name__ == '__main__':
42     keyword = input("請輸入想要下載的曲名>>>")
43     main(keyword)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM