抖音逆向解析
2025-08-03

加密参数S

function N(e) {
    var t = function() {
        var e = Date.now()//w()()
          , t = String(e)
          , n = Number(x(t).call(t, 0, 3))
          , r = Number(x(t).call(t, -4));
        //console.log(n,r);//n,r的值没有问题
        return {
            currentTimestamp: e,
            sKey: n + r + n * r,
            _:e
        }
    }()

      , n = t.currentTimestamp
      , o = t.sKey
      , _ = t._
        //console.log(o,_);
    res={"s": o,"_": _,"_bid": "mcenter_buyin"}
    return res
}
function x(e) {
    var t = e.slice;
    return t//e === i || r(i, e) && t === i.slice ? o : t
}
n={
    "headers": {
        "content-type": "application/json"
    }
}
S=N(n)
console.log(S)

这个是S的生成函数,就是用时间戳计算出一个S值,同时这个时间戳添加到请求头里面

加密参数msToken & a_bogus

GET

xhr.bdmsInvokeList中的args参数是GET请求需要替换的内容,在生成GET请求需要的a_bogus时需要修改这里面的url,url格式就是不带a_bogus的样子 注意:此处的url编码很特殊,只是编码了=,其余部分不编码 但是并不要求自己拼接,直接获取xhr里面的原始数据就可以

只要是GET请求,就只需要传入一个不包含msToken,a_bogus的url然后经过生成后就可以获得正常请求的URL,请求时该添加的Headers也要添加 (目前经过测试的接口有财账信息获取,橱窗列表获取)(GET请求通用逻辑)

function getab(){
    xhr = new XMLHttpRequest();
    xhr.bdmsInvokeList= [
    {
        "args": [
            "GET",
            "https://buyin.jinritemai.com/api/buyin/marketing/anchor_coupon/list?_bid=mcenter_buyin&_=1753497007695&s=1354495&size=20&page=1&start_use_time=0&end_use_time=0&coupon_type=0&coupon_status=0&verifyFp=verify_mdih40gl_iT61AVSe_JLKJ_4PD9_9zvT_wwuLcw9kvj6n&fp=verify_mdih40gl_iT61AVSe_JLKJ_4PD9_9zvT_wwuLcw9kvj6n&msToken=ia2AXihpB_rB2HcRiyL2HUkjIvzMbjiZfl2mWdhdtU1TIZTmB5XedM4Q7YAVSgYkCGz4VTulalMp8UUQX2SYPR-7PqQySi2KAlOen4sT0HfIqfi0f1ojqXubvOKOtHWVLB3rqnZ0DU5h4-pzqaj84wlvFRDZeEjn5RPP3OXWsj_6giIf3wgwGBo%3D",
            true
        ]
    },
    {
        "args": [
            "Accept",
            "application/json, text/plain, */*"
        ]
    }
]

    try {
        xhr.send();
    } catch (err) {
        console.log("发生错误,但被忽略:", err.message); // 可选:仅打印日志
        console.log('yesssss');
        console.log(window.a_bogus);
    }

}
getab();

POST

bdms对xhr方法进行的重写,所有只需要按照正常的发送POST请求的方式来发送请求就可以了

// 初始化bdms
window.bdms.init({
    "aid": 2631,
    "boe": false,
    "paths": [
        "/captcha/get",
        "/captcha/verify",
        "/api/authorStatData",
        "/api/author",
        "/api/shop",
        "/api/livepc",
        "/api/governance/creator/violations",
        "/api",
        "/pc",
        "/index/getUser",
        "/fxg-buyin",
        "/apply_sample_pc_api",
        "/index/",
        "/square_pc_api",
        "/comment_api",
        "/ecom/captain"
    ]
});

function postRequest() {
    var xhr = new XMLHttpRequest();
    xhr.bdmsInvokeList = [
        {
            "args": [
                "POST",
                "",
                true
            ]
        },
        {
            "args": [
                "Accept",
                "application/json, text/plain, */*"
            ]
        },
        {
            "args": [
                "Content-Type",
                "application/json"
            ]
        }
    ];
    var postData = {"page_size":20,"view_type":0,"common_filter":{"quick_filter":{"sub_fields":[]}},"page":1,"version":2}
    try {
        xhr.send(JSON.stringify(postData));
    } catch (err) {
        console.log("发生错误,但被忽略:", err.message);
        console.log('URL:', xhr.bdmsInvokeList[0]["args"][1]);
        console.log('a_bogus:', window.a_bogus);
        console.log('mstoken:', window.mstoken);
    }
}

postRequest();

加密参数header里面的x-secsdk-csrf-token

这个其实不是在本地进行的加密,是通过HEAD请求接口来获取的值

https://buyin.jinritemai.com/pc/selection/common/btm_mapping

