爬取電信網遇到的坑

登入電信網遇到密碼被JS加密,關於加密算法可以先了解一下基礎:加密算法基礎

JavaScript基礎

遇到JS不用怕了用心分析就好不要慌

主要提供思路:

1.使用抓包工具先抓取密碼加密後的東東

2.分析JS加密算法自己進行優化處理

3.使用python執行JS引擎執行這段加密算法

坑1

密碼加密後的東東好找,但是2加密後的JS算法怎麼找呢,按F12,netword沒有啊,哈哈我你也遇到了,可以在查看源碼裏面有個top 看到沒有,嗯就是它隱藏還挺好。先到這裏找之後在Netword 裏面就也可以看到了,爲什麼呢?我理解爲是開始默認隱藏的,後面到TOP裏面發現了就不隱藏了。

可以看到password字段是加密以後的密碼,那麼是怎麼加密的呢?一般加密都是通過js加密那麼我們繼續往下找發現有一個js文件(jquery.fn-aes.min.js)

坑2,不要傻了想通過python同等加密這段JS行不通

點擊以後發現右邊的不就是加密方式嗎?哈哈哈,找到加密方式,我們離勝利就更近了一步,分析加密過程我們可以看到,加密的key是’login.189.cn’,其中的iv是偏移量,找到加密方式如何運行呢?不着急,我們看到CryptoJS這個庫了嗎?

分析發現這就是JS加密算法,我的思路是加載CryptoJS然後,用他來加密登錄密碼,好我們來找到CryptoJS這個的加密JS。

坑3使用什麼去執行這段JS呢

執行JS的類庫:execjs,PyV8,selenium,node

1、selenium 開發中實在沒有辦法才使用的,不選擇

2、execjs 可以啊之前使用過哈哈來吧,可是老是報錯了我的媽呀,原來發現優化的JS有一個庫報錯嗯CryptoJS就是它,嘗試了使用這個不行啊好吧執行它的JS還需要導入包,放棄這個方法

3、使用PyV8吧,折騰了大半天沒有安裝成功,要哭的感覺,程序員嘛不能哭,遇到困難冷靜總能解決的。還是放棄吧沒有安裝成功!!!!!!!

4、好吧就只有node 了,這個怎麼搞有沒有python node執行的模塊,你可以去嘗試一個pip 安裝。還是放棄吧,這個是沒有的node 得獨立安裝
先把它安裝好,我安裝的是node_v7.6.0,附上:安裝連接與學習網
保證執行這段代碼沒有問題在進行下面的操作:

node1.js 執行命令node node1.js

'use strict';

var CryptoJS = require("crypto-js");

function encryption(password) {
    var t = CryptoJS.MD5("login.189.cn"), 
	    i = CryptoJS.enc.Utf8.parse(t),
        r = CryptoJS.enc.Utf8.parse("1234567812345678"), 
		u = CryptoJS.AES.encrypt(password, i, {iv: r});
    return u + ""
};

var passwordA ='不讓你看';
var aesEncrypt =encryption(passwordA);

console.log('aesEncrypt text: ' + aesEncrypt);

坑4 pycharm 解釋器出現了問題

執行下面的代碼發現 print(execjs.get().name) 打印出來的不是 Node.js (V8)
檢查解釋器是否出現了問題

    def decode_password(self,password):
        os.environ["NODE_PATH"] = 'E:/python3.6.1/Tools/node_v7.6.0/node_modules/'
        print(execjs.get().name)

        parser = execjs.compile("""
            var CryptoJS = require("crypto-js");

            function encryption(password) {
            console.log('aesEncrypt text: ' + password)
            var t = CryptoJS.MD5("login.189.cn"),
        	    i = CryptoJS.enc.Utf8.parse(t),
                r = CryptoJS.enc.Utf8.parse("1234567812345678"),
        		u = CryptoJS.AES.encrypt(password, i, {iv: r});
            return u + ""
        }
        """)
        obj = parser.call("encryption", password)
        return obj

記得指定路徑:
os.environ[“NODE_PATH”] = ‘E:/python3.6.1/Tools/node_v7.6.0/node_modules/’

NODE_PATH就是你單獨安裝Node時候的路徑跟python沒有關係

坑5驗證碼

驗證碼藏得很深,關鍵理解好Cookies和Session的區別,官方解析

好了上面問題都解決好了就可以使用python登入電信網了

關於更多的知識大家可以相互交流

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