没想到有一天连自己公司的数据都要用爬的。

我们公司数据的Ajax请求都长这样:

倒也不是不可以用Selenium去爬,实际上我本来也都是用BrowserMob Proxy和Selenium来爬的,今天心血来潮想试一下JS逆向可不可以,还真被我找到办法了。

看下F12开发工具的Network中,有疑似用来加密的js,记下路径

用Save All Resources把相关的js都下载下来

发现在cryptoRequest中竟然有注释……

然后这一段应该是加密解密

	function aesEncrypt(value, key) {
		key = Utf8.parse(fillKey(key))


		value = Utf8.parse(value);
		//CipherOption,加密的一些选项:
		//mode:加密模式,可取值(CBC,CFB,CTR,CTRGladman,OFB,ECB),都在CryptoJS.mode对象下
		//padding:填充方式,可取值(Pkcs7,Ansix923,Iso10126,ZeroPadding,NoPadding),都在CryptoJS.pad对象下
		//iv:偏移量,mode===ECB时,不需要iv
		//返回的是一个加密对象
		var encrypted = AES.encrypt(value, key, {
			mode: ECB,
			padding: Pkcs7,
			iv: '',
			keySize: 128,
		});
		return encrypted.ciphertext.toString(Hex);

	}

	function aesDecrypt(value, key) {
		key = Utf8.parse(fillKey(key))

		value = Hex.parse(value);
		//返回的是解密后的对象
		var decrypt = AES.decrypt(CryptoJS.lib.CipherParams.create(
			{
				ciphertext: value
			}), key, {
			mode: ECB,
			padding: Pkcs7,
			iv: '',
			keySize: 128,
		});

		var decryptedStr = decrypt.toString(Utf8);
		return decryptedStr.toString();
	}

这边一段意思应该是上面的key是怎么来的

CryptoRequest.cryptoEncodeParam = function(value, type, crypto_secret) {
    crypto_secret = crypto_secret || window.crypto_secret;
    if (crypto_secret) {
        if (!value) return value;

然后去F12里找crypto_secret,填进去试试

还真给我蒙对了呃。