1. 程式人生 > 實用技巧 >js加密的資料python解密

js加密的資料python解密

寫在前面

現在前端頁面為了防止爬蟲惡意爬取資料,多多少少會對資料進行加密,有的是重新編碼再解碼,有的是用字型來表示純文字,還有用圖片的。如果直接爬取,由於沒有js動態載入,因此都是原始的加密後的資料,需要通過一定手段還原為可讀資料。正所謂只有魔法才能打敗魔法,也只有程式碼才能打敗程式碼。還是一句話,只要是前端js加密的內容,理論上都是可以通過js來反向還原資料的,只不過大多數js都經過混淆,可讀性差,需要不斷打斷點除錯,確定核心的解密函式。今天遇到一個BT網站,本來想直接爬取的,結果發現名稱都是被加密過的,檢視原始碼後,發現加密過程簡單,非常適合入門。

解密過程分析

網頁顯示的是一行行的標題內容,是通過ul li

標籤實現的,爬取不是難事,但是標題不是直接的文字,而是下面這樣的內容,顯然是js動態生成標題的。

<li>[03-07] 
    <a href="/movie.php?id=9523175675421954" target='_blank'>
        <script type="text/javascript">
            document.write(d('OTHlkYblk6Xns7vliJcwMTYt6YWS5bqX5YG35oOFNFPlupfnvo7lpbPplIDllK7pq5jmuIXml6DmsLTljbDlrozmlbTniYg='));
        </script>
    </a>
</li>

既然是前端解密,那麼就好辦了,找到d函式就可以了,這裡使用使用Chrome的F12功能,打斷點找到函式呼叫過程即可,找到的d函式是孤立的,沒有與其他函式巢狀,所以單獨分析d函式即可。

function d(input){
    rv = window.atob(input);
    rv = escape(rv);
    rv = decodeURIComponent(rv);
    return rv;
}

雖然d函式中有三個其它函式,但都是js自帶的函式,也就是說只要查閱這三個函式的功能即可。
window.atob是用於將編碼後的Base64字串轉為ASCII字串。效果如下:

var str = 'javascript';
window.btoa(str)                    // 編碼結果 "amF2YXNjcmlwdA=="
window.atob("amF2YXNjcmlwdA==")     // 解碼結果 "javascript"

escape函式可對字串進行編碼,這樣就可以在所有的計算機上讀取該字串。該方法不會對 ASCII 字母和數字進行編碼,也不會對下面這些 ASCII 標點符號進行編碼: * @ - _ + . / 。其他所有的字元都會被轉義序列替換。

escape("JavaScript_ _指令碼語言@!");
"JavaScript_%20_%u811A%u672C%u8BED%u8A00@%21"

decodeURIComponent函式可對encodeURIComponent函式編碼後的 URI 進行解碼。
我們嘗試將資料解碼後看一下,可以得到如下結果:

// 再也不用擔心被顯示敏感詞了。
d("OTHlkYblk6Xns7vliJcwMTYt6YWS5bqX5YG35oOFNFPlupfnvo7lpbPplIDllK7pq5jmuIXml6DmsLTljbDlrozmlbTniYg=")
"91呆哥系列016-酒店偷情4S店美女銷售高清無水印完整版"

在弄懂了d函式的實現過程後,還可以寫出其逆過程

function r(input){
    res = encodeURIComponent(input); 
    res = unescape(res);
    res = window.btoa(res);
    return res;
}

Python實現

import base64
base64.b64decode(input).decode()
from urllib.request import unquote
unquote(base64.b64decode(input).decode())    // 其實不要這步已經可以得到結果了。