某红书笔记接口逆向【x-s参数】

前言:提供补环境思路

一、分析

  1. 定位目标接口:

  2. 多次刷新页面发现变动参数很多,使用Fiddler做重放攻击观察哪些参数需要逆向,上帝视角就只检验了x-s参数。

  3. 直接搜索x-s关键词定位到生成位置,断点分析:

  4. 确定来到的位置就是我们需要接口的位置,很明显这里并不是:

  5. 打上条件断点刷新页面继续分析:

  6. 很明显j函数里穿了两个参数,一个是api,另一个是请求参数,现在跟进j函数中去。

  7. 断点到return处分析此函数,x-s参数就是字符串"XYS_"拼接上了经过两次编码的字符串P,P的核心是C参数,C是window.mnsv2(u,m,w)生成的,u是api拼接上请求参数,m是标准的MD5算法加密参数u,m也是标准MD5算法加密api。这些都是能直接在控制台看到的。所以现在的主要是window.mnsv2这个函数。

  8. 进入window.mnsv2发现它是由一个vmp(虚拟机)生成的,现在思考这个虚拟机是在何时被调用的,依旧断点分析:

  9. 很清楚的知道vmp中生成的window.mnsv2函数就是由eval了一下code这个js代码得来的,所以我们直接将整个代码全部扣下来,再在html文件中调一下,检测一下是否window下有了mnsv2这个函数,我是检查了的确实存在。接下来就是上自动吐环境代理缺啥补啥的环节了。

  10. 代理代码可以私信我,我就直接上环境代码了:

python代码

python 复制代码
"""
经过对比发现变动参数有:
    headers:   x-b3-traceid   x-s   x-s-common   x-t   x-xray-traceid
    cookies:   loadts   websectiga   sec_poison_id
但是经过多次删减参数请求发现只有一个参数 x-s 是被检测的
"""

import requests
import json
import execjs

data = {
    "keyword": "手机",
    "page": 2,
    "page_size": 20,
    "search_id": "2gh6vz6bs40ilotdox41x@2gh6w09xlxzhn0pd5kf84", # 会变
    "sort": "general",
    "note_type": 0,
    "ext_flags": [],
    "filters": [
        {
            "tags": [
                "general"
            ],
            "type": "sort_type"
        },
        {
            "tags": [
                "不限"
            ],
            "type": "filter_note_type"
        },
        {
            "tags": [
                "不限"
            ],
            "type": "filter_note_time"
        },
        {
            "tags": [
                "不限"
            ],
            "type": "filter_note_range"
        },
        {
            "tags": [
                "不限"
            ],
            "type": "filter_pos_distance"
        }
    ],
    "geo": "",
    "image_formats": [
        "jpg",
        "webp",
        "avif"
    ],
    "message_id": "sending"
}

with open('./x-s.js', 'r', encoding='utf-8') as f:
    ctx = execjs.compile(f.read())
    x_s = ctx.call("get_xs", data)
print(x_s)


headers = {
    "accept": "application/json, text/plain, */*",
    "accept-language": "zh-CN,zh;q=0.9",
    "cache-control": "no-cache",
    "content-type": "application/json;charset=UTF-8",
    "origin": "https://www.xiaohongshu.com",
    "pragma": "no-cache",
    "priority": "u=1, i",
    "referer": "https://www.xiaohongshu.com/",
    "sec-ch-ua": "\"Chromium\";v=\"148\", \"Google Chrome\";v=\"148\", \"Not/A)Brand\";v=\"99\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\"",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "same-site",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36",
    # "x-b3-traceid": "ceeb336cbf6f2f07", # 变
    "x-s": str(x_s)
    # "x-s": "XYS_2UQhPsHCH0c1PUhMHjIj2erjwjQhyoPTqBPT49pjHjIj2eHjwjQgynEDJ74AHjIj2ePjwjQTJdPIPAZlg94aGLTlGfRFnD+IGA4NaLEbzemk8BE9pMbSp7QawepnL04x2bSo/rDUy0bA+7iF8rPI8Fbj2fY9/9TFLgSI+sTs4n8iGAmpaBqILSzCPFM8pDiFJSQynpG7JezVNFPI4S8Qapr3LoQGanc3qS8D4/zL8FTmPrkHaMY/PrTP4pzePn8+c9EIqMQCLDkcpnbLP9ls+rT/Jfznnfl0yLLIaSQQyAmOarEaLSz+qApga0WlyAby4SbdPemxJpD7/fMBpjHVHdWFH0ijJ9Qx8n+FHdF=",
    # "x-s-common": "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",
    # 上面两个参数也变
    # "x-t": "1780987293024", # 时间戳
    # "x-xray-traceid": "cf558eb69cc7bf1afe0b632d5a0fdbe0" # 变
}

