快捷搜索: 长连接 前端 源码 pan

酷狗音乐网站前端JS的逆向过程

事件背景

前不久我写了一个按歌手爬取酷狗音乐所有歌曲的爬虫,然后在昨天2019年5月10日使用的时候出现了错误,排查问题后发现是获取歌曲相关信息的那个接口做了修改,导致我原有的爬虫失效。在测试后发现,在原有的基础上需要携带Cookie里面的kg_mid参数才能正常获取,然后我去浏览器里面查看页面刷新出来的请求,发现kg_mid参数是浏览器生成的而不是服务器返回的,所以就开始了逆向前端JS的过程。

逆向过程

    首先我查看了所有的请求,然后筛选后只保留了获取JS文件的请求,确定具体是哪个文件最死板的方法是一个个打开然后去查有没有kg_mid这个参数的相关生成方法,但是这里我们根据JS文件的名字推测出应该是我标记的这个kguser_min.js文件,因为Cookie就是相当于用户的身份,所以根据user能推测出是这个文件,事实上也确实是在这个JS文件里面,所以有时候合理的推测是可以大大减小我们的工作量的。 将这个JS文件下载下来用编辑工具打开,这里我用的是Notepad打开的 但是打开后发现格式并没有对其,代码挨在一起阅读比较困难,所以我们把里面的JS代码剪切出来,找一个JS格式化的工具把它格式化后在粘贴回去。 在线工具网站: 接下来是重点了,文件内按CTRL+F查找kg_mid,定位到的位置代码作用是设置KgMid的name属性的值为kg_mid,所以下一步我们要查的是KgMid 查到的第一个位置,代码作用大概是读取Cookie里面的kg_mid对应的值,但是读取不是写入,跟我们的目的不符,虽然看这些代码能让我们了解酷狗的运作过程 因为这个匹配的位置有点多,所以我就不一一叙述了,直接找到我们发现将kg_mid写入Cookie的代码 定位到位置,判断依据是KgUser.Cookie.write方法,这个Cookie.write方法是用来写入Cookie的。这里的相关代码作用大概是读取Cookie里面的kg_mid对应的值,判断是否有值,如果没有,则将kg_mid写入Cookie 而我们的注意力就要放到下面这两句代码上面,我们来分析它们 var n = KgUser.Guid(); KgUser.Cookie.write(KgUser.KgMid.name, KgUser.Md5(n), KgUser.KgMid.days * 86400, "/",KgUser.GetDomain()); Guid()方法很明显是按照一定规则返回一个生成的参数,并传给下面的Md5()方法 然后再看Cookie.write这个方法,这里面重要的两个参数是name、value,对应的就是KgUser.KgMid.name和KgUser.Md5(n) 所以我们实际只需要模拟函数Guid()和Md5(),首先找到Guid()的位置 利用工具调试这段代码后发现,S4()作用是生成一个四个随机字符拼接成的字符串,这个字符要求属于a-z 0-9的范围 然后Python模拟这个方法可以用下述代码代替 import random #随机生成4位随机的字符列表 范围为a-z 0-9 n=random.sample(abcdefghijklmnopqrstuvwxyz0123456789,4) #将列表元素拼接为字符串 n=.join(n) 然后找到Md5()的位置 这个部分代码比较多,所以我本来第一想法是交给JS引擎处理,相当于Python调用JS,然后将返回结果传给爬虫,但是最后发现这一部分代码其实就是MD5加密算法的JS实现,而刚开始我以为是酷狗特有的(在MD5通用加密算法的基础上修改具体参数) 这部分如果用JS引擎处理的话需要用到一个Python的第三方库execjs,相关使用可参看: 但是这里我着重讲的是用另一种方法调用Python的hashlib这个第三方库,用它来实现Md5加密 hashlib库的安装,打开CMD控制台,输入:pip install hashlib来安装 然后完整的生成kg_mid参数的PYTHON代码如下:

逆向n酷狗js加密方法 MD5 加密参数 Cookie里面的kg_mid “”" import hashlib import random

#创建md5对象
md5= hashlib.md5()
#随机生成4位随机的字符列表 范围为a-z 0-9
n=random.sample(abcdefghijklmnopqrstuvwxyz0123456789,4)
#将列表元素拼接为字符串
n=.join(n)
#将字符串编码后更新到md5对象里面
md5.update(n.encode())
#调用hexdigest获取加密后的返回值
result=md5.hexdigest()
print(result)
```
    运行结果

总结

JS的破解其实就是去JS里面找到反爬虫设置的手段,只要读懂了JS的意思,并且能灵活运用Python实现,就能达到以假乱真的地步。 其实对于有基础的同学来说,JS很好读懂,对于没见过的函数和方法,不用迷茫,网上查找相关资料就好了,毕竟这些都是API,不需要背下来。

相关文章

经验分享 程序员 微信小程序 职场和发展