爬取电信网遇到的坑

登入电信网遇到密码被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登入电信网了

关于更多的知识大家可以相互交流

猜你喜欢

转载自blog.csdn.net/weixin_43102784/article/details/84890760