妹子图煎蛋网居然还要加密方式?看我大Python暴力破解!P

  • 用python模拟js加密方式,拿到加密处理后的数据,这种方法就是本篇主要讨论的内容,优点是依赖少速度快,缺点是如果煎蛋加密方式改了,需要跟着改。

分析网页

jandan_load_img() 函数内容为:

function jandan_load_img(b) {
 var d = $(b);
 var f = d.next("span.img-hash");
 var e = f.text();
 f.remove();
 var c = jdXFKzuIDxRVqKYQfswJ5elNfow1x0JrJH(e, "zE4N6eHuAQP8vkQPb0wcuEcWnLzHYVhy");
 var a = $('<a href="' + c.replace(/(\/\/\w+\.sinaimg\.cn\/)(\w+)(\/.+\.(gif|jpg|jpeg))/, "$1large$3") + '" target="_blank" class="view_img_link">[查看原图]</a>');
 d.before(a);
 d.before("<br>");
 d.removeAttr("onload");
 d.attr("src", location.protocol + c.replace(/(\/\/\w+\.sinaimg\.cn\/)(\w+)(\/.+\.gif)/, "$1thumb180$3"));
 ...
}

var jdXFKzuIDxRVqKYQfswJ5elNfow1x0JrJH = function(m, r, d) {
 var e = "DECODE";
 var r = r ? r : "";
 var d = d ? d : 0;
 var q = 4;
 r = md5(r);
 var o = md5(r.substr(0, 16));
 var n = md5(r.substr(16, 16));
 if (q) {
 if (e == "DECODE") {
 var l = m.substr(0, q)
 }
 } else {
 var l = ""
 }
 var c = o + md5(o + l);
 var k;
 if (e == "DECODE") {
 m = m.substr(q);
 k = base64_decode(m)
 }
 var h = new Array(256);
 for (var g = 0; g < 256; g++) {
 h[g] = g
 }
 var b = new Array();
 for (var g = 0; g < 256; g++) {
 b[g] = c.charCodeAt(g % c.length)
 }
 for (var f = g = 0; g < 256; g++) {
 f = (f + h[g] + b[g]) % 256;
 tmp = h[g];
 h[g] = h[f];
 h[f] = tmp
 }
 var t = "";
 k = k.split("");
 for (var p = f = g = 0; g < k.length; g++) {
 p = (p + 1) % 256;
 f = (f + h[p]) % 256;
 tmp = h[p];
 h[p] = h[f];
 h[f] = tmp;
 t += chr(ord(k[g]) ^ (h[(h[p] + h[f]) % 256]))
 }
 if (e == "DECODE") {
 if ((t.substr(0, 10) == 0 || t.substr(0, 10) - time() > 0) && t.substr(10, 16) == md5(t.substr(26) + n).substr(0, 16)) {
 t = t.substr(26)
 } else {
 t = ""
 }
 }
 return t
};

function md5(a) {
 return hex_md5(a)
}

这个方法就相当于python的hashlib库提供的md5摘要加密算法。感兴趣的朋友自行了解,由于后面多次调用此方法,我们对它进行一个封装:

def md5(str):
 md5 = hashlib.md5()
 md5.update(str.encode('utf-8'))
 return md5.hexdigest()

Base64是一种用64个字符来表示任意二进制数据的方法。幸运的是python内置的有base64库,可以直接进行base64的编解码。我们也对他进行一个封装,方便阅读。这里有一个要注意的是,因为base64是把3个字节变为4个字节,base64编码的长度必须是4的倍数,所以对于不是4的倍数的字符,需要加上=把base64字符串的长度变为4的倍数。

def decode_base64(data):

 return base64.b64decode(data + (4 - len(data) % 4) * '=')

var h = new Array(256); 翻译过来就是 h = list(range(256))

c.charCodeAt(g % c.length) 调用的是js的 stringObject.charCodeAt(index) 函数,返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。这个方法相当于python的 ord() 函数。这行翻译过来就是:

b[g] = ord(c[g % len(c)])

k = k.split(""); 是将字符串 k 分解成单独的字符列表,在python中字符串本身也是一个可迭代对象,忽略就好。

chr() 和 ord() 和python内置的 chr() 、 ord() 函数类似,我们直接调用对于函数,运行则回报错: ord() expected string of length 1, but int found 。因为python中的 ord() 函数参数是一个 str 类型的参数,而 k[g] 实际上是一个字节,我们就不用调用 ord() 函数就可以了。即:

t += chr(k[g] ^ (h[(h[p] + h[f]) % 256]))

最后

如果进行到这里,基本上对于煎蛋网的抓取已经可以自己实现了。懒得去写的朋友可以直接看我整理好的代码:

进群:125240963   即可获取源码!

阅读更多
文章标签: Python
个人分类: Python
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