2024年某书最新x-s-common签名算法分析以及点赞api接口测试nodejs(2024-01-05)

news2024/11/18 3:20:28

           2024年某书又更新了x-s-common算法,现在的版本是:3.6.8。这个签名算法现在是越来越重要了,许多接口都要用到。比如:评论,点赞等接口,没有这个算法采集不到数据。


    一、chrome逆向x-s-common算法


    1、x-s-common


    打开chrome,按f12,打开开发者模式,随便找一接口,全局搜索:x-s-common,找到位置如下:


(图1x-s-common算法位置)

    2、x-s-common参数

 function xsCommon(t, e) {
            try {
                var r, n, o = t.platform, i = e.url, a = map_default()(NEED_XSCOMMON_URLS).call(NEED_XSCOMMON_URLS, (function(t) {
                    return new RegExp(t)
                }
                ));
                if (!some_default()(a).call(a, (function(t) {
                    return t.test(i)
                }
                )))
                    return e;
                var u = e.headers["X-t"] || ""
                  , c = e.headers["X-s"] || ""
                  , s = e.headers["X-Sign"] || ""
                  , l = getSigCount(u && c || s)
                  , f = localStorage.getItem(MINI_BROSWER_INFO_KEY)
                  , p = localStorage.getItem(RC4_SECRET_VERSION_KEY) || RC4_SECRET_VERSION
                  , d = {
                    s0: getPlatformCode(o),
                    s1: "",
                    x0: p,
                    x1: version,
                    x2: o || "PC",
                    x3: "xhs-pc-web",
                    x4: "3.23.0",
                    x5: js_cookie.Z.get(LOCAL_ID_KEY),
                    x6: u,
                    x7: c,
                    x8: f,
                    x9: encrypt_mcr(concat_default()(r = concat_default()(n = "".concat(u)).call(n, c)).call(r, f)),
                    x10: l
                };
                e.headers["X-S-Common"] = encrypt_b64Encode(encrypt_encodeUtf8(stringify_default()(d)))
            } catch (h) {}
            return e
        }
//提炼参数如下:
{
    "s0": 5,
    "s1": "",
    "x0": "1",
    "x1": "3.6.8",
    "x2": "Windows",
    "x3": "xhs-pc-web",
    "x4": "3.23.1",
    "x5": "186d30820a4m09cb6glhxe1aqks2olv1l97ow1gun50000408882",
    "x6": 1704412623681,
    "x7": "XYW_eyJzaWduU3ZuIjoiNTEiLCJzaWduVHlwZSI6IngxIiwiYXBwSWQiOiJ4aHMtcGMtd2ViIiwic2lnblZlcnNpb24iOiIxIiwicGF5bG9hZCI6IjU5ZTg4ODZkYTE5OTg3ZjNlNTNkOWM0YjljZmZjYjUwMGU4YzA2MWY0Y2I3YTBhYjc5YWI2MGU0NjYxN2UxZTdmMDIzNmYzOGM0YjEwMzllZjFkYzU3MmE5N2NiNTliYWM5ZTNiZmRhMWZhYTFlYjkwZDc0YWEzMWI1NGM3MmNkMGQ3NGFhMzFiNTRjNzJjZGFjNDg5YjlkYThjZTVlNDhmNGFmYjlhY2ZjM2VhMjZmZTBiMjY2YTZiNGNjM2NiNTUyYjFkZWM4MTkzYzQwNjMwODhlN2EwZTFhZjcyMGE0N2VhZGMxNzQ2ZDA3MWI3MmYwYzBmNzk0M2U3YjAyMzU0NWU4MTFjZDQ3NGZkZGMxODQ5MTU2NjA5ZTJmYWI5YzZlZjI1ODc2ZDNmNGY5Mjk0NWZhOGExMWI1NWE3Yzk1YWEyMWRmZjNiMjgxOThmZWU2MDg3ODNlYTQyNjNlNzU3MWMyZjY5MmYwZmY4Y2IyZWY1N2M4ZmJjNDk3YmVhOCJ9",
    "x8": "I38rHdgsjopgIvesdVwgIC+oIELmBZ5e3VwXLgFTIxS3bqwErFeexd0ekncAzMFYnqthIhJeSBMDKutRI3KsYorWHPtGrbV0P9WfIi/eWc6eYqtyQApPI37ekmR1QL+5Ii6sdnoeSfqYHqwl2qt5BfqJIvFbNLQ+ZPw7Ixdsxuwr4qtkIkrwIi/skZc3ICLdI3Oe0utl2ADZsL5eDSJsSPwXIEvsiVtJOPw8BuwfPpdeTDWOIx4VIiu6ZPwbJqt0IxHyoMAeVutWIvvs6VtrIkSKIimrzf7sY9GdZ0vsYutmor/e0lD9oooeYlqZI3gsYuwZIEesjVtIcYT0OoVGIvgeiqtR/Ygexdp8IhTLIEY2Q7PjI3RG4mQgIiifpVwAICrVJo3eDbvekVtlIx3s0U6sfgu4IENs6DZ3yutiIkos1ovskY/skVw2enNsSPwVIC+ssA7eSuwkggKsWVw8IxI2I38DsqwZgVtLzdbLtb6ekLAs6uwmIE3sS76sVzZvIEF=",
    "x9": -850196713,
    "x10": 137
}