curl --location --head 'https://buyin.jinritemai.com/pc/selection/common/btm_mapping?msToken=AEBhDFtTDRgERtmFPdVJiLWL4OZAN3BmzmxJ5KJqBZ8rVZNEncbskiQHRaurIhZGpdp0Z0G6-xOPlCUnTULSqW8SZKpmeHXHr6bGKty9LCGjllO1xRqRGIluAUufdKQMFI52D2qagBhtqlpC5CaDdE4W_o55DEnKPXR8Ej4273s8IQ%3D%3D&a_bogus=x7sVDqUEOx%2FRapeSYKQsHvnU7HjlrTuyPFT2bSlrHVeFOhUT%2F2B5wJgTJNF3X6SLPRpaie3HUnYAbVDP0l5aI99kzmZkuZwS04QCVhvog1i2TTJ27rRzesGxqi-GWWsPQ55HiQi1l0l7125fqq9BAAKySAej-8b8zNaydrWlexg-6GvYIVoDSub%3D' \
--header 'accept: */*' \
--header 'accept-language: zh-CN,zh;q=0.9' \
--header 'cache-control: no-cache' \
--header 'pragma: no-cache' \
--header 'priority: u=1, i' \
--header 'referer: https://buyin.jinritemai.com/dashboard/marketing/coupon-manager?pre_universal_page_params_id=&universal_page_params_id=b73459bd-9ad2-477e-b6b1-105aa310d6b2' \
--header 'sec-ch-ua: "Not)A;Brand";v="8", "Chromium";v="138", "Microsoft Edge";v="138"' \
--header 'sec-ch-ua-mobile: ?0' \
--header 'sec-ch-ua-platform: "Windows"' \
--header 'sec-fetch-dest: empty' \
--header 'sec-fetch-mode: cors' \
--header 'sec-fetch-site: same-origin' \
--header 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0' \
--header 'x-secsdk-csrf-request: 1' \
--header 'x-secsdk-csrf-version: 1.2.22' \
--header 'Cookie: gfkadpd=2631,22740; _tea_utm_cache_3813=undefined; scmVer=1.0.1.9157; s_v_web_id=verify_mdmhblak_AytJSzpF_0jXm_415p_8j64_dYobtGEIQOaK; passport_csrf_token=e0901f96f720db7ff34133d8c4147e4a; passport_csrf_token_default=e0901f96f720db7ff34133d8c4147e4a; is_staff_user=false; ttwid=1%7C4bF6Ikx24GoscQPLgDZKjAHyXZQ20iVLM2h-158HQSE%7C1753684845%7Cfdf13e25a3081868728ac50e65da82935a674e3b4867cae925973a2f792151ee; uid_tt=a2b5cac8292b790542a16cb539dae089; uid_tt_ss=a2b5cac8292b790542a16cb539dae089; sid_tt=65f4d628c484bb4169c5d1eba134a2f3; sessionid=65f4d628c484bb4169c5d1eba134a2f3; sessionid_ss=65f4d628c484bb4169c5d1eba134a2f3; session_tlb_tag=sttt%7C9%7CZfTWKMSEu0FpxdHroTSi8_________-8BhZkSbflr8a0EBeDswZjzdEn06CshYHQyRzbDpp3xJ8%3D; odin_tt=66a2335b1987c3e60be975b36667a1dc6e0e90f422e52767981622dd4d0a7d35c2bc3ed318dd0fa37d6883da76a78b63096ab228a58ef313330d9a61f7ebed53; ucas_c0_buyin=CkAKBTEuMC4wEKuIjM667cbDaBi9LyDb6OCUjszDBCiPETC7idCfxIxTQPC2nMQGSPDq2MYGUI-8yojp7JSHZ1h-EhSbpyMI3PgMPIq4BFWYsjAJo0OwwQ; ucas_c0_ss_buyin=CkAKBTEuMC4wEKuIjM667cbDaBi9LyDb6OCUjszDBCiPETC7idCfxIxTQPC2nMQGSPDq2MYGUI-8yojp7JSHZ1h-EhSbpyMI3PgMPIq4BFWYsjAJo0OwwQ; sid_guard=65f4d628c484bb4169c5d1eba134a2f3%7C1753684848%7C5184000%7CFri%2C+26-Sep-2025+06%3A40%3A48+GMT; sid_ucp_v1=1.0.0-KDJiM2RmODYzZTYxMGQwNDI5Y2Y4NmUwNmMzMmM4ZGVjOGFiYjU0YzYKFwi7idCfxIxTEPC2nMQGGI8RIAw4CEAmGgJobCIgNjVmNGQ2MjhjNDg0YmI0MTY5YzVkMWViYTEzNGEyZjM; ssid_ucp_v1=1.0.0-KDJiM2RmODYzZTYxMGQwNDI5Y2Y4NmUwNmMzMmM4ZGVjOGFiYjU0YzYKFwi7idCfxIxTEPC2nMQGGI8RIAw4CEAmGgJobCIgNjVmNGQ2MjhjNDg0YmI0MTY5YzVkMWViYTEzNGEyZjM; SASID=SID2_7532018330289389859; BUYIN_SASID=SID2_7532018330289389859; buyin_shop_type=24; buyin_account_child_type=1128; buyin_app_id=1128; buyin_shop_type_v2=24; buyin_account_child_type_v2=1128; buyin_app_id_v2=1128; csrf_session_id=8e8f37b3254b6ed8875019b67c9d0d4e; op_session=; csrf_session_id=8e8f37b3254b6ed8875019b67c9d0d4e'

到此,抖音bdms1.0.20版本的加密就已经全部搞定