都是限制,都是秘密,JS逆向某建筑市场数据,python爬虫120例 Y9

举报
梦想橡皮擦 发表于 2022/04/20 09:32:26 2022/04/20
【摘要】 📢📢📢📢📢📢哈喽!大家好,我是 【梦想橡皮擦】,10 年产研经验,致力于 Python 相关技术栈传播 💗🌻 本文如果觉得不错,动动小手点个赞赞吧 👍📣📣📣📣📣📣📆 橡皮擦的第 618 篇原创博客 ⛳️ 实战场景本篇博客我们继续解决 JS 逆向加密等反爬问题,这次目标站点是建筑市场相关数据。作为一个 Python 爬虫爱好者,相信你能知道正确的站点。目标站点:...

📢📢📢📢📢📢
哈喽!大家好,我是 【梦想橡皮擦】,10 年产研经验,致力于 Python 相关技术栈传播 💗
🌻 本文如果觉得不错,动动小手点个赞赞吧 👍
📣📣📣📣📣📣

📆 橡皮擦的第 618 篇原创博客

⛳️ 实战场景

本篇博客我们继续解决 JS 逆向加密等反爬问题,这次目标站点是建筑市场相关数据。

作为一个 Python 爬虫爱好者,相信你能知道正确的站点。

  • 目标站点:E585A8E59BBDE5BBBAE7AD91E5B882E59CBAE79B91E7AEA1E585ACE585B1E69C8DE58AA1E5B9B3E58FB0 (十六进制加密),如获取站点名称,可以使用任意十六进制解密工具。
  • 目标网址:687474703A2F2F6A7A73632E6D6F687572642E676F762E636E2F

站点首页截图如下所示,本博客仅供学习使用,不建议公开去采集,很多地方都需要进行打码、隐藏、都是秘密。

通过开发者工具截获接口如下所示:

  • 请求网址: http://Python爬虫目标地址/api/webApi/dataservice/query/project/list?pg=1&pgsz=15&total=450
  • 请求方法: GET

接下来就是本案例有趣的地方了,当我们检查其请求头是否包含加密信息时,发现没有任何加密参数,但当打开响应体的时候,问题来了。

下图即为服务端响应内容。

可以看到响应内容是一段加密之后的字符串,不是 HTML 或者 JSON 格式的数据。

如果想要渲染成页面视图,必须找到其解码方法。

⛳️ 响应解码

通过关键字 project/list 设置 XHR 断点,然后点击任意分页请求,进入断点。

响应内容最终被解码出来是请求之后的处理逻辑,所以我们只需要在断点处,继续跟进代码即可。

反复点击 【跳过下一个函数调用】,等进入到响应处理函数的位置,如下图所示。

其中会发现参数 i 的值依旧是编码字符串,然后调用了 r(t,c,o),其中 o 是编码过的字符串,此时 r() 函数就非常重要了,大概率解码流程就在该函数内部。

点击进入函数内部,查看处理逻辑。

随着跟进,结果发现了如下代码段。

此时这个问题就有解决方案了,我们找到了 AES 解码位置,迅速把核心代码摘抄到本地。

  , f = d.a.enc.Utf8.parse("jo8j9wGw%6HbxfFn")
  , m = d.a.enc.Utf8.parse("0123456789ABCDEF");
 function h(t) {
     var e = d.a.enc.Hex.parse(t)
       , n = d.a.enc.Base64.stringify(e)
       , a = d.a.AES.decrypt(n, f, {
         iv: m,
         mode: d.a.mode.CBC,
         padding: d.a.pad.Pkcs7
     })
       , r = a.toString(d.a.enc.Utf8);
     return r.toString()

基于对 AES 加密形式的理解,此时用到的解码形式是 CBC,其中 iv 值是 0123456789ABCDEFkey 值是 jo8j9wGw%6HbxfFn,其中参数 t 是传入的待解码字符串。

执行该函数之后,就实现了解码操作,可以继续跟进,发现如下信息,其中重要的参数是 r

梳理逻辑如下所示

  1. 传入加密字符串 t
  2. 对加密字符串进行 Hex 格式化操作;
  3. 对上一步生成的字符串进行 Base64 编码;
  4. 使用 AES 解码字符串。

转义成 Python 代码即可。

from Crypto.Cipher import AES

if __name__ == '__main__':
    key = 'jo8j9wGw%6HbxfFn'
    iv = '0123456789ABCDEF'

    t = "95780ba09437加密串"

    text = bytes.fromhex(t)
    key = key.encode()
    iv = iv.encode()
    aes = AES.new(key, AES.MODE_CBC, iv)
    plain_text = aes.decrypt(text).decode()
    print(plain_text)

运行代码之后,发现数据已经被解码。

📣📣📣📣📣📣
🌻 本文如果发现错误,欢迎在评论区中指正哦 💗
版权关系,无法分享所有代码,有需要的可以点击下面卡片,联系我

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。