参数分析如下:
s0: getPlatformCode(o),
固定值,web端为:5
s1: "",
固定值,web端为:空
x0: p,p = localStorage.getItem(RC4_SECRET_VERSION_KEY) || RC4_SECRET_VERSION
固定值,web端为:1
x1: version,    
固定值,版本号,当前版本为:"3.6.8",
 "x2": o || "PC",
固定值"Windows",,表示平台类型。
x3: "xhs-pc-web",
固定值,程序类型
x4: "3.23.0",
固定值,内部版本号
x5: js_cookie.Z.get(LOCAL_ID_KEY),
该值为:a1,从cookie中获取。
"x6": u,u = e.headers["X-t"] || ""
该值为:x-t,从x-s签名算法中返回。
"x7": c,c = e.headers["X-s"] || ""
该值为:X-s,从x-s签名算法中返回。
x8: f,localStorage.getItem(MINI_BROSWER_INFO_KEY)
该值为:浏览器指纹,每个浏览器值不同,但基本上可以固定不变。
x9: encrypt_mcr(concat_default()(r = concat_default()(n = "".concat(u)).call(n, c)).call(r, f)),
可以简化如下:
let mcr=encrypt_mcr(xt+xs+b1);
该值为:x6+x7+x8的加密。
x10: l=getSigCount()
该值为:调用x-s-common的计数值。


3、加密函数


e.headers["X-S-Common"] = encrypt_b64Encode(encrypt_encodeUtf8(stringify_default()(d)))
stringify_default()实际上是:JSON.stringify(d))

4、encrypt_mcr算法


(图2encrypt_mcr算法)

5、encrypt_b64Encode加密


(图3encrypt_b64Encode加密)


6、encrypt_encodeUtf8加密


(图4encrypt_encodeUtf8加密)

7、x-s-common测试结果对比


(图5,图6x-s-common测试结果对比)

(图5,图6x-s-common测试结果对比)


可见,nodejs环境算出的结果与浏览器一致。

二、点赞api接口测试


    点赞api接口需要x-s-common签名参数,否则点赞不成功。


1、nodejs点赞api接口源码如下:

const https = require('node:https');
//----------------------------------------------调用模块初始化----------------------------------------------------
const m_common_data = require('./x-s-common.js');//X-S-Common签名
const m_xs_data = require('./xs.js');//X-S签名
//mode by wx:byc6352 in 2024-01-05
//-----------------------------------------------------------------------------------------------------------------------
set_lick(true);//true为点赞,false为取消点赞