url = "https://so.xiaohongshu.com/api/sns/web/v2/search/notes"

data = json.dumps(data, separators=(',', ':'))
response = requests.post(url, headers=headers, data=data)

print(response.text)
print(response)

环境代码

javascript 复制代码
setTimeout = function(){}
setInterval = function(){}

window = globalThis
window.window = window.top = window.self = window
window.addEventListener = function(){}
window.Screen = function(){}
window.MouseEvent = function (){}
window.WebGLRenderingContext = function (){}


window.loadts = '1781165764141'
window.xsecappid = 'xhs-pc-web'
window.insight = {}
window.xhsFingerprintV3 = {}

function XMLHttpRequest(){}
XMLHttpRequest.prototype.open = function (){}
XMLHttpRequest.prototype.send = function (){}
XMLHttpRequest.prototype.setRequestHeader = function (){}
XMLHttpRequest.prototype.getAllResponseHeaders = function (){}
window.XMLHttpRequest = XMLHttpRequest


function Navigator(){}
Navigator.prototype.webdriver = false
Navigator.prototype.userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36'
navigator = new Navigator()
window.Navigator = Navigator

function Element(){}
Element.prototype.getAttribute = function (){}
Element.prototype.removeChild = function (){}

function Document(){}
Document.prototype.all = new Element()
Document.prototype.body = new Element()
Document.prototype.cookie = ''
Document.prototype.addEventListener = function (){}
Document.prototype.documentElement = new Element()
Document.prototype.getElementById = function(tag_name){
    console.log("getElementById:::", tag_name)
}
Document.prototype.getElementsByTagName = function (tag_name){
    console.log("getElementsByTagName:::", tag_name)
    if (tag_name === "*"){
        return []
    }
}
document = new Document()
document.querySelector = function(tag_name){
    console.log("querySelector:::", tag_name)
}
document.querySelectorAll = function(tag_name){
    console.log("querySelectorAll:::", tag_name)
}
document.evaluate = function(tag_name){
    console.log("evaluate:::", tag_name)
}

location = {
    "ancestorOrigins": {},
    "href": "https://www.xiaohongshu.com/search_result_ai?keyword=%25E5%2581%25A5%25E8%25BA%25AB&source=web_explore_feed&type=51",
    "origin": "https://www.xiaohongshu.com",
    "protocol": "https:",
    "host": "www.xiaohongshu.com",
    "hostname": "www.xiaohongshu.com",
    "port": "",
    "pathname": "/search_result_ai",
    "search": "?keyword=%25E5%2581%25A5%25E8%25BA%25AB&source=web_explore_feed&type=51",
    "hash": ""
}

function Storage(){}
Storage.prototype.getItem = function(tag_name){
    console.log("getItem:::", tag_name)
    if(tag_name === 'unloads_record'){
        return '[[1781163449291.5,53249],[1781163502541.1,8803],[1781163511344.4,31045],[1781163542389.1,194550],[1781163736939.3,407272]]'
    }
    if(tag_name === 'kbconf'){
        return null
    }
}
localStorage = new Storage()

二、结果展示

文章仅做学习参考,如有侵权立即删除

相关推荐
xxie1237941 小时前
参数Parameter,形参Formal Parameter,实参Actual Argument
开发语言·python
love530love1 小时前
Hermes-Agent 本地化部署与详细交互式配置实战指南 [LM Studio + QQ ]
人工智能·windows·python·aigc·agent·hermes·hermes-agent
高洁011 小时前
人人可用的智能体来了
python·深度学习·机器学习·数据挖掘·知识图谱
装不满的克莱因瓶1 小时前
NLP中的卷积神经网络CNN——从图像卷积到文本特征提取的跨界应用
人工智能·pytorch·python·深度学习·神经网络·自然语言处理·cnn
在放️1 小时前
Python 爬虫 · XML、xpath 与 lxml 模块基础
开发语言·爬虫·python
weixin_li152********1 小时前
《Angular 中优雅地处理枚举值:Map + *ngIf as 替代多次 *ngIf》
javascript·vue.js·angular.js
挨踢诗人1 小时前
天猫(淘宝开放平台)集成金蝶云星空
python·数据集成
放下华子我只抽RuiKe51 小时前
FastAPI 全栈后端(五):后台任务与消息队列
前端·javascript·react.js·ai·前端框架·fastapi·ai编程
丷丩1 小时前
MapLibre GL JS第44课:生成并添加缺失图标
前端·javascript·gis·mapblibre gl js