Python爬虫之Js逆向案例(3)-X品牌手机社区

声明:XX手机社区加密逆向分析仅用于研究和学习

这篇文章的学习内容是以XX手机社区为案例,对JS逆向的整个过程进行详细分析

下面会进行以下几步进行分析(下方演示过程全部使用chrome浏览器);

  1. 锁定关键接口;
  2. 锁定关键字段;
  3. 破解关键字段;
  4. python爬虫结果演示;

一.锁定关键接口

进入社区,随便操作一下即可锁定查询接口,如下图:
在这里插入图片描述

二.锁定关键字段;

我们多请求几次,对比一下请求数据,找到可疑的加密参数,发现请求头里没有变化的参数,请求参数里有一个字段nonce每次都不一样,那应该就是这个字段了,下面老规矩,我们搜索这个字段,看看它是如何加密的(根据之前总结的经验,有没有能猜出来这个像哪种加密的数据?)
在这里插入图片描述

搜索一下,发现两个地方出现该字段,而且都是在做赋值操作,排除不掉无用的,那就都打上端点,以防打其中一个地方不对还需要回来重新打,如下图:
在这里插入图片描述

有没有发现里面写明了md5。。。

三.破解关键字段

先来分析一下都是由哪些数据加密出来的:
nonce = Object(u["md5"])(t + "" + parseInt(1e7 * Math.random(), 10) + 1, 32)

通过调试发现,t就是一个时间戳,再加上一个随机数,然后再通过md5加密,而且指定了32位;似乎所有难度都在函数u上、、、,如果是没有基础的同学,也可以不管这里的加密函数是啥,直接扣出u["md5"]的代码即可,下面再演示一下如何扣代码:

既然u是一个加密函数,我们在这个函数执行的时候打个端点,比如在(t+""的前面有个➡️,把这个端点点亮,我们单步调试时可直接进入这个函数,如下图:

在这里插入图片描述

扣代码的时候只需要把这个函数所在的父作用域的代码全部扣出来,稍微改写即可,如果能看出来这里是md5的加密源码,也可以不用扣,直接使用md5加密库;

直接贴爬虫代码吧:


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @File     : __init__.py.py
# @Desc     : 作者的所有代码均属于学习使用,不可商用或用在非法用途上。

import requests
import random
import execjs
import json

import time

url = 'https://bbs.vivo.com.cn/api/community/index'
headers = {
    'content-type': 'application/json;charset=UTF-8',
}


def get_timestamp():
    timestamp = int(time.time() * 1000)  # 获取13位时间戳
    return timestamp


def get_tamp_str():
    num = int(float(str(random.random() * 10000000)[:10]))  # 获取随机数
    str_ = str(get_timestamp()) + str(num) + '1'  # 获取21位随机数
    return str_


def get_cxt():
    # md5.js 扣出来的md5代码,放在这个文件的一个目录即可
    with open("md5.js", 'r') as file:  # 打开js文件
        cxt = execjs.compile(file.read())  # 导入js文件
        return cxt


def get_nonce():
    nonce = get_cxt().call('md5', get_tamp_str(), 32)  # 调用js文件md5函数加密,获取nonce
    return nonce


def get_data():
    data = {
        'imgSpecs': ["t577x324", "t577x4096"],
        'lastId': "",
        'nonce': get_nonce(),
        'pageNum': '1',
        'pageSize': '10',
        'timestamp': get_timestamp(),
    }
    return data

def main():
    res = requests.post(url, headers=headers,
                        data=json.dumps(get_data())).text
    tempRes = json.loads(res)['data']['list']
    list = []
    for data in tempRes:
        bbsname = data.get('author').get('bbsName')
        name = data.get('forum').get('name')
        summary = data.get('summary')
        tid = data.get('tid')
        title = data.get('title')
        list.append({
            'title': title,
            'bbsname': bbsname,
            'name': name,
            'summary': summary,
            'tid': tid
        })
    return list


if __name__ == '__main__':
    print(main())

四.python爬虫结果演示

在这里插入图片描述

总结:

  1. 请求头的参数原接口中有很多,但实际有用的只有一个,如何快速确定哪些有用?可以使用curl的方式快速确定有用参数;

后期会持续分享爬虫案例-100例,有兴趣的同学可加入我的知识星球,有更多技巧、高能总结等你哦!!!;

欢迎加入「python、爬虫、逆向Club」知识星球

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玛卡`三少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值