async function set_lick(b){
    let url="";
    if(b)
        url="https://edith.xiaohongshu.com/api/sns/web/v1/note/like";
    else
        url="https://edith.xiaohongshu.com/api/sns/web/v1/note/dislike";
    let path=url.replace("https://edith.xiaohongshu.com","");
    let data={"note_oid":"649ce312000000000800edcd"};
    let data_str=JSON.stringify(data);
    let a1="18cb6c8af05699x2fcmw6t6jwq9yi8kjhc6ge611l50000415372";
    let o=await m_xs_data.get_xs(path,data_str,a1);
    var xs=o["X-s"];
    var xt=o["X-t"];
    let x_common=m_common_data.get_common(a1,xt,xs);
   
    let traceid=m_common_data.get_traceid();

    let headers={
        "authority":'edith.xiaohongshu.com',
        "method":'POST',
        "path":path,//'/api/sns/web/v1/note/like',
        "scheme":'https',
        "Accept":'application/json, text/plain, */*',
        //"Accept-Encoding":'gzip, deflate, br',
        "Accept-Language":'zh-CN,zh;q=0.9',
        "Content-Length":data_str.length,//'39',
        "Content-Type":'application/json;charset=UTF-8',
        "Cookie":cookie,
        "Origin":'https://www.xiaohongshu.com',
        "Referer":'https://www.xiaohongshu.com/',
        "Sec-Ch-Ua":'"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
        "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/120.0.0.0 Safari/537.36',
        "X-B3-Traceid":traceid,//'0b0b047c4d54393b',
        "X-S":xs,
        "X-S-Common":x_common,
        "X-T":xt,
    }//
    const options = {
        hostname: 'edith.xiaohongshu.com',
        port: 443,
        path: path,
        method: 'POST',
        headers: headers
    }
    let req = https.request(url,options, (res) => {
        console.log(`STATUS: ${res.statusCode}`);
        console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
        res.setEncoding('utf8');
        var body="";
        res.on('data', (chunk) => {
            body=body+chunk;
        });
        res.on('end', () => {
            try {
               console.log(body);
            }catch (e){
                console.error(e);
            }
        });
        res.on('close', () => {

        });
    });

    req.on('error', (e) => {
        console.error(`problem with request: ${e.message}`);
    });
    req.write(data_str,'utf8');
    req.end();

}

2、接口运行成功


技术支持:6Zeu6aKY5ZKo6K+i77yadng6YnljNjM1MiBvciBtZXRhYnljZjtRUTozOTg0ODg3Mjt0ZWxlZ3JhbTpieWMwMQ==(base64解码)

(图6成功点赞)

大功造成!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1359182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ReactNative 常见问题及处理办法(加固混淆)

目录 文章目录 摘要 引言 正文 ScrollView内无法滑动 RN热更新中的文件引用问题 RN中获取高度的技巧 RN强制横屏UI适配问题 低版本RN(0.63以下)适配iOS14图片无法显示问题 RN清理缓存 RN navigation参数取值 pod install 或者npm install 44…

JavaWeb基础(3)-会话技术(cookie和session),过滤器(Filter),监听器(Listener)

JavaWeb基础(3)-会话技术(cookie和session),过滤器(Filter),监听器(Listener) 文章目录 JavaWeb基础(3)-会话技术(cookie和session),过滤器(Filter),监听器(Listener)8 会话技术(Coo…

ChatGPT怎么帮我上班的

1.解放生产力 1)标准格式,完美输出。GPT对于公文等具有一定标准格式的文件,可以进行完美仿写,随随便便以假乱真那都是小菜一碟,这对于经常要开展规范成文的人来说,简直就是个福音,只要前期调教…

[蓝桥杯学习]树的直径与重心

树的直径 定义 为什么不直接说(u,v)是两个叶子,可能有如下情况: 这是一条链,且u为根,但,度数为1 下面这个情况是不经过根的。 求解方法 如果设根u的深度为0时,直径就是深度dep[v]…

【LeetCode】608. 树节点

表:Tree ------------------- | Column Name | Type | ------------------- | id | int | | p_id | int | ------------------- id 是该表中具有唯一值的列。 该表的每行包含树中节点的 id 及其父节点的 id 信息。 给定的结构总是一个有效的树。…

软件测试|弄懂GROUP BY看这一篇文章就够了

简介 在SQL(结构化查询语言)中,GROUP BY子句是一个强大的工具,用于对查询结果进行分组和聚合操作。通过使用GROUP BY子句,可以根据指定的列或表达式对数据进行分组,并对每个分组应用聚合函数,从…

光明源@智慧厕所技术:优化生活,提升卫生舒适度

