本文最后更新于 2024-07-06,文章内容可能已经过时。

关于京东Cookie的基本知识

常见的京东Cookie(用于身份校验)常见的说法有mck、appck和wskey,这三种大致差不多,但是出现的地方不太一样,会被京东用于做出具体的限制,例如可以参加什么活动、不能参加什么活动。可以直接区分用户登录的来源,这里都是移动端的(因为活动都在移动端)

  • wskey: 京东App登录后,在App中的Cookie,有效期好像是半年吧,格式为:pin=xxx;wskey=AAxxx;
  • appck: 通过京东App的webview打开的网页活动,会将wskey转换成appck,有效期24小时,格式为:pt_key=app_openAAxxx;pt_pin=xxx;
  • mck: 普通的移动端网页登录的Cookie,有效期30天,格式为pt_key=AAxxx;pt_pin=xxx;

这里应该能看出来,很多活动完全可以根据Cookie来限制参加活动的途径,事实证明京东也就是这么做的,像炸年兽这种电商节活动开始可以mck直接玩,也没有log校验,几天过后限制就全开了。只允许appck用户参加,并且会打开log校验。

炸年兽的最后一片拼图

上一篇文章中已经尝试使用appck去调用接口了,但是会提示环境异常,这里活动已经结束了,已经拿不到当初的截图了,哭死。

可以直接将请求导入到软件中进行测试,进行删减参数进行测试了,实际上基本上感觉就是Cookie的问题,之前找京东短链获取源链的时候,就出现过需要CSID__jda的。

image-20230123201635079

然后就发现需要__jdbmba_muid,不然就会出现环境异常。

找一下js代码喽。

image-20230123203217228

额,直接找一下关于setCookie()的调用,然后将相关代码都拷贝出来,再找一个合适的位置直接将lr打出来。

var cookies = {
    __jda: {},
    __jdb: {},
    __jdc: {},
    __jdv: {},
    mba_muid: {}
}
function genUuid() {
    return (new Date).getTime() + "" + parseInt(2147483647 * Math.random())
}
function setCookie(e, t, r, o) {
    if (e) {
        var i = "";
        if (o) {
            var a = new Date;
            a.setTime(a.getTime() + o); 
            i = a.getTime();
        }
        cookies[e].value = t;
        cookies[e].expires = i;
    }
}
function isPrey(e) {
    if (e >= 100) return !0;
    var t = lr.uuid, r = t.substr(t.length - 2);
    return !!r && 1 * r < e
}
function setJdv(e, t, r) {
    var o = "";
    o = isPrey(10) && (!e || e.length > 400) ? t + "|direct|-|none|-|" + (new Date).getTime() : e;
    var i = r ? lr.ckJdvEmbeddedExp : lr.ckJdvExp;
    setCookie(lr.ckJdv || "__jdv", o, lr.ckDomain, i)
}
function genHash(e) {
    var t, r = 1, o = 0;
    if (e) for (r = 0, t = e.length - 1; t >= 0; t--) r = 0 !== (o = 266338304 & (r = (r << 6 & 268435455) + (o = e.charCodeAt(t)) + (o << 14))) ? r ^ o >> 21 : r;
    return r
}
var lr = {
    "ckJda": "__jda",
	"ckJdb": "__jdb",
	"ckJdc": "__jdc",
	"ckJdu": "__jdu",
	"ckJdv": "__jdv",
	"ckJdaExp": 15552000000,
	"ckJdbExp": 1800000,
	"ckJduExp": 15552000000,
	"ckJdvExp": 1296000000,
	"ckJdvEmbeddedExp": 86400000,
	"ckWxAppCkExp": 15552000000,
	"mtSubsiteExp": 31536000000,
	"refUrl": "",
	"ckmba_muid": "mba_muid",
	"ckmba_muidExp": 15552000000,
    "ckDomain": "jd.com",
    "_mbaMuidSeq": []
}

function getBaseCookie() {
    var e, t, r, o, i = [""], a = [""], n = [""], d = [""], l = parseInt((new Date).getTime() / 1e3), c = 0, s = 1, u = "direct", p = "-", g = "none", _ = "-";
    o = genUuid(); 
    e = l; 
    t = l;
    lr.uuid = o; 
    var M, f = [], S = a.length < 4, v = null, w = !1;
    var C, k = lr.refUrl && lr.refUrl.split("/")[2], A = !1;
    if (k && k.indexOf(lr.ckDomain) < 0) {
        for (C = lr.seo, m = 0; m < C.length; m++) {
            var T = C[m].split(":");
            if (k.indexOf(T[0].toLowerCase()) > -1 && lr.refUrl.indexOf((T[1] + "=").toLowerCase()) > -1) {
                var D = null;
                /[^\x00-\xff]/.test(D) && (D = encodeURIComponent(D)), f.push(T[0]), f.push("-"), f.push("organic"), f.push(D || "not set"), _ = f[3], A = !0;
                break
            }
        }
        A || (k.indexOf("zol.com.cn") > -1 ? (f.push("zol.com.cn"), f.push("-"), f.push("cpc"), f.push("not set")) : (f.push(k), f.push("-"), f.push("referral"), f.push("-")))
    }
    M = f.length > 0 && (f[0] !== u || f[1] !== p || f[2] !== g) && "referral" !== f[2]; 
    if (S || !S && M) {
        u = f[0] || u, p = f[1] || p; 
        g = f[2] || g, _ = f[3] || _; 
        if (i.length > 5) {
            e = parseInt(i[2], 10); 
            t = parseInt(i[4], 10); 
            l = parseInt((new Date).getTime() / 1e3); 
            s++, c = 1
        } else {
            s = 1, c = 1
        }
    } else {
        c++;
    }
    r || (r = genHash(lr.ckDomain));
    setCookie(lr.ckJda, [r, o, e, t, l, s || 1].join("."),lr.ckDomain, lr.ckJdaExp);
    setCookie(lr.ckJdb, [r, c, o + "|" + s, l].join("."), lr.ckDomain, lr.ckJdbExp);
    setCookie(lr.ckJdc, r, lr.ckDomain);
    if (w || M || n.length < 5) {
        var B = [r, u || "direct", p || "-", g || "none", _ || "-", (new Date).getTime()].join("|");
        setJdv(B = encodeURIComponent(B), r)
    }
    lr._mbaMuidSeq[0] = lr.uuid + "";
    lr._mbaMuidSeq[1] = "1";
    lr._mbaMuidSeq[2] = (new Date).getTime();
    setCookie(lr.ckmba_muid, encodeURI(lr._mbaMuidSeq.join(".")), lr.ckDomain, lr.ckmba_muidExp);
    return '__jda='.concat(cookies['__jda'].value).concat('; __jdb=').concat(cookies['__jdb'].value).concat('; __jdc=').concat(cookies['__jdc'].value).concat('; __jdv=').concat(cookies['__jdv'].value).concat('; mba_muid='.concat(cookies['mba_muid'].value));
}

console.log(getBaseCookie())

image-20230123203508410

最终将这段Cookie拼到自己的appck后面即可完成炸年兽的全部校验,下次可以直接写脚本喽。

image-20230123203714832