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

2024年,某书更新了x-s-common算法,目前的版本是4.7.2。这个签名算法变得越来越关键,许多接口都需要使用它,比如获取笔记信息接口,如果没有这个算法,就无法获取数据。

  一、对Chrome进行逆向工程以破解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算法对数据进行加密。

————————————————

                           

5、对数据进行加密并使用Base64编码。

6、对数据进行加密,并使用UTF-8编码。

7、比较测试结果中的x-s-common参数。

  • 对点赞API接口进行测试。

该点赞api接口需要使用x-s-common签名参数,如果没有这个参数的话,点赞操作就无法成功。

1、以下是Node.js编写的点赞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();



}
  1. 接口执行顺利。

 技术支持:

6Zeu6aKY5ZKo6K+i77yadng6bWp4MjA4NDQ3NDcwNDtRUToyMDg0NDc0NzA0(base64解码

测试成功!

  • 14
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值