15985850355 / 15985850355/img

Jsrpc学习——网易云热评加密函数逆向

Abierto
#1 0 comentarios 0 reacciones 0 asignados Ver en GitHub
documentation
Lenguaje dominante
Sin datos de lenguaje
Estrellas
4
Forks
4
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

点击上方 “**Python 共享之家**”,进行关注

回复 “**资源**” 即可获赠 Python 学习资料

烟笼寒水月笼沙,夜泊秦淮近酒家。

大家好,我是皮皮。

前几天给大家分享 jsrpc 的介绍篇,[Python 网络爬虫之 js 逆向之远程调用 (rpc) 免去抠代码补环境简介](http://mp.weixin.qq.com/s?__biz=MzU5MjY2ODEwMQ==&mid=2247489430&idx=1&sn=708286eaa0174d39b22eb7f94d0eba50&chksm=fe1d633cc96aea2aa1e97476a90038b006883b89898d69c47c6e9ac42c386746c90c07aa6eb4&scene=21#wechat_redirect),感兴趣的小伙伴可以戳此文前往。今天给大家来个 jsrpc 实战教程,[Jsrpc 学习——Cookie 变化的网站破解教程](http://mp.weixin.qq.com/s?__biz=MzU5MjY2ODEwMQ==&mid=2247489706&idx=1&sn=2bd4d54ae99d66cbd958a503bda9e17d&chksm=fe1d6c00c96ae5167f22cdb782a78d5cbad69ffe50ade8c85e78849885a9a82d3446e7d7e8bc&scene=21#wechat_redirect),让大家继续加深对 jsrpc 的理解和认识。下面是具体操作过程,不懂的小伙伴可以私我。

1、因为网易云音乐热评的加密并不在 cookie 上,而是参数加密,所以这里就不需要进行 hook 住 cookie 了。

2、之前就知道网易云音乐热评的加密存在之地是在下图的位置,是那个函数`window.asrsea(JSON.stringify(i1x), bsR1x(["流泪", "强"]), bsR1x(Xp8h.md), bsR1x(["爱心", "女孩", "惊恐", "大笑"]))`

![](https://mmbiz.qpic.cn/mmbiz_png/PwoXOzvn9Y7GOuAhGUib1Y4ko2zh0ITR1FZ7rvmSFuEHWyG0Mcr4brHqURfQsttuUe76pPBBBjvicfjY5E9SemYg/640?wx_fmt=png)

3、找到了 aes 加密地方的函数,就赋值一个自己名字的全局变量,然后转发加密就行了。之后可以在控制台输入指令`window.dcpeng = window.asrsea`,其中`window.asrsea`为加密函数。**注意**:这个地方挺重要的,很多时候我们会写成 ct.update(),这样会有问题!加了括号就是赋值结果,没加就是赋值整个函数!千差万别。

![](https://mmbiz.qpic.cn/mmbiz_png/PwoXOzvn9Y7GOuAhGUib1Y4ko2zh0ITR1smAN1tRrpTibEOXmHffWjPjv6mE4Wicptbb7AXEnaHGibNWicgTauXibicgg/640?wx_fmt=png)

4、关闭网页 debug 模式。**注意**:这个地方挺重要的,很多时候如果不关闭,ws 无法注入!

5、此时在本地双击编译好的文件`win64-localhost.exe`,启动服务。

![](https://mmbiz.qpic.cn/mmbiz_png/PwoXOzvn9Y7GOuAhGUib1Y4ko2zh0ITR1Sa4jHvIjusMJRf1FP2e8aKbSQDY4YuXicYN8ojl5anPXLNTpFSaxL9g/640?wx_fmt=png)

6、之后在控制台注入 ws,即将`JsEnv.js`文件中的内容全部复制粘贴到控制台即可 (注意有时要放开断点)。

![](https://mmbiz.qpic.cn/mmbiz_png/PwoXOzvn9Y7GOuAhGUib1Y4ko2zh0ITR1ak0iakFoYNII0yrmN4C8B78EXJkMhTpflVh9VUqbciaiaJOyWvoolf8FA/640?wx_fmt=png)

7、连接通信,在控制台输入命令`var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=para&name=wangyiyun");`

8、随后继续输入命令:

`// 注册一个方法 第一个参数 get_v 为方法名,
// 第二个参数为函数,resolve 里面的值是想要的值 (发送到服务器的)
// param 是可传参参数,可以忽略
demo.regAction("get_para", function (resolve, param) {
 console.log(param);
 console.log(JSON.stringify(param));
    var res = dcpeng(param, '010001', '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7', '0CoJUm6Qyw8W8jud');
    resolve(JSON.stringify(res));
})
`

这里就用到了参数 param,param 也就是需要传值过来的 json 对象,因为你不可能获取固定的歌曲 id 和页码,所以用 python 写成字典,通过 url 编码写在 param 里。

![](https://mmbiz.qpic.cn/mmbiz_png/PwoXOzvn9Y7GOuAhGUib1Y4ko2zh0ITR12ebj5f5ambqanulEe58XtyF9kk5JmZZKjrPfYXKWicy175zHLaiccSPA/640?wx_fmt=png)

9、这里为何不写成 dcpeng(JSON.stringify(param)...) 这样呢?因为 get 传过来的就是字符串,不用 json 转字符串了。

![](https://mmbiz.qpic.cn/mmbiz_png/PwoXOzvn9Y7GOuAhGUib1Y4ko2zh0ITR1b9TCicibNCFqibIKmj1xoBu6z4NQLibDP13o77GaZku3FThZv5flovZ1zA/640?wx_fmt=png)

上图 20 行的位置那是 json 转字符串,因为只能返回字符串,返回对象的话会变成显示 "\[object]"

这两步只是控制台打印,不用管。

![](https://mmbiz.qpic.cn/mmbiz_png/PwoXOzvn9Y7GOuAhGUib1Y4ko2zh0ITR1aSJib2vxdficCmH2tibjFHRvGeoPOrNibVbVmgaMcwQiaxpibXBdVVFNxUFQ/640?wx_fmt=png)

10、之后就可以在浏览器中访问数据了,打开网址 `http://127.0.0.1:12080/go?group={}&name={}&action={}¶m={}` ,这是调用的接口 group 和 name 填写上面注入时候的,action 是注册的方法名,param 是可选的参数,这里续用上面的例子,网页就是:`http://127.0.0.1:12080/go?group=para&name=wangyiyun&action=get_para¶m=rid=R_SO_4_1909604321&threadId=R_SO_4_1909604321&pageNo=1&pageSize=20&cursor=-1&offset=0&orderType=1`

![](https://mmbiz.qpic.cn/mmbiz_png/PwoXOzvn9Y7GOuAhGUib1Y4ko2zh0ITR1N3H5CHo3KaS304TAQib4PwrTicOM4KKVNcop7KMyTFiaCk9b4j59w5Q8w/640?wx_fmt=png)

11、如上图所示,我们看到了那个变化的参数 v 的值,直接通过 requests 库可以发起 get 请求。

12、现在我们就可以模拟数据,进行请求发送了,整体代码如下所示。

\`import requests
import json
import urllib.parse

songid = '1908392914'
data = {
    "rid": f"R_SO_4_{songid}",
    "threadId": f"R_SO_4_{songid}",
    "pageNo": "1",
    "pageSize": "20",
    "cursor": "-1",
    "offset": "0",
    "orderType": "1",
    "csrf_token": ""
}
song_info = str(data)
param = (urllib.parse.quote(song_info))
param_url = f"[http://127.0.0.1:12080/go?group=para&name=wangyiyun&action=get_para¶m={param}](http://127.0.0.1:12080/go?group=para&name=wangyiyun&action=get_para¶m={param})"
response = requests.get(url=param_url).text
response_json = json.loads(response)
get_para = json.loads(response_json["get_para"])
encText = get_para["encText"]
encSecKey = get_para["encSecKey"]
# print(encText)
# print(encSecKey)

data = {
    'params': encText,
    'encSecKey': encSecKey
}

response = requests.post('[https://music.163.com/weapi/comment/resource/comments/get?csrf_token='](https://music.163.com/weapi/comment/resource/comments/get?csrf_token='), data=data)
print(response.text)

\`

运行之后,可以得到网页上的评论数据:

![](https://mmbiz.qpic.cn/mmbiz_png/PwoXOzvn9Y7GOuAhGUib1Y4ko2zh0ITR1VZ98hTszSZuhdvjxvWLCfwO0Kfic6ryGfq4PicCY7kQUhsrbheIIzuOQ/640?wx_fmt=png)

放到 json 中去解析,和网页上呈现的数据一模一样。

![](https://mmbiz.qpic.cn/mmbiz_png/PwoXOzvn9Y7GOuAhGUib1Y4ko2zh0ITR1eUsoIY4wlCssd6cnawhbWdLWeAYJUUWuOrFo1siagj1sfDTSWbYyWUQ/640?wx_fmt=png)

下面是原网页上的原始数据:

![](https://mmbiz.qpic.cn/mmbiz_png/PwoXOzvn9Y7GOuAhGUib1Y4ko2zh0ITR16wibWomujRP0QSqV8E7Z4VibsjeD1dhJXo7OTETLibccqbVZ10qWlT3JA/640?wx_fmt=png)

13、至此,请求就已经完美的完成了,如果想获取全部网页,构造一个 range 循环翻页即可实现,改变请求参数中的 pageNo 即可。

14、如果想抓取不同的歌曲,只需要替换 songid 这个参数即可。

### 总结

大家好,我是皮皮。这篇文章主要给大家介绍了 jsrpc 的实战教程,使用 jsrpc 工具可以在网络爬虫过程中事半功倍,无需仔细的去扣环境,去一步步逆向,只一个黑盒的模式,我们就拿到了想要的结果,屡试不爽。

初次接触 jsrpc 的小伙伴可能看不懂,这里还有黑哥录制的一个视频,大家可以对照着视频进行学习,地址:`https://www.bilibili.com/video/BV1EQ4y1z7GS`,黑哥全程无声演示,视频的 BGM 很大,建议大家可以静音播放,领会其中奥义。

关于 jsrpc 工具,可以点击原文前往获取。

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进 Python 学习交流群共同探讨学习。

![](https://mmbiz.qpic.cn/mmbiz_png/PwoXOzvn9Y4HHpEYUuX6JPxnGySltZ0f2DMn3YuFaT1HwAYoicEoJ0c3DCmDypoCak84StmUt0Lmj4AQPqraFyg/640?wx_fmt=png)

****\*\*****---**--****\*\*******---\***\*---**\*\*\*\*****---**--****\*\*******---****************\*\*\*\***************** End ****\*\*****---**--****\*\*******---**--**---****\*\*****---**--****\*\*******-****************\*\*\*\*****************

往期精彩文章推荐:

- [Python 网络爬虫之 js 逆向之远程调用 (rpc) 免去抠代码补环境简介](http://mp.weixin.qq.com/s?__biz=MzU5MjY2ODEwMQ==&mid=2247489430&idx=1&sn=708286eaa0174d39b22eb7f94d0eba50&chksm=fe1d633cc96aea2aa1e97476a90038b006883b89898d69c47c6e9ac42c386746c90c07aa6eb4&scene=21#wechat_redirect)
- [一文带你了解 Python Socket 编程](http://mp.weixin.qq.com/s?__biz=MzU5MjY2ODEwMQ==&mid=2247489440&idx=1&sn=0b72a71d0243833d7b4ea95806cc9802&chksm=fe1d630ac96aea1c44a9025dfdd27111c516a50301f9b1ce6782f1485e3ef3892fdef9170f26&scene=21#wechat_redirect)
- [盘点一道 Python 列表合并的基础题目 (列表推导式)](http://mp.weixin.qq.com/s?__biz=MzU5MjY2ODEwMQ==&mid=2247489410&idx=1&sn=89c912f81a7e32a880d93f3d7c7b7286&chksm=fe1d6328c96aea3eba488e60169dbd3ba94841131550a4adbe3d1e881be591834b63f7c22660&scene=21#wechat_redirect)
- [手把手教你使用 Pandas 实现 DataFrame 分组条件查找值](http://mp.weixin.qq.com/s?__biz=MzU5MjY2ODEwMQ==&mid=2247489397&idx=1&sn=2dc274f7553e108abfa47b7dda535048&chksm=fe1d63dfc96aeac99e6ed46f8b882fe88b8400730c79fbd8aafc43a171b56af73012a27fc1c8&scene=21#wechat_redirect)

![](https://mmbiz.qpic.cn/mmbiz_png/peDq5Y9hmZaHvs19XSuQEGbkast75g4uziam64mHRseaJibQEIZGUgwWthoqHAiakAXcicszKuT0OgAbXM2k2hiaSyA/640?wx_fmt=png)

欢迎大家**点赞,\*\***留言,\***\* 转发,**转载,\*\*\*\* 感谢大家的相伴与支持

想加入 Python 学习群请在后台回复【**入 \*\***群 \*\*】

万水千山总是情,点个【**在看**】行不行
[https://mp.weixin.qq.com/s/3wmHF4W97SE7nC_ZJNvwOQ](https://mp.weixin.qq.com/s/3wmHF4W97SE7nC_ZJNvwOQ)

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.