在当今数字科技飞速发展的时代,我们的日常生活正在经历一场革命,而这场革命的其中一个前沿领域就是智慧厕所技术。这项技术不仅仅是对传统卫生间的一次升级,更是对我们生活品质的全方位提升。从智能感应到数据分析,从环保设计到舒…

全程云OA ajax.ashx SQL注入漏洞复现

0x01 产品简介 全程云OA为企业提供日常办公管理、公文管理、工作请示、汇报、档案、知识体系、预算控制等26个功能,超过100多个子模块。为企业内部提供高效、畅通的信息渠道,同时也能大力推动公司信息系统发展,提高企业的办公自动化程度和综合管理水平,加快企业信息的流通…

软考 软件设计师 查漏补缺

说明建模图 1-1 和图 1-2 是如何保持数据流图平衡。 答:图 1-1 (或父图)中某加工的输入输出数据流必须与图 1-2 (或子图)的输入输出数据流在数量和名 字上相同;图 1-1 (或父图)中的…

73.乐理基础-打拍子-还原号、临时变音记号在简谱中的规则

上一个内容:72.乐理基础-打拍子-加延音线的节奏型-CSDN博客 下图中1-13,就是四几拍中所有可能出现的节奏型,以及它们的组合方式,需要练习,可以买一本视唱书去练习,搜乐谱练习,自己写节奏型根据…

bat批处理文件_输出内容到文本

文章目录 1、echo str > test.txt(覆盖原有内容)2、echo str >> test.txt(不覆盖原有内容,追加) 1、echo str > test.txt(覆盖原有内容) 2、echo str >> test.txt&#xff0…

CMake是什么?为什么学习CMake

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「本文的内容」:CMake入门教程 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1.CMake简介2.为什么…

gz-hamonic 安装提示缺少许多依赖无法安装

在软件更新源中增加gz-hamonic的软件源, 点击添加,在输入框中填入如下语句: deb http://packages.osrfoundation.org/ubuntu jammy main 如图所示: 然后执行 sudo apt -get install gz-hamonic即可安装。 如下图 在终端中输入…

Netty初探:掌握高性能网络通信框架,提升Java网络编程技能

Netty初探 NIO 的类库和 API 繁杂 , 使用麻烦: 需要熟练掌握Selector、 ServerSocketChannel、SocketChannel、 ByteBuffer等。 开发工作量和难度都非常大: 例如客户端面临断线重连、 网络闪断、心跳处理、半包读写、 网络拥塞和异常流的处…

RKE安装k8s及部署高可用rancher之证书在外面的7层LB(nginx中) 7层负载均衡

一 了解 Rancher 1 推荐架构 安装 Rancher 的方式有两种:单节点安装和高可用集群安装。因为单节点安装只适用于测试和 demo 环境,而且单节点安装和高可用集群安装之间不能进行数据迁移,所以推荐从一开始就使用高可用集群安装的方式安装 Ran…

业务项目中Echarts图表组件的封装实践方案

背景:如果我们的项目是一个可视化类/营销看板类/大屏展示类业务项目,不可避免的会使用到各种图表展示。那在一个项目中如何封装一个图表组件既能够快速复用、UI统一,又可以灵活扩充Echarts的各种复杂配置项配置就变得极为重要。 封装目标 符…

HttpRunner自动化测试之实现参数化传递

参数化实现及重复执行 参数化测试:在接口测试中,为了实现不同组数据对同一个功能模块进行测试,需要准备多组测试数据对模块进行测试的过程。 在httprunner中可以通过如下方式实现参数化: 1、在YAML/JSON 中直接指定参数列表 2、…

C之BS开发

一、 BS 概述与 boa 搭建 1.1 BS 模式开发概述 BS 模式: 浏览器与服务器模式, 即通过浏览器访问服务器的 Web 资源。 1.1.1 web 前端开发技术 主要包含: HTML 、 CSS 、 XML/JSON 、 Javascript 、 AJAX HTML 超文本标记语言 ( 英文全称…

【Element】el-form和el-table嵌套实现表格编辑并提交表单校验

一、背景 页面需要用到表格采集用户数据,提交时进行表单校验;即表格中嵌套着表单,保存时进行表单校验 二、功能实现 2.1、el-form和el-table嵌套说明 ① :model"formData" 给表单绑定数据,formData是表单的数据对象 …