const l1liiii1 = require("https"), IliilIlI = require("axios"), iIl1llII = require("qs"), II11il11 = require("crypto-js"), iiliilll = require("base-64"), i111lii1 = require("node-rsa"), l1I11II1 = require("fs"), ilI1il = require("path"), { format: i1I1IlI1 } = require("date-fns"), Il1ii11 = require("./jdCookie.js"), { HttpsProxyAgent: IIIlIII1 } = require("https-proxy-agent"), l1ii1ii1 = require("tls"), lIl1ii = require("cheerio"), llillIi1 = require("yaml"), lIIII11l = require("url"), liIliiiI = require("./sendNotify"), iIl1111 = require("winston"), IIiI11l1 = require("events"), ilIiilII = new IIiI11l1(), { AbortController: li1Iil1 } = require("abort-controller"); let i1il1i1l = ["来晚了", "已发完", "参数缺失或无效", "超出活动计划时间", "奖品发送失败", "发放完", "全部被领取", "余额不足", "已结束", "活动已经结束", "未开始", "此京豆计划已经结束", "已经发完", "活动不存在"]; process.env.B_WX_STOP_KEYWORD ? process.env.B_WX_STOP_KEYWORD.split(/[@,&|]/).forEach(iII1i1Ii => i1il1i1l.push(iII1i1Ii)) : ""; let ill1iIl = ["京豆", "红包", "券", "再来一次", "客服"], IillIl11 = ["下单满", "签收后", "收到货后", "成功购买任意", "必须购买店铺内"]; process.env.B_WX_ADDRESS_STOP_KEYWORD ? process.env.B_WX_ADDRESS_STOP_KEYWORD.split(/[@,&|]/).forEach(l1liI => ill1iIl.push(l1liI)) : ""; process.env.B_WX_ADDRESS_STOP_KEYWORD_RULE ? process.env.B_WX_ADDRESS_STOP_KEYWORD_RULE.split(/[@,&|]/).forEach(I1I1liIi => IillIl11.push(I1I1liIi)) : ""; let ilIii1l1 = []; process.env.B_WX_WHITELIST ? process.env.B_WX_WHITELIST.split(/[@,&|]/).forEach(iI1I11iI => ilIii1l1.push(iI1I11iI.includes("-") ? iI1I11iI : iI1I11iI * 1)) : []; let ilIi1IiI = ["10052"]; process.env.B_WX_OPEN_CARD_TYPES ? process.env.B_WX_OPEN_CARD_TYPES.split(/[@,&|]/).forEach(ii1ili1l => ilIi1IiI.push(ii1ili1l)) : ""; const iIl1IlI1 = { "wxProxyEnable": parseInt(process.env.M_WX_PROXY_ENABLE || "2"), "wxProxyUrl": process.env.B_WX_PROXY_URL || "", "wxProxySmart": parseInt(process.env.M_WX_PROXY_SMART || "2"), "wxProxyInterval": parseInt(process.env.M_WX_PROXY_INTERVAL || 120), "wxProxyMode": parseInt(process.env.M_WX_PROXY_MODE || "1"), "wxProxyCheck": parseInt(process.env.M_WX_PROXY_CHECK || "1"), "proxyRegx": process.env.M_WX_PROXY_ENABLE_REGEXP ? process.env.M_WX_PROXY_ENABLE_REGEXP : "(Request failed with status code (403|407|493|429|497|500|502|503|504))|certificate|timeout|ECONNRESET|ECONNREFUSED|ETIMEDOUT|(tunneling socket could not be established)|(socket hang up)|(CONNECT response)|(socket disconnected)", "isvObfuscatorRetry": parseInt(process.env?.["M_WX_ISVOBFUSCATOR_RETRY"] || 1), "isvObfuscatorRetryWait": parseInt(process.env?.["M_WX_ISVOBFUSCATOR_RETRY_WAIT"] || 2), "notInitPinTokenRegx": /lorealjdcampaign-rc.isvjcloud.com|interaction/, "messageMasked": parseInt(process.env.M_WX_MESSAGE_MASKED || "2"), "messageSingle": parseInt(process.env.M_WX_MESSAGE_SINGLE || "2"), "addressUseNum": parseInt(process.env.M_WX_ADDRESS_USE_NUM || "0"), "saveAddressMode": parseInt(process.env.M_WX_SAVE_ADDRESS_MODE || "1"), "wxBlockRegx": process.env.M_WX_BLOCK_PIN_REGX || "", "wxEnableOtherEnv": parseInt(process.env.M_WX_ENABLE_OTHER_ENV || "1"), "timeoutDuration": parseInt(process.env.M_WX_TIMEOUT_DURATION || "30"), "reTryRegx": "(哎呀活动火爆,请稍后再试|活动太火爆了|活动过于火爆|服务器数据忙|奖品与您擦肩而过了哟)", "retryCount": parseInt(process.env.B_RETRY_COUNT || "20"), "proxyRetryCount": parseInt(process.env.B_PROXY_RETRY_COUNT || "5"), "immediatelyExit": parseInt(process.env.B_IMMEDIATE_EXIT || "0"), "showProxyRetryLog": parseInt(process.env.B_SHOW_PROXY_RETRY_LOG || "1"), "redisCacheEnable": parseInt(process.env.B_REDIS_CACHE_ENABLE || "2"), "redisUrl": process.env.B_REDIS || "", "logger": null, "logToFile": parseInt(process.env.B_LOG_TO_FILE || "2"), "stopKeywords": i1il1i1l, "addressStopKeywords": ill1iIl, "addressStopKeywordsRule": IillIl11, "wxWhitelist": ilIii1l1, "openCardTypes": ilIi1IiI }, iiIll1i = { "M_WX_PROXY_ENABLE": "wxProxyEnable", "M_WX_PROXY_URL": "wxProxyUrl", "M_WX_PROXY_SMART": "wxProxySmart", "M_WX_PROXY_INTERVAL": "wxProxyInterval", "M_WX_PROXY_MODE": "wxProxyMode", "M_WX_PROXY_CHECK": "wxProxyCheck", "M_WX_PROXY_ENABLE_REGEXP": "proxyRegx", "M_WX_ISVOBFUSCATOR_RETRY": "isvObfuscatorRetry", "M_WX_ISVOBFUSCATOR_RETRY_WAIT": "isvObfuscatorRetryWait", "M_WX_MESSAGE_MASKED": "messageMasked", "M_WX_MESSAGE_SINGLE": "messageSingle", "M_WX_ADDRESS_USE_NUM": "addressUseNum", "M_WX_SAVE_ADDRESS_MODE": "saveAddressMode", "M_WX_BLOCK_PIN_REGX": "wxBlockRegx", "M_WX_ENABLE_OTHER_ENV": "wxEnableOtherEnv", "M_WX_TIMEOUT_DURATION": "timeoutDuration", "M_WX_STOP_KEYWORD": "__stopKeywords__", "M_WX_ADDRESS_STOP_KEYWORD": "__addressStopKeywords__", "M_WX_ADDRESS_STOP_KEYWORD_RULE": "__addressStopKeywordsRule__", "M_WX_WHITELIST": "__wxWhitelist", "M_WX_OPEN_CARD_TYPES": "__openCardTypes__", "B_RETRY_COUNT": "retryCount", "B_PROXY_RETRY_COUNT": "proxyRetryCount", "B_SHOW_PROXY_RETRY_LOG": "showProxyRetryLog", "B_REDIS_CACHE_ENABLE": "redisCacheEnable", "B_REDIS": "redisUrl", "B_LOG_TO_FILE": "logToFile" }, iI111l1i = { "mode": __dirname.includes("bear"), "wxRunMode": parseInt(process.env.M_WX_RUN_MODE || "1"), "wxScheduledNotify": parseInt(process.env.M_WX_SCHEDULE || "1"), "apiToken": process.env.B_API_TOKEN ? process.env.B_API_TOKEN : "", "showDebugInfo": parseInt(process.env.M_WX_DEBUG_INFO || "2"), "hdbTypes": ["hdb-isv.isvjcloud.com", "jingyun-rc.isvjcloud.com"], "pushUserDetail": process.env.PUSH_USER_DETAIL || "", "pushTgBotToken": process.env.PUSH_TG_BOT_TOKEN || "", "scheduleTgBotToken": process.env.SCHEDULE_TG_BOT_TOKEN || "", "scheduleTgUserId": process.env.SCHEDULE_TG_USER_ID || "", "urlPrefixes": { "/prod/cc/interactsaas": /interactsaas/, "/crm-proya/apps/interact": /crm-proya/, "/apps/interac": /lorealjdcampaign-rc.isvjcloud.com\/prod\/cc/, "/prod/cc/cjwx": /lorealjdcampaign-rc.isvjcloud.com\/prod\/cc\/cjwx/, "/apps/interact": /lorealjdcampaign-rc.isvjcloud.com\/interact/, "/prod/cc/interaction/v1": /interaction\/v1/, "/prod/cc/interaction/v2": /interaction\/v2/ }, "jdAppTlsOptions": { "secureProtocol": "TLSv1_2_method", "ciphers": "TLS_GREASE 0x4a 0x4a:TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:TLS_RSA_WITH_AES_256_GCM_SHA384:TLS_RSA_WITH_AES_128_GCM_SHA256:TLS_RSA_WITH_AES_256_CBC_SHA:TLS_RSA_WITH_AES_128_CBC_SHA:TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:TLS_RSA_WITH_3DES_EDE_CBC_SHA" } }, iIliIIII = { "M_WX_RUN_MODE": "wxRunMode", "M_WX_SCHEDULE": "wxScheduledNotify", "B_API_TOKEN": "apiToken", "M_WX_DEBUG_INFO": "showDebugInfo", "PUSH_USER_DETAIL": "pushUserDetail", "PUSH_TG_BOT_TOKEN": "pushTgBotToken", "SCHEDULE_TG_BOT_TOKEN": "scheduleTgBotToken", "SCHEDULE_TG_USER_ID": "scheduleTgUserId" }; iI111l1i.mode && (iIl1IlI1.wxEnableOtherEnv = 2); let I1lli11i; try { I1lli11i = require("ioredis"); } catch (iI1lllI) { console.log("未安装redis依赖,禁用redis缓存"); iIl1IlI1.redisRequire = 2; } class iiiIIIll extends Error { constructor(liiliII1) { super(liiliII1); this.name = "customAssert"; } } class i1I1IiII extends Error { constructor(lI11II1) { super(lI11II1); this.name = "customStop"; } } class lllli1iI extends Error { constructor(IlilillI) { super(IlilillI); this.name = "Aborted"; } } function liI1l1II(...liliil) { const I1l1iiI = new Date(), I1ll1IIl = i1I1IlI1(I1l1iiI, "yyyy-MM-dd HH:mm:ss.SSS"), l1IliI1 = liliil.map(I1ll1iii => { if (I1ll1iii && I1ll1iii.constructor === Object) return JSON.stringify(I1ll1iii); return I1ll1iii; }); console.log(I1ll1IIl, ...l1IliI1); } function i1l1ilIl(II1Iliii = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx") { return II1Iliii.replace(/[xy]/g, function (iillil1i) { const lill1lI = 16 * Math.random() | 0, iiiiilli = "x" === iillil1i ? lill1lI : 3 & lill1lI | 8; return iiiiilli.toString(36); }); } class liiIIll { constructor(IiiIliI = {}) { const IliIII1 = iIl1111.format.printf(({ level: I1iil1ii, message: l1lllIl1, timestamp: lIll111I, tag: I1iliI1l }) => { const iIlilll = i1I1IlI1(lIll111I, "HH:mm:ss.SSS"), liI1l1i = 5, lii11lli = I1iil1ii.toUpperCase().padEnd(liI1l1i, " "); return iIlilll + "|" + lii11lli + "|" + l1lllIl1; }), IlIil1il = [new iIl1111.transports.Console()]; if (IiiIliI.logToFile) { const lil1IIl1 = IiiIliI.filename || i1I1IlI1(new Date(), "yyyy-MM-dd_HH-mm-ss"); IlIil1il.push(new iIl1111.transports.File({ "filename": "./logs/" + lil1IIl1 + ".log" })); } this.logger = iIl1111.createLogger({ "level": IiiIliI.level || "debug", "format": iIl1111.format.combine(iIl1111.format.timestamp(), IliIII1), "transports": IlIil1il }); ["error", "warn", "info", "debug"].forEach(IIi1lii => { this[IIi1lii] = (...lllIil1I) => { const lIi1i1I = lllIil1I.map(lll1l => { if (lll1l === undefined) return "undefined"; else { if (lll1l === null) { return "null"; } else { if (typeof lll1l === "object") return JSON.stringify(lll1l); else { return lll1l; } } } }).join(" "); this.logger.log(IIi1lii, lIi1i1I); }; }); } } class Iiii1li1 { static ["ivs"] = ["13.2", "13.5", "14.4", "15.1", "15.1.1", "15.2", "15.2.1", "15.3", "15.3.1", "15.4", "15.4.1", "15.5", "16.0", "16.1", "16.6", "16.6.1", "16.7", "17.0", "17.1", "17.1.2", "17.2", "17.3", "17.4", "17.5"]; static ["phones"] = [{ "model": "X", "screen": "1125*2436", "tf": "10,3", "ivsRange": [0, 17] }, { "model": "XS", "screen": "1125*2436", "tf": "11,2", "ivsRange": [0, 24] }, { "model": "XsMax", "screen": "1242*2688", "tf": "11,4", "ivsRange": [0, 24] }, { "model": "XR", "screen": "828*1792", "tf": "11,8", "ivsRange": [0, 24] }, { "model": "11", "screen": "828*1792", "tf": "12,1", "ivsRange": [0, 24] }, { "model": "11Pro", "screen": "1125*2436", "tf": "12,3", "ivsRange": [0, 24] }, { "model": "11ProMax", "screen": "1242*2688", "tf": "12,5", "ivsRange": [0, 24] }, { "model": "12", "screen": "1170*2532", "tf": "13,2", "ivsRange": [2, 24] }, { "model": "12Pro", "screen": "1170*2532", "tf": "13,3", "ivsRange": [2, 24] }, { "model": "12ProMax", "screen": "1284*2778", "tf": "13,4", "ivsRange": [2, 24] }, { "model": "13", "screen": "1170*2532", "tf": "14,5", "ivsRange": [3, 24] }, { "model": "13Pro", "screen": "1170*2532", "tf": "14,2", "ivsRange": [3, 24] }, { "model": "13ProMax", "screen": "1284*2778", "tf": "14,3", "ivsRange": [3, 24] }, { "model": "14", "screen": "1170*2532", "tf": "14,7", "ivsRange": [12, 24] }, { "model": "14Plus", "screen": "1284*2778", "tf": "14,8", "ivsRange": [12, 24] }, { "model": "14Pro", "screen": "1179*2556", "tf": "15,2", "ivsRange": [12, 24] }, { "model": "14ProMax", "screen": "1290*2796", "tf": "15,3", "ivsRange": [12, 24] }, { "model": "15", "screen": "1170*2532", "tf": "15,4", "ivsRange": [17, 24] }, { "model": "15Plus", "screen": "1179*2556", "tf": "15,5", "ivsRange": [17, 24] }, { "model": "15Pro", "screen": "1179*2556", "tf": "16,1", "ivsRange": [17, 24] }, { "model": "15ProMax", "screen": "1290*2796", "tf": "16,2", "ivsRange": [17, 24] }]; static ["generatePhoneInfo"](IiIliiIl = null) { const I1iII1ll = this.phones[Math.floor(Math.random() * this.phones.length)], i1l1IIiI = this.ivs.slice(I1iII1ll.ivsRange[0], I1iII1ll.ivsRange[1]), lii1II1I = i1l1IIiI[Math.floor(Math.random() * i1l1IIiI.length)], I1llIii = { "12.4.2": "169143", "12.4.3": "169159", "12.4.4": "169175", "12.6.0": "169204", "12.6.2": "169227" }, Iil1i = Object.keys(I1llIii), li1i111 = IiIliiIl === null ? Iil1i[Math.floor(Math.random() * Iil1i.length)] : IiIliiIl; return { "phone": I1iII1ll.model, "screen": I1iII1ll.screen, "tf": I1iII1ll.tf, "iv": lii1II1I, "clientVersion": li1i111, "build": I1llIii[li1i111], "uuid": i1l1ilIl() }; } } function i11IIIli(lIl11iIi, I1ll1llI, i1Il1lii) { const illiliI = ["B6dB3QqGZP1lKNICTaiAeNJSHKNepO5GGgtL6FUceqSlpFZCdx2SZ5MPPbzrgy91HeR0dnJazcMrvMgPF7bhFrfsGaApJKk4JohEEhoJ4kKJpAaGsfrFhb7FPgMvrMczaJnd0ReH19ygrzbPPM5ZS2xdCZFplSqecUF6LtgGG5OpeNKHSJNeAiaTCINKl1PZGqQ3Bd6B", "EUhzJoyKP7VydtpyBwNUGU2tqzI0QB0LIpQ10Fk3hX2ZcPoGRpACqmzcTQbKd98i3U7raFz2rMl2kys0ODgtAh22E3i57wmh38RbbR83hmw75i3E22hAtgDO0syk2lMr2zFar7U3i89dKbQTczmqCApRGoPcZ2Xh3kF01QpIL0BQ0Izqt2UGUNwByptdyV7PKyoJzhUE", "xexcHoyVwOs5TYTQVvU0iXn56ryKVdWedLTpq3KEKmbUHfwzuZjIpZOPVXMEappFhjdqwtp1bBrWaRBCfPFwCq2W8SsyvwqZ6sIGGIs6ZqwvysS8W2qCwFPfCBRaWrBb1ptwqdjhFppaEMXVPOZpIjZuzwfHUbmKEK3qpTLdeWdVKyr65nXi0UvVQTYT5sOwVyoHcxex", "2Llnegc5i4flqd4HZPFK210yh61boBxRSdnNVMeudKimx92Qi4aPuHP12HmEImbWrXjLgBGqy1bSnKvLhqMqhknyuse4nFoeLTkJJkTLeoFn4esuynkhqMqhLvKnSb1yqGBgLjXrWbmIEmH21PHuPa4iQ29xmiKdueMVNndSRxBob16hy012KFPZH4dqlf4i5cgenlL2", "dZzoMZF6xtt3voTFDbPzEZ7GeM8t7uY05d4K4xfhtdxELh96dDRB4oRYA2smET5dy1dafGkXOz2V7tNOVi0vSqfuhI99IKprVK6QQ6KVrpKI99IhufqSv0iVONt7V2zOXkGfad1yd5TEms2AYRo4BRDd69hLExdthfx4K4d50Yu7t8MeG7ZEzPbDFTov3ttx6FZMozZd", "SNYr3bWMtQulWZO2FEwuhSFp3EXPR1TujPRJwUFlxBh9Pvf2MeTEpR7a3dU6e9rNUMyBh2osDdK4Vdm4gZ0XcRCoHZPi2jiXT2dCCd2TXij2iPZHoCRcX0Zg4mdV4KdDso2hByMUNr9e6Ud3a7RpETeM2fvP9hBxlFUwJRPjuT1RPXE3pFShuwEF2OZWluQtMWb3rYNS", "4viQ2FrYHcrH44gqvPLo6KtiFu56AW1eXbDBZrBepzdLKE33Ey4TwFERnkVLnbHAXbKqAi0HFP9Eu7yg8WNlI7q2dvXGGiPaMbrBBrbMaPiGGXvd2q7IlNW8gy7uE9PFH0iAqKbXAHbnLVknREFwT4yE33EKLdzpeBrZBDbXe1WA65uFitK6oLPvqg44HrcHYrF2Qiv4", "0VIoSHBNVAW8De7NquFyEUm0o9xNnQJGn2OR1yOK9djWALhyP3a1XoQEwTnXuzypRuwsaLPUlertksOY6LYmnbQmPgdDQRXXKdKooKdKXXRQDdgPmQbnmYL6YOsktrelUPLaswuRpyzuXnTwEQoX1a3PyhLAWjd9KOy1RO2nGJQnNx9o0mUEyFuqN7eD8WAVNBHSoIV0", "fdJPBiTra9E0qg2HJrobeEC2SkOfSzbw6nG5J5ACx42GQDBsCyGfxNlHHYhl7EmkdvYaKAXUVXSKcTT1KhyYaj9Q4YtyhnOA7cLrrLc7AOnhytY4Q9jaYyhK1TTcKSXVUXAKaYvdkmE7lhYHHlNxfGyCsBDQG24xCA5J5Gn6wbzSfOkS2CEeborJH2gq0E9arTiBPJdf", "kLOA93PyUOX3QdlLuZ9JgNq1peyIITAQSnKzuLBZ2NthOSseAJMGCecvSLVKAww61Y31hJ4l7kAOcjLmtqQNJlNyJb5yu9d9vqWUUWqv9d9uy5bJyNlJNQqtmLjcOAk7l4Jh13Y16wwAKVLSvceCGMJAesSOhtN2ZBLuzKnSQATIIyep1qNgJ9ZuLldQ3XOUyP39AOLk"]; function lI1I11il(iilIlli1) { iilIlli1 = iilIlli1.split("").reverse().join(""); const liiIl1I = new Uint8Array(12), IlIlil1I = new TextEncoder().encode(iilIlli1); for (let iiiIi1ii = 0; iiiIi1ii < IlIlil1I.length; iiiIi1ii += 2) { let lii1il1i = IlIlil1I[iiiIi1ii] << 5 | IlIlil1I[iiiIi1ii + 1] & 255; lii1il1i %= 63; liiIl1I[iiiIi1ii >> 1] = lii1il1i; } let iIiiIIl1 = ""; for (let llill1ll = 0; llill1ll < liiIl1I.length; llill1ll++) { iIiiIIl1 += (liiIl1I[llill1ll] + 256).toString(2).slice(1); } let il11IllI = "", Il1l111 = ""; for (let II111iil = 0; II111iil < 16; II111iil++) { if (II111iil !== 0) { const ililllll = II111iil * 6, iIIIiIl = iIiiIIl1.substring(ililllll, ililllll + 6); let I11iIii1 = parseInt(iIIIiIl, 2); const liiI1llI = Il1l111.split(""); for (let iI1iiIIi = 0; iI1iiIIi < liiI1llI.length; iI1iiIIi++) { liiI1llI[iI1iiIIi] === "1" && (I11iIii1 = (I11iIii1 >> 6 - iI1iiIIi | I11iIii1 << iI1iiIIi) & 63); } Il1l111 = (I11iIii1 & 63).toString(2).padStart(6, "0"); } else Il1l111 = iIiiIIl1.substring(0, 6); il11IllI += Il1l111; } for (let Il1lIlII = 0; Il1lIlII < 12; Il1lIlII++) { const lilii1I1 = Il1lIlII * 8; liiIl1I[Il1lIlII] = parseInt(il11IllI.substring(lilii1I1, lilii1I1 + 8), 2); } const iilIi1li = btoa(String.fromCharCode.apply(null, liiIl1I)); return iilIi1li; } let I1illil1 = Date.now() + parseInt(i1Il1lii); typeof lIl11iIi != "object" && (lIl11iIi = JSON.parse(lIl11iIi)); lIl11iIi.nowTime = I1illil1; let liiiiIil = I1ll1llI + I1illil1; const l1llllI1 = liiiiIil.substring(0, liiiiIil.length - 5); let il1iI1l = ""; for (let l1111ilI = 0; l1111ilI < l1llllI1.length; l1111ilI++) { let IIi1Iii = l1llllI1.charCodeAt(l1111ilI), I1i1I = IIi1Iii % 10, llili1 = illiliI[I1i1I][l1111ilI]; il1iI1l += llili1; } var iilIlill = il1iI1l.length, lIi1lIII = Math.floor(iilIlill / 24), i11llil1 = ""; for (var ll1iIiI1 = 0; ll1iIiI1 < 24; ll1iIiI1++) { var lIllIll1 = (ll1iIiI1 + 1) * lIi1lIII; if (ll1iIiI1 === 23) { lIllIll1 = iilIlill; } var lllIilIl = il1iI1l.substring(ll1iIiI1 * lIi1lIII, lIllIll1), IiIii111 = []; for (var llii11I1 = 0; llii11I1 < lllIilIl.length; llii11I1++) { IiIii111.push(lllIilIl.charCodeAt(llii11I1)); } var IIiiiil1 = IiIii111.reduce(function (iliiliIl, I1iiIiIi) { return iliiliIl + I1iiIiIi; }, 0), Iil11Iii = Math.floor(IIiiiil1 / IiIii111.length); i11llil1 += String.fromCharCode(Iil11Iii); } il1iI1l = i11llil1; const llI1iI1l = lI1I11il(il1iI1l), i11I1lli = II11il11.enc.Utf8.parse(llI1iI1l), illli111 = II11il11.enc.Utf8.parse(""), iIIii1l = II11il11.AES.encrypt(JSON.stringify(lIl11iIi), i11I1lli, { "iv": illli111, "mode": II11il11.mode.ECB, "padding": II11il11.pad.Pkcs7 }); return iIIii1l.toString(); } function I1II1lIl(Iil1i1I1 = {}) { const l1ili1I = { "method": "get", "timeout": 30000 }, iIlI111I = Object.assign({}, l1ili1I, Iil1i1I1), Iil11ilI = IliilIlI.CancelToken.source(), llII1i11 = iIlI111I.timeout || 20000, IiI11li1 = setTimeout(() => { Iil11ilI.cancel("Request canceled due to timeout (" + llII1i11 + " ms)"); }, llII1i11); return IliilIlI({ ...iIlI111I, "cancelToken": Iil11ilI.token }).then(liIii1Ii => { return clearTimeout(IiI11li1), liIii1Ii; }).catch(l1i1lI1 => { clearTimeout(IiI11li1); throw l1i1lI1; }); } function II1li1II(ll11ilii) { if (ll11ilii.proxy) { const IIIlII1I = new IIIlIII1(ll11ilii.proxy), l11llil1 = IIIlII1I.addRequest; return IIIlII1I.addRequest = function (ilI1ii, iIll1II1, lI11II1l) { return Object.assign(iIll1II1, ll11ilii.tlsOptions, { "ciphers": ll11ilii.tlsOptions?.["ciphers"] || l1ii1ii1.DEFAULT_CIPHERS }), l11llil1.call(this, ilI1ii, iIll1II1, lI11II1l); }, IIIlII1I; } const II1iIl11 = new l1liiii1.Agent({ ...ll11ilii.tlsOptions, "ciphers": ll11ilii.tlsOptions?.["ciphers"] || l1ii1ii1.DEFAULT_CIPHERS }); return II1iIl11; } class l11i111 { constructor(ll1lIi1i, lI11Ii1) { this.ua = ll1lIi1i; this.pin = lI11Ii1; this.av = ll1lIi1i.slice(ll1lIi1i.indexOf("/") + 1); this.sua = ll1lIi1i.substring(ll1lIi1i.indexOf("(") + 1, ll1lIi1i.indexOf(")")); this.random = this.#randomString(10, true); this.cacheInfo = {}; } #getRandomString(iIil1Iii, IlliilIi) { let iiIiIiIi = "", lllili1i = iIil1Iii.split(""); for (let IIilllI = 0; IIilllI < IlliilIi; IIilllI++) { let liI1IiIl = Math.floor(Math.random() * lllili1i.length); iiIiIiIi += lllili1i[liI1IiIl]; } return iiIiIiIi; } #randomString(lillIlll, iiIliIl1) { var Illiil1I = "", l1I1iiil = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; for (var liIl1ii1 = 0; liIl1ii1 < lillIlll; liIl1ii1++) { var lIli11lI = l1I1iiil; liIl1ii1 === 0 && iiIliIl1 && (lIli11lI = l1I1iiil.slice(1)); var l11li11I = Math.round(Math.random() * (lIli11lI.length - 1)); Illiil1I += lIli11lI.substring(l11li11I, l11li11I + 1); } return Illiil1I; } #generateFp(ii1ii11I) { let iIll1liI = 3, iIiIlili = "0123456789", IIilIili = 12; if (ii1ii11I === "4.4") iIll1liI = 4, iIiIlili = "1uct6d0jhq", IIilIili = 11; else { if (ii1ii11I === "4.3") { iIll1liI = 3; iIiIlili = "kl9i1uct6d"; IIilIili = 12; } else { if (ii1ii11I == "4.2") iIll1liI = 4, iIiIlili = "6d0jhqw3pa", IIilIili = 11; else ii1ii11I == "4.1" && (iIll1liI = 6, iIiIlili = "uct6d0jhqw", IIilIili = 9); } } let iilIl1ii, iiil1Iii = ""; do { iilIl1ii = this.#getRandomString(iIiIlili, 1); iiil1Iii.indexOf(iilIl1ii) == -1 && (iiil1Iii += iilIl1ii); } while (iiil1Iii.length < iIll1liI); for (let l1IiiIi of iiil1Iii.slice()) { iIiIlili = iIiIlili.replace(l1IiiIi, ""); } let li11iliI = Math.floor(Math.random() * 10), IilIi1Il = this.#getRandomString(iIiIlili, li11iliI) + iiil1Iii + this.#getRandomString(iIiIlili, IIilIili - li11iliI) + li11iliI, lII11i1I = IilIi1Il.split(""), IliII11; if (ii1ii11I === "4.4") { let IlIiiI1i = lII11i1I.slice(0, 8), lli1li11 = lII11i1I.slice(8), i1iIilIi = IlIiiI1i.reverse(); IliII11 = i1iIilIi.map(i11Iil1i => (35 - parseInt(i11Iil1i, 36)).toString(36)); IliII11.push(...lli1li11); } else { if (ii1ii11I === "4.3") { let IiIlI1il = lII11i1I.slice(0, 10), l1Iill1I = lII11i1I.slice(10), lIlll1II = IiIlI1il.reverse(); IliII11 = lIlll1II.map(llIiII1I => (35 - parseInt(llIiII1I, 36)).toString(36)); IliII11.push(...l1Iill1I); } else { if (ii1ii11I === "4.1" || ii1ii11I === "4.2") { let l1iIl11l = lII11i1I.slice(0, 14), li1iill = lII11i1I.slice(14), IlllIlll = l1iIl11l.reverse(); IliII11 = IlllIlll.map(ilIll1Il => (35 - parseInt(ilIll1Il, 36)).toString(36)); IliII11.push(...li1iill); } else IliII11 = lII11i1I.reverse().map(IIii11ll => 9 - parseInt(IIii11ll)); } } let IiIIlIl1 = IliII11.join(""); return IiIIlIl1; } #generateExpandParams(iii11ili, IIl1ii11, lli11li1) { let i1IiiiIl = {}; if (lli11li1 === "4.4") i1IiiiIl = { "wc": 0, "wd": 0, "l": "zh-CN", "ls": "zh-CN,zh,zh-TW,en-US,en", "ml": 0, "pl": 0, "av": this.av, "ua": this.ua, "sua": this.sua, "pp": { "p1": this.pin, "p2": this.pin }, "extend": { "wd": 0, "l": 0, "ls": 0, "wk": 0, "bu1": "0.1.9", "bu2": 0, "bu3": 16, "bu4": 0, "bu5": 0 }, "pp1": "", "bu1": "", "w": 390, "h": 844, "ow": 390, "oh": 844, "url": "", "og": "", "pr": 1.25, "re": "h", "random": this.random, "referer": "", "v": "h5_file_v4.4.0", "ai": iii11ili, "fp": IIl1ii11 }; else { if (lli11li1 === "4.3") { i1IiiiIl = { "wc": 0, "wd": 0, "l": "zh-CN", "ls": "zh-CN,zh,zh-TW,en-US,en", "ml": 0, "pl": 0, "av": this.av, "ua": this.ua, "sua": this.sua, "pp": { "p2": this.pin }, "extend": { "wd": 0, "l": 0, "ls": 0, "wk": 0, "bu1": "0.1.7", "bu2": 0, "bu3": 35 }, "pp1": "", "w": 400, "h": 700, "ow": 400, "oh": 700, "url": "", "og": "", "pr": 1.25, "re": "", "random": this.random, "referer": "", "v": "h5_file_v4.3.1", "ai": iii11ili, "fp": IIl1ii11 }; } else { if (lli11li1 === "4.2") i1IiiiIl = { "wc": 0, "wd": 0, "l": "zh-CN", "ls": "zh-CN", "ml": 0, "pl": 0, "av": this.av, "ua": this.ua, "sua": this.sua, "pp": {}, "extend": { "pm": 0, "wd": 0, "l": 0, "ls": 0, "wk": 0, "bu1": "0.1.9" }, "pp1": "", "pm": { "ps": "prompt", "np": "default" }, "w": 390, "h": 844, "ow": 390, "oh": 844, "url": "", "og": "", "pr": 1.25, "re": "", "random": this.random, "referer": "", "v": "h5_file_v4.2.0", "ai": iii11ili, "fp": IIl1ii11 }; else lli11li1 === "4.1" ? i1IiiiIl = { "wc": 0, "wd": 0, "l": "zh-CN", "ls": "zh-CN,zh,zh-TW,en-US,en", "ml": 0, "pl": 0, "av": this.av, "ua": this.ua, "sua": this.sua, "pp": { "p2": this.pin }, "pp1": "", "pm": { "ps": "prompt", "np": "default" }, "w": 360, "h": 740, "ow": 360, "oh": 740, "url": "", "og": "", "pr": 4, "re": "", "random": this.random, "referer": "", "v": "v0.1.6", "ai": iii11ili, "fp": IIl1ii11 } : i1IiiiIl = { "wc": 0, "wd": 0, "l": "zh-CN", "ls": "zh-CN,zh,zh-TW,en-US,en", "ml": 0, "pl": 0, "av": this.av, "ua": this.ua, "sua": this.sua, "pp": { "p2": this.pin }, "pp1": "", "pm": { "ps": "prompt", "np": "default" }, "w": 360, "h": 740, "ow": 360, "oh": 740, "url": "", "og": "", "pr": 4, "re": "", "ai": iii11ili, "fp": IIl1ii11 }; } } return II11il11.AES.encrypt(JSON.stringify(i1IiiiIl, null, 2), II11il11.enc.Utf8.parse("wm0!@w-s#ll1flo("), { "iv": II11il11.enc.Utf8.parse("0102030405060708"), "mode": II11il11.mode.CBC, "padding": II11il11.pad.Pkcs7 }).ciphertext.toString(II11il11.enc.Hex); } async #getAlgo(II1iil1i, IIiiI11, ii1I1Iii, i1llIlIi, lliiIlii = 0) { let Ii1llIII = "", llll1ili = { "version": i1llIlIi, "fp": IIiiI11, "fv": "v3.2.0", "appId": II1iil1i, "timestamp": Date.now(), "platform": "web", "expandParams": ii1I1Iii }; if (i1llIlIi === "4.4") llll1ili.fv = "h5_file_v4.4.0"; else { if (i1llIlIi === "4.3") llll1ili.fv = "h5_file_v4.3.1"; else { if (i1llIlIi === "4.2") llll1ili.fv = "h5_file_v4.2.0"; else i1llIlIi === "4.1" && (llll1ili.fv = "v1.6.1"); } } try { let IIll1l1 = await IliilIlI({ "url": "https://cactus.jd.com/request_algo?g_ty=ajax", "method": "post", "data": llll1ili, "headers": { "User-Agent": this.ua } }); if (IIll1l1.status == 200) { let iIIllI1I = IIll1l1.data.data.result; Ii1llIII = { "tk": iIIllI1I.tk, "fp": iIIllI1I.fp, "rd": /(?<=rd=')[^']*/.exec(iIIllI1I.algo)[0], "algo": /(?<=algo\.)[^(]*/.exec(iIIllI1I.algo)[0] }; } return Ii1llIII; } catch (i11lili) { console.log("algo error"); if (lliiIlii < 3) { return this.#getAlgo(II1iil1i, IIiiI11, ii1I1Iii, i1llIlIi, lliiIlii + 1); } throw i11lili; } } #test(li1ii1ll, I1i1l111, ll11lIiI, Iiii11l1, I1ilI1, iiilIilI, lIliIli) { let l1lilill = lIliIli === "4.4" ? "88" : lIliIli === "4.3" ? "22" : lIliIli === "4.2" ? "74" : lIliIli === "4.1" ? "04" : "", ili1i1li = "" + I1i1l111 + li1ii1ll + ll11lIiI + l1lilill + Iiii11l1 + I1ilI1; return II11il11[iiilIilI](ili1i1li, I1i1l111).toString(II11il11.enc.Hex); } async ["encrypt"](Iil1li1, llIllilI, il1lllIi, lIiIi1l1, IIi1I1ii, l1iIIiI, l11lIiIl, ill1iIIl) { if (!(Iil1li1 in this.cacheInfo)) { let iiii11iI = this.#generateFp(ill1iIIl); const iIilIl1 = this.#generateExpandParams(Iil1li1, iiii11iI, ill1iIIl); let iIlI11I1 = 0, iiIiIi1l; while (iIlI11I1 < 3) { iiIiIi1l = await this.#getAlgo(Iil1li1, iiii11iI, iIilIl1, ill1iIIl); if (iiIiIi1l !== "") break; iIlI11I1++; } this.cacheInfo[Iil1li1] = iiIiIi1l; } const { tk: I11iII1, rd: lii11lll, fp: lI11I1i, algo: lI1i1l } = this.cacheInfo[Iil1li1], ll111i11 = new Date(), I1i1i1I1 = i1I1IlI1(ll111i11, "yyyyMMddHHmmssSSS"), li1IIIli = this.#test(lI11I1i, I11iII1, I1i1i1I1, Iil1li1, lii11lll, lI1i1l, ill1iIIl), iiiI11lI = typeof il1lllIi == "object" ? JSON.stringify(il1lllIi) : il1lllIi, IlliI1i1 = II11il11.SHA256(iiiI11lI).toString(II11il11.enc.Hex); let iIli1ii1 = "appid:" + lIiIi1l1 + "&body:" + IlliI1i1; IIi1I1ii != null && (iIli1ii1 += "&client:" + IIi1I1ii); l1iIIiI != null && (iIli1ii1 += "&clientVersion:" + l1iIIiI); iIli1ii1 += "&functionId:" + llIllilI; l11lIiIl != null && (iIli1ii1 += "&t:" + l11lIiIl); let lIIIliI1, IiI1lI1i, IilIl1i1; if (ill1iIIl === "4.4") IiI1lI1i = { "sua": this.sua, "pp": { "p1": this.pin }, "extend": { "wd": 0, "l": 0, "ls": 0, "wk": 0, "bu1": "0.1.9", "bu2": -1, "bu3": 15, "bu4": 0, "bu5": 0 }, "random": this.random, "v": "h5_file_v4.4.0", "fp": lI11I1i, "bu1": "0.1.9" }, IilIl1i1 = "r1T.6Vinpb.k+/a)", lIIIliI1 = II11il11.MD5("" + li1IIIli + iIli1ii1 + li1IIIli).toString(II11il11.enc.Hex); else { if (ill1iIIl === "4.3") lIIIliI1 = II11il11.HmacSHA256(iIli1ii1, li1IIIli).toString(II11il11.enc.Hex), IiI1lI1i = { "sua": this.sua, "pp": { "p2": this.pin }, "extend": { "wd": 0, "l": 0, "ls": 0, "wk": 0, "bu1": "0.1.7", "bu2": 0, "bu3": 33 }, "random": this.random, "referer": "", "v": "h5_file_v4.3.1", "fp": lI11I1i }, IilIl1i1 = "&d74&yWoV.EYbWbZ"; else { if (ill1iIIl === "4.2") lIIIliI1 = II11il11.SHA256("" + li1IIIli + iIli1ii1 + li1IIIli).toString(II11il11.enc.Hex), IiI1lI1i = { "sua": this.sua, "pp": { "p2": this.pin }, "extend": { "pm": 0, "wd": 0, "l": 0, "ls": 0, "wk": 0, "bu1": "0.1.9" }, "random": this.random, "referer": "", "v": "h5_file_v4.2.0", "fp": lI11I1i }, IilIl1i1 = "DNiHi703B0&17hh1"; else ill1iIIl === "4.1" ? (lIIIliI1 = II11il11.MD5("" + li1IIIli + iIli1ii1 + li1IIIli).toString(II11il11.enc.Hex), IiI1lI1i = { "sua": this.sua, "pp": { "p2": this.pin }, "random": this.random, "referer": "", "v": "v0.1.6", "fp": lI11I1i }, IilIl1i1 = "HL4|FW#Chc3#q?0)") : (lIIIliI1 = II11il11.HmacSHA256(iIli1ii1, li1IIIli).toString(II11il11.enc.Hex), IiI1lI1i = { "sua": this.sua, "pp": { "p1": this.pin }, "fp": lI11I1i }, IilIl1i1 = "wm0!@w_s#ll1flo("); } } const li1i1lii = II11il11.AES.encrypt(JSON.stringify(IiI1lI1i, null, 2), II11il11.enc.Utf8.parse(IilIl1i1), { "iv": II11il11.enc.Utf8.parse("0102030405060708"), "mode": II11il11.mode.CBC, "padding": II11il11.pad.Pkcs7 }).ciphertext.toString(II11il11.enc.Hex), l1iiiIIl = I1i1i1I1 + ";" + lI11I1i + ";" + Iil1li1 + ";" + I11iII1 + ";" + lIIIliI1 + ";" + ill1iIIl + ";" + ll111i11.getTime() + ";" + li1i1lii; let II11iIl1 = { "functionId": llIllilI, "body": iiiI11lI, "appid": lIiIi1l1, "client": IIi1I1ii, "clientVersion": l1iIIiI, "h5st": l1iiiIIl, "t": l11lIiIl }; return l11lIiIl == null && delete II11iIl1.t, IIi1I1ii == null && delete II11iIl1.client, l1iIIiI == null && delete II11iIl1.clientVersion, II11iIl1; } } class i1l1iil { constructor() { } static #get_uuid(I1Iii1iI = 40) { if (I1Iii1iI === 0) return "0"; else { const llll1il = this.#get_uuid(I1Iii1iI - 1).replace(/^0+/, ""), iiiiIII = "0123456789abcdef"; return llll1il + iiiiIII[Math.floor(Math.random() * (iiiiIII.length - 6))]; } } static #_md5(i1lI1i) { const llIllIll = II11il11.MD5(i1lI1i); return llIllIll.toString(II11il11.enc.Hex); } static #sub_v2(iliIl1) { const iI1l1llI = [55, 146, 68, 104, 165, 61, 204, 127, 187, 15, 217, 136, 238, 154, 233, 90], i111llI1 = Buffer.from("80306f4370b39fd5630ad0529f77adb6", "utf-8"); let iIIlilIi = new Array(i111llI1.length).fill(0); for (let II1Il11 in iliIl1) { let l1I11I1 = Number(iliIl1[II1Il11]), ilIIII1I = iI1l1llI[II1Il11 & 15], lilil1l = Number(i111llI1[II1Il11 & 7]); l1I11I1 = ilIIII1I ^ l1I11I1; l1I11I1 = l1I11I1 ^ lilil1l; l1I11I1 = l1I11I1 + ilIIII1I; ilIIII1I = ilIIII1I ^ l1I11I1; let ii11l1li = Number(i111llI1[II1Il11 & 7]); ilIIII1I = ilIIII1I ^ ii11l1li; iIIlilIi[II1Il11] = ilIIII1I & 255; } return iIIlilIi; } static #getSign(il111i11, l1IIlI, lii1l11I, l11Il1l1, lIiiIII) { let llli1Ii = Date.now().toString(), lll1IIIl = [[0, 2], [1, 1], [2, 0]], ii11il1l = lll1IIIl[Math.floor(Math.random() * lll1IIIl.length)], l1lllIi1 = "1" + ii11il1l[0] + ii11il1l[1], l11Iii1l = "functionId=" + il111i11 + "&body=" + l1IIlI + "&openudid=" + lii1l11I + "&client=" + l11Il1l1 + "&clientVersion=" + lIiiIII + "&st=" + llli1Ii + "&sv=" + l1lllIi1, IIl11Ill = this.#sub_v2(Buffer.from(l11Iii1l, "utf-8")), I1li1IIl = this.#_md5(Buffer.from(IIl11Ill).toString("base64")); return [llli1Ii, l1lllIi1, I1li1IIl]; } static ["getSignData"](iiI1I11i, iI1lll11, l1li1II1) { iI1lll11 = JSON.stringify(iI1lll11); const { screen: ilil1lII, tf: i1iiii1I, iv: iIiiI1iI, clientVersion: IIIiI1II, build: iIi1ll1i, uuid: Ii1Ii1II } = l1li1II1; let lI1Il1ll = "apple", llliliii = this.#getSign(iiI1I11i, iI1lll11, Ii1Ii1II, lI1Il1ll, IIIiI1II), lillilil = llliliii[0], IliIIi1I = llliliii[1], iIi1I1Ii = llliliii[2]; const lI1ll11i = { "hdid": "JM9F1ywUPwflvMIpYPok0tt5k9kW4ArJEU3lfLhxBqw=", "ts": Math.floor(Date.now() / 1000), "ridx": -1, "cipher": { "screen": this.#base64Encode(ilil1lII), "uuid": this.#base64Encode(Ii1Ii1II), "osVersion": this.#base64Encode(iIiiI1iI), "openudid": this.#base64Encode(Ii1Ii1II), "area": this.#base64Encode(this.#generateRandomString(2, "123456789") + "_" + this.#generateRandomString(4, "123456789") + "_" + this.#generateRandomString(4, "123456789") + "_" + this.#generateRandomString(4, "123456789")) }, "ciphertype": 5, "version": "1.0.3", "appname": "com.360buy.jdmobile" }, lIi1lIi = "eidAd71c8121f9s8+" + this.#generateRandomString(20) + "fqJmY9A07YRSnQkMEOU2Z7Jq3GnZeeGG0FqhUU0MoA1PiifL5yWcPJxtp1Cb/b/GsK0GqxuDyDfYZx6"; return { "functionId": iiI1I11i, "body": iI1lll11, "build": iIi1ll1i, "client": lI1Il1ll, "clientVersion": IIIiI1II, "d_brand": "apple", "d_model": "iPhone" + i1iiii1I, "st": lillilil, "sv": IliIIi1I, "sign": iIi1I1Ii, "ef": 1, "ep": JSON.stringify(lI1ll11i), "eid": lIi1lIi, "joycious": 73, "partner": "apple", "lang": "zh_CN", "networkType": "wifi", "networklibtype": "JDNetworkBaseAF", "ext": JSON.stringify({ "prstate": "0", "pvcStu": "1" }), "uemps": "0-0-2" }; } static #generateRandomString(l1iII1ll, lIliIili = null) { const il11I1Il = lIliIili == null ? "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" : lIliIili; let I1ii1ilI = ""; for (let llliiIll = 0; llliiIll < l1iII1ll; llliiIll++) { const IIiilIil = Math.floor(Math.random() * il11I1Il.length); I1ii1ilI += il11I1Il.charAt(IIiilIil); } return I1ii1ilI; } static #base64Encode(i11Ii1Il) { const i1i111I = "KLMNOPQRSTABCDEFGHIJUVWXYZabcdopqrstuvwxefghijklmnyz0123456789+/", li1I1lIl = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", lliliiIi = iiliilll.encode(i11Ii1Il), liilIII = lliliiIi.split("").map(II1llI1l => { const i1I1lIll = i1i111I.indexOf(II1llI1l); return i1I1lIll !== -1 ? li1I1lIl[i1I1lIll] : II1llI1l; }).join(""); return liilIII; } } class I11I1l1I { constructor(lIIlIlII) { const lllii1ii = { ...lIIlIlII, "retryStrategy"(iIli111I) { return null; }, "maxRetriesPerRequest": 1 }; this.redis = new I1lli11i(lllii1ii); this.expiryCache = new Set(); this.redis.on("error", il111ilI => { iIl1IlI1.redisConnect = 2; }); this.connected = new Promise((Illl1, iIii1i1I) => { this.redis.on("ready", Illl1); this.redis.on("error", Illl1); }); } async ["set"](Il11I11i, iilillil, i11ilIIi) { if (i11ilIIi) { await this.redis.set(Il11I11i, iilillil, "EX", i11ilIIi); } else { await this.redis.set(Il11I11i, iilillil); } } async ["get"](liIliiIi) { return await this.redis.get(liIliiIi); } async ["del"](ilIi1llI) { return await this.redis.del(ilIi1llI); } async ["exists"](lII1Ii1) { return await this.redis.exists(lII1Ii1); } async ["incr"](lllili1) { return await this.redis.incr(lllili1); } async ["decr"](lI11l1il) { return await this.redis.decr(lI11l1il); } async ["expire"](iilIIlI1, l1i1liii) { return await this.redis.expire(iilIIlI1, l1i1liii); } async ["ttl"](IIIIi1lI) { return await this.redis.ttl(IIIIi1lI); } async ["hset"](iiIIIIIi, iIlli111, iIIiil1l) { return await this.redis.hset(iiIIIIIi, iIlli111, iIIiil1l); } async ["hget"](lll1IlII, lilll1li) { return await this.redis.hget(lll1IlII, lilll1li); } async ["hdel"](il1i1lli, lI1liIiI) { return await this.redis.hdel(il1i1lli, lI1liIiI); } async ["hgetall"](i11illii) { return await this.redis.hgetall(i11illii); } async ["rpush"](I11IIliI, iIlI1II1) { return await this.redis.rpush(I11IIliI, iIlI1II1); } async ["lpush"](I11iIlIi, l1lIi11) { return await this.redis.lpush(I11iIlIi, l1lIi11); } async ["lpop"](i1II) { return await this.redis.lpop(i1II); } async ["rpop"](I1lIi1ll) { return await this.redis.rpop(I1lIi1ll); } async ["lrange"](I1I1l1I1, Ill1iili, IIi1) { return await this.redis.lrange(I1I1l1I1, Ill1iili, IIi1); } async ["llen"](i1li1iiI) { return await this.redis.llen(i1li1iiI); } async ["quit"]() { return await this.redis.quit(); } async ["sadd"](iii1l1ii, il11i11l, liI1iii1) { const iIiIlIi1 = await this.redis.sadd(iii1l1ii, il11i11l); return liI1iii1 && !this.expiryCache.has(iii1l1ii) && (await this.redis.expire(iii1l1ii, liI1iii1), this.expiryCache.add(iii1l1ii)), iIiIlIi1; } async ["sismember"](iIlIiIII, l11Il1Ii) { return await this.redis.sismember(iIlIiIII, l11Il1Ii); } } class IlIIlIli { static ["activity"] = {}; static ["msg"] = []; static ["proxyIp"] = null; static ["proxyIpTime"] = null; static ["addressList"] = []; static ["isSaveAddress"] = false; static ["redis"] = null; constructor(II1IlI1I, iliIIIi1) { Object.assign(this, Iii1iI1i.activity); this.cookie = iliIIIi1; this.savedCookies = {}; this.ticket = ""; this.index = II1IlI1I; this.pin = this.userPin(iliIIIi1); this.remarks = ""; this.tg_id = ""; this.address = null; this.phoneInfo = Iiii1li1.generatePhoneInfo(); this.ua = this.userAgent(); this.headers = { "Cookie": iliIIIi1, "User-Agent": this.ua.app }; this.retryCount = iIl1IlI1.retryCount; this.proxyRetryCount = iIl1IlI1.proxyRetryCount; this.proxyIp = ""; this.proxyIpTime = null; this.lzkjOpenCard = false; this.addressInit(); this.defenseUrls = []; this.sendMsg = []; this.prizeList = []; this.canNotOpenCard = false; this.needHelp = true; this.canHelp = true; this.isUse = false; this.isInviter = false; this.onlyInvite = false; this.openCardTypes = iIl1IlI1.openCardTypes; this.otherHeaders = {}; this.h5st = new l11i111(this.headers["User-Agent"], this.pin); } ["reseInviteStatus"]() { this.isUse = false; this.canHelp = true; } ["reseCookieStatus"]() { this.canHelp = false; this.needHelp = false; this.isUse = true; } ["reseInveterStatus"]() { this.isInviter = false; } ["getActivityId"](l1iII11 = this.activityUrl) { const liIi1Il1 = new URLSearchParams(new URL(l1iII11).search), IIIll1li = ["activityId", "giftId", "actId", "token", "code", "a", "id"]; let i1Iillil = ""; for (let I1iIlIIi of IIIll1li) { i1Iillil = liIi1Il1.get(I1iIlIIi); if (i1Iillil) break; } return !i1Iillil && (i1Iillil = this.match(/\/(dz[a-zA-Z0-9]{28,32})/, l1iII11)), this.activityId = i1Iillil, this.activityId; } ["log"](...I1Il1lI) { iIl1IlI1.logger.info("main |" + ("" + (this.index + 1)).padEnd(Iii1iI1i.paddedStringEndCount, " ") + "|" + (this.remarks || this.pin) + "|", ...I1Il1lI); } ["debug"](...lI1illiI) { iIl1IlI1.logger.debug("main |" + ("" + (this.index + 1)).padEnd(Iii1iI1i.paddedStringEndCount, " ") + "|" + (this.remarks || this.pin) + "|", ...lI1illiI); } ["error"](...I11I1) { iIl1IlI1.logger.error("main |" + ("" + (this.index + 1)).padEnd(Iii1iI1i.paddedStringEndCount, " ") + "|" + (this.remarks || this.pin) + "|", ...I11I1); } ["warn"](...l1i11II1) { iIl1IlI1.logger.warn("main |" + ("" + (this.index + 1)).padEnd(Iii1iI1i.paddedStringEndCount, " ") + "|" + (this.remarks || this.pin) + "|", ...l1i11II1); } ["putMsg"](iIIi1l1l, il1IlIl1 = false) { if (!iIIi1l1l) return; iIIi1l1l += ""; this.log(iIIi1l1l); let illi1iii = [ [" ", ""], ["豆", "豆💰"], ["红包", "红包🧧"], ["E卡", "E卡💎"], ["优惠券", "券"], ["东券", "券"], ["店铺", ""], ["恭喜", ""], ["获得", ""], ["空气", ""], ["已领取", ""], ["没有抽奖次数", ""], ["已达到单日最大抽奖次数", ""], ["无抽奖次数", ""], ["当天只能签到一次", ""], ["活动太火爆,还是去买买买吧", ""], ["登录失败", ""], ["黑名单", ""], ["签满7天后不能再参加了", ""], ["积分不足", ""], ["已达到活动期间最大抽奖次数", ""], ["已超过最大抽奖次数,不允许再进行抽奖!", ""], ]; for (let lIi1lilI of illi1iii) { iIIi1l1l = iIIi1l1l.replace(lIi1lilI[0], lIi1lilI[1]); } if (!iIIi1l1l) return; this.sendMsg.push(iIIi1l1l); } ["union"](iIliiiil, iIlll11I) { return iIliiiil.concat(iIlll11I.filter(I1iIlIll => !iIliiiil.includes(I1iIlIll))); } ["intersection"](l1II1i11, ll1I1i1I) { return l1II1i11.filter(ii1l1ii => ll1I1i1I.includes(ii1l1ii)); } ["different"](iIi1iII, iIi1li1l) { return iIi1iII.concat(iIi1li1l).filter(Illl1ili => iIi1iII.includes(Illl1ili) && !iIi1li1l.includes(Illl1ili)); } ["unique"](iIiIl1i) { return Array.from(new Set(iIiIl1i)); } ["formatDate"](i11ilI11, IIlIlli) { return i1I1IlI1(typeof i11ilI11 === "object" ? i11ilI11 : new Date(typeof i11ilI11 === "string" ? i11ilI11 * 1 : i11ilI11), IIlIlli || "yyyy-MM-dd"); } ["dateStringToTimestamp"](I1lliIlI, i1il1111) { const lIiiillI = parse(I1lliIlI, i1il1111 || "yyyy-MM-dd HH:mm", new Date()), i11Iil11 = lIiiillI.getTime(); return i11Iil11; } ["match"](II1lIlIi, lI1ilIIl) { II1lIlIi = II1lIlIi instanceof Array ? II1lIlIi : [II1lIlIi]; for (let I1iiiIi1 of II1lIlIi) { const I1li1lli = I1iiiIi1.exec(lI1ilIIl); if (I1li1lli) { const l1iIiIIl = I1li1lli.length; if (l1iIiIIl === 1) return I1li1lli; else { if (l1iIiIIl === 2) { return I1li1lli[1]; } else { const iI11iIIi = []; for (let Iill1il1 = 1; Iill1il1 < l1iIiIIl; Iill1il1++) { iI11iIIi.push(I1li1lli[Iill1il1]); } return iI11iIIi; } } } } return ""; } ["matchAll"](ili11IIi, Illi111l) { ili11IIi = ili11IIi instanceof Array ? ili11IIi : [ili11IIi]; let iiI11III, l1IiIii1 = []; for (let IiIlli1I of ili11IIi) { while ((iiI11III = IiIlli1I.exec(Illi111l)) != null) { let iiIiIl1i = iiI11III.length; if (iiIiIl1i === 1) l1IiIii1.push(iiI11III); else { if (iiIiIl1i === 2) l1IiIii1.push(iiI11III[1]); else { let iliIiIil = []; for (let IiIlllI1 = 1; IiIlllI1 < iiIiIl1i; IiIlllI1++) { iliIiIil.push(iiI11III[IiIlllI1]); } l1IiIii1.push(iliIiIil); } } } } return l1IiIii1; } ["haskey"](l1lI11ii, Il1IIlil) { const IlliI1l1 = Il1IIlil.split("."); let l1II111l = l1lI11ii; for (const i111lIi1 of IlliI1l1) { if (l1II111l && l1II111l.hasOwnProperty(i111lIi1)) l1II111l = l1II111l[i111lIi1]; else return undefined; } return l1II111l; } ["parseJSON"](lliiiIi) { try { const IiiIlili = JSON.parse(lliiiIi); return IiiIlili; } catch (l1iiliil) { return false; } } ["json2Str"](iIIl11i) { try { return JSON.stringify(iIIl11i); } catch (ilI1I1l) { return ""; } } ["str2Json"](i11I1Iil) { try { return JSON.parse(i11I1Iil); } catch (iIiiliii) { return i11I1Iil; } } ["textToHtml"](IIIlIiI1) { return lIl1ii.load(IIIlIiI1); } ["encodeChineseParamsInUrl"](li1ilIlI) { const Il1lI11l = lIIII11l.parse(li1ilIlI, true); let ll1liii1 = Il1lI11l.query || {}; if (typeof ll1liii1 !== "object" || Array.isArray(ll1liii1)) { ll1liii1 = {}; } const i1ilIII = {}; Object.keys(ll1liii1).forEach(lIlli111 => { const Illli = ll1liii1[lIlli111]; if (typeof Illli === "string" && /[\u4e00-\u9fa5]/.test(Illli)) i1ilIII[lIlli111] = encodeURIComponent(Illli); else { i1ilIII[lIlli111] = Illli; } }); const il1IIl11 = Object.keys(i1ilIII).map(lii11lIi => encodeURIComponent(lii11lIi) + "=" + i1ilIII[lii11lIi]).join("&"); let I1ll11I = Il1lI11l.protocol + "//" + Il1lI11l.host + Il1lI11l.pathname; if (il1IIl11) { I1ll11I += "?" + il1IIl11; } return I1ll11I; } ["encodeChineseParams"](lIIl11i) { const II111iIi = new URL(lIIl11i), II1i111i = new URLSearchParams(II111iIi.search); for (const [il11I1l, i1lI1] of II1i111i) { /[\u4e00-\u9fa5]/.test(i1lI1) && II1i111i.set(il11I1l, encodeURIComponent(i1lI1)); } return II111iIi.search = II1i111i.toString(), II111iIi.toString(); } ["sleep"](iIiIlll1, i1i1IIli) { let I11IlIll = iIiIlll1; if (i1i1IIli !== undefined) { I11IlIll = Math.floor(Math.random() * (i1i1IIli - iIiIlll1 + 1)) + iIiIlll1; } return new Promise(IIliIIil => setTimeout(IIliIIil, I11IlIll)); } ["wait"](llli111l, liIIi1l) { if (llli111l < 0) { return; } if (liIIi1l) { return new Promise(Ii1iIil => setTimeout(Ii1iIil, this.random(llli111l, liIIi1l))); } else { return new Promise(lI1I111I => setTimeout(lI1I111I, llli111l)); } } ["stop"]() { this.immediatelyExit(); throw new i1I1IiII(); } async ["immediatelyExit"]() { if (iIl1IlI1.immediatelyExit === 1) { while (IlIIlIli.isSaveAddress) { await this.sleep(1000); } process.exit(0); } } ["exit"]() { throw new iiiIIIll(); } ["random"](I1l1lIli, iliI11ii) { return Math.min(Math.floor(I1l1lIli + Math.random() * (iliI11ii - I1l1lIli)), iliI11ii); } ["randomNum"](l1l1l1II) { l1l1l1II = l1l1l1II || 32; let lI1Ii1li = "0123456789", IiIlI = lI1Ii1li.length, IIII1Il = ""; for (let iII1lll = 0; iII1lll < l1l1l1II; iII1lll++) { IIII1Il += lI1Ii1li.charAt(Math.floor(Math.random() * IiIlI)); } return IIII1Il; } ["randomArray"](IIiIilli, llIiiI) { llIiiI = llIiiI || IIiIilli.length; let IIlll1ii = IIiIilli.slice(0), lllilI1l = IIiIilli.length, il1iIl1I = lllilI1l - llIiiI, I1111I1i, l1lillIi; while (lllilI1l-- > il1iIl1I) { l1lillIi = Math.floor((lllilI1l + 1) * Math.random()); I1111I1i = IIlll1ii[l1lillIi]; IIlll1ii[l1lillIi] = IIlll1ii[lllilI1l]; IIlll1ii[lllilI1l] = I1111I1i; } return IIlll1ii.slice(il1iIl1I); } ["timestamp"]() { return Date.now(); } ["getMilliSecondsUntilTomorrow"]() { let li1IilII = new Date(), IlillII = new Date(); IlillII.setHours(24, 0, 0, 0); let I1llI11 = IlillII - li1IilII; return I1llI11; } ["getQueryString"](IiI11Ili, IIllIll1) { let lllIlll1 = new RegExp("(^|[&?])" + IIllIll1 + "=([^&]*)(&|$)"), ii1I1i1I = IiI11Ili.match(lllIlll1); if (ii1I1i1I != null) return unescape(ii1I1i1I[2]); return ""; } ["ensureDirectoryExistence"](I1i1l1lI) { !l1I11II1.existsSync(I1i1l1lI) && (this.ensureDirectoryExistence(ilI1il.dirname(I1i1l1lI)), l1I11II1.mkdirSync(I1i1l1lI)); } ["readFileSync"](i111l1Il) { try { return l1I11II1.readFileSync(i111l1Il, "utf-8").toString(); } catch (lliiliI) { return ""; } } ["writeFileSync"](IiiIiil1, Ii1I1li, IlIiiIl1) { const ll1iIi1I = ilI1il.join(__dirname, IiiIiil1); this.ensureDirectoryExistence(ll1iIi1I); const lI1il111 = ilI1il.join(ll1iIi1I, Ii1I1li); try { l1I11II1.writeFileSync(lI1il111, IlIiiIl1, "utf-8"); } catch (l1l1il1l) { this.log("写入文件时出错:", l1l1il1l); } } async ["writeFileSyncByLock"](IiIi1liI, iiliIl1l, ii1iil11) { const llilIl = ilI1il.join(__dirname, IiIi1liI), l1iiiI1I = ilI1il.join(llilIl, iiliIl1l); try { await writeFileAsync(l1iiiI1I, ii1iil11); } catch (II1IIiII) { this.log("写入文件时出错:", II1IIiII); } } ["readYamlSync"](iii1iI1l) { try { return llillIi1.parse(this.readFileSync(iii1iI1l)) ?? {}; } catch (liliIliI) { return {}; } } ["writeYamlSync"](IIii1, Ii1li1lI, ll1lli1l) { try { this.writeFileSync(IIii1, Ii1li1lI, llillIi1.stringify(ll1lli1l)); } catch (IIiiIiii) { this.log("写入文件时出错:", IIiiIiii); } } ["appendFileSync"](l1li1l, iiliIlII, II1l111) { const lI1IIi1l = ilI1il.join(__dirname, l1li1l); this.ensureDirectoryExistence(lI1IIi1l); const IIlI1Ii1 = ilI1il.join(lI1IIi1l, iiliIlII); try { l1I11II1.appendFileSync(IIlI1Ii1, II1l111, "utf-8"); } catch (ililIIl1) { this.log("写入文件时出错:", ililIIl1); } } async ["writeLongCache"](IIl1llii = this.activityId, iiiI1lli = this.pin, ll1i1ll = "list") { try { if (IlIIlIli.redis) { ll1i1ll.toLowerCase() === "list" ? await IlIIlIli.redis.sadd(IIl1llii, iiiI1lli) : await IlIIlIli.redis.set(IIl1llii, iiiI1lli); return; } this.appendFileSync("cache/" + Iii1iI1i.envInfo.runName, "" + IIl1llii, iiiI1lli + "\n"); } catch (II1lI1I) { if (II1lI1I instanceof iiiIIIll || II1lI1I instanceof i1I1IiII) throw II1lI1I; this.log("writeLongCache:", II1lI1I.message); } } async ["writeDayCache"](i1Iii111 = this.activityId, Ii1IIilI = this.pin) { try { if (IlIIlIli.redis) { await IlIIlIli.redis.sadd(i1Iii111, Ii1IIilI, Math.floor(this.getMilliSecondsUntilTomorrow() / 1000) - 5); return; } this.appendFileSync("cache/" + Iii1iI1i.envInfo.runName, i1Iii111 + "_" + this.formatDate(this.timestamp()), Ii1IIilI + "\n"); } catch (IiiiII) { if (IiiiII instanceof iiiIIIll || IiiiII instanceof i1I1IiII) throw IiiiII; this.log("writeDayCache:", IiiiII.message); } } async ["readDayCache"](l11IlIl1 = this.activityId) { try { if (IlIIlIli.redis) { return await IlIIlIli.redis.get(l11IlIl1); } if (IlIIlIli.activity["dayCache_" + l11IlIl1 + "_" + this.formatDate(this.timestamp())]) return IlIIlIli?.["activity"]?.["dayCache_" + l11IlIl1 + "_" + this.formatDate(this.timestamp())]; let IiIiI11I = this.readFileSync("cache/" + Iii1iI1i.envInfo.runName + "/" + l11IlIl1 + "_" + this.formatDate(this.timestamp())).split("\n").filter(lIIi1i1 => lIIi1i1 && lIIi1i1.trim()); return IlIIlIli.activity["dayCache_" + l11IlIl1 + "_" + this.formatDate(this.timestamp())] = IiIiI11I, IlIIlIli?.["activity"]?.["dayCache_" + l11IlIl1 + "_" + this.formatDate(this.timestamp())]; } catch (i1l11Iii) { if (i1l11Iii instanceof iiiIIIll || i1l11Iii instanceof i1I1IiII) throw i1l11Iii; this.log("readLongCache:", i1l11Iii.message); } } async ["readLongCache"](liiIil = this.activityId) { try { if (IlIIlIli.redis) return await IlIIlIli.redis.get(liiIil); if (IlIIlIli.activity["longCache_" + liiIil]) return IlIIlIli?.["activity"]?.["longCache_" + liiIil]; let IiIiliI1 = this.readFileSync("cache/" + Iii1iI1i.envInfo.runName + "/" + liiIil).split("\n").filter(iIlIlIi => iIlIlIi && iIlIlIi.trim()); return IlIIlIli.activity["longCache_" + liiIil] = IiIiliI1, IlIIlIli?.["activity"]?.["longCache_" + liiIil]; } catch (IiIlliI1) { if (IiIlliI1 instanceof iiiIIIll || IiIlliI1 instanceof i1I1IiII) throw IiIlliI1; this.log("readLongCache:", IiIlliI1.message); } } async ["hitCache"](i11i1ili = this.activityId, Iilil1ii = this.pin, liIilili = "hit cache", l1l1iI1i = false) { try { if (IlIIlIli.redis) { if (await IlIIlIli.redis.sismember(i11i1ili, Iilil1ii)) return l1l1iI1i ? this.log(liIilili) : this.putMsg(liIilili), this.exit(); return; } if (IlIIlIli.activity["longCache_" + i11i1ili]) { if (IlIIlIli?.["activity"]?.["longCache_" + i11i1ili]?.["includes"](Iilil1ii)) return l1l1iI1i ? this.log(liIilili) : this.putMsg(liIilili), this.exit(); return; } let IlliIi1 = this.readFileSync("cache/" + Iii1iI1i.envInfo.runName + "/" + i11i1ili).split("\n").filter(iiIIil1I => iiIIil1I && iiIIil1I.trim()); IlIIlIli.activity["longCache_" + i11i1ili] = IlliIi1; if (IlIIlIli?.["activity"]?.["longCache_" + i11i1ili]?.["includes"](Iilil1ii)) return l1l1iI1i ? this.log(liIilili) : this.putMsg(liIilili), this.exit(); } catch (iiliiiI1) { if (iiliiiI1 instanceof iiiIIIll || iiliiiI1 instanceof i1I1IiII) throw iiliiiI1; this.log("hitCache:", iiliiiI1.message); } } async ["hitDayCache"](iiI111i = this.activityId, lIIl1l1l = this.pin, i11IIIlI = "hit cache", I1IIIlil = false, I1IIIi11 = true) { try { if (IlIIlIli.redis) { if (await IlIIlIli.redis.sismember(iiI111i, lIIl1l1l)) return I1IIIlil ? this.log(i11IIIlI) : this.putMsg(i11IIIlI), I1IIIi11 && this.exit(), true; return false; } if (IlIIlIli.activity["dayCache_" + iiI111i + "_" + this.formatDate(this.timestamp())]) { if (IlIIlIli?.["activity"]?.["dayCache_" + iiI111i + "_" + this.formatDate(this.timestamp())]?.["includes"](lIIl1l1l)) return I1IIIlil ? this.log(i11IIIlI) : this.putMsg(i11IIIlI), I1IIIi11 && this.exit(), true; return false; } let Il1i1111 = this.readFileSync("cache/" + Iii1iI1i.envInfo.runName + "/" + iiI111i + "_" + this.formatDate(this.timestamp())).split("\n").filter(liiIIill => liiIIill && liiIIill.trim()); IlIIlIli.activity["dayCache_" + iiI111i + "_" + this.formatDate(this.timestamp())] = Il1i1111; if (IlIIlIli?.["activity"]?.["dayCache_" + iiI111i + "_" + this.formatDate(this.timestamp())]?.["includes"](lIIl1l1l)) { return I1IIIlil ? this.log(i11IIIlI) : this.putMsg(i11IIIlI), I1IIIi11 && this.exit(), true; } return false; } catch (iIl1Ii1I) { if (iIl1Ii1I instanceof iiiIIIll || iIl1Ii1I instanceof i1I1IiII) throw iIl1Ii1I; this.log("hitCache:", iIl1Ii1I.message); } } async ["writeLongCacheByStop"]() { try { if (IlIIlIli.redis) return this.activityId && (await IlIIlIli.redis.sadd("activity_stop", this.activityId)); this.appendFileSync("cache/stop", "id", this.activityId + "\n"); } catch (l111Iili) { if (l111Iili instanceof iiiIIIll || l111Iili instanceof i1I1IiII) throw l111Iili; this.log("writeLongCacheByStop:", l111Iili.message); } } ["readLongCacheByStop"]() { let lIli11i = this.readFileSync("cache/stop/id").split("\n").filter(ilIii1lI => ilIii1lI && ilIii1lI.trim()); IlIIlIli.activity.stopIds = lIli11i; } ["md5"](lliIIii1) { const ilIiI1l1 = II11il11.MD5(lliIIii1); return ilIiI1l1.toString(II11il11.enc.Hex); } ["hmacSHA256"](i1l111i, l1Ii1i11) { const llI1li1 = II11il11.HmacSHA256(l1Ii1i11, i1l111i); return llI1li1.toString(II11il11.enc.Hex); } ["hmacMD5"](II1lii1l, lIlIiIIi) { const I11IliIi = II11il11.HmacMD5(lIlIiIIi, II1lii1l); return I11IliIi.toString(II11il11.enc.Hex); } ["rsaEncrypt"](I111lilI, llI1lIlI, lI11I1l1) { I111lilI = "-----BEGIN PUBLIC KEY-----\n" + I111lilI + "\n-----END PUBLIC KEY-----"; const I11ili = new i111lii1(I111lilI); I11ili.setOptions(llI1lIlI); const ii11I1I = I11ili.encrypt(lI11I1l1, "base64"); return ii11I1I; } ["encryptCrypto"](liIIIi, lIiIl1lI, i1lIliI1, iiiillli, llI1iI1, i111liII, l111i1i1 = false) { return II11il11[liIIIi].encrypt(II11il11.enc.Utf8.parse(llI1iI1), II11il11.enc.Utf8.parse(i111liII), { "mode": II11il11.mode[lIiIl1lI], "padding": II11il11.pad[i1lIliI1], "iv": II11il11.enc.Utf8.parse(iiiillli) }).ciphertext.toString(l111i1i1 ? II11il11.enc.Hex : II11il11.enc.Base64); } ["decryptCrypto"](iIl1lI1l, iI1ilil, IiliIl1l, Il111Ii1, IliiIiil, llllll1i, iIi1lilI = false) { const lll1iIl = II11il11[iIl1lI1l].decrypt({ "ciphertext": iIi1lilI ? II11il11.enc.Hex.parse(IliiIiil) : II11il11.enc.Base64.parse(IliiIiil) }, II11il11.enc.Utf8.parse(llllll1i), { "iv": II11il11.enc.Utf8.parse(Il111Ii1), "mode": II11il11.mode[iI1ilil], "padding": II11il11.pad[IiliIl1l] }).toString(II11il11.enc.Utf8); return lll1iIl; } #base64Encode(iIi1II) { const l1Iii1i1 = "KLMNOPQRSTABCDEFGHIJUVWXYZabcdopqrstuvwxefghijklmnyz0123456789+/", lliliII = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", Ilili1Il = II11il11.enc.Utf8.parse(iIi1II), III1IIl1 = II11il11.enc.Base64.stringify(Ilili1Il), IIiiii1i = III1IIl1.split("").map(llllli1l => { const illi1llI = l1Iii1i1.indexOf(llllli1l); return illi1llI !== -1 ? lliliII[illi1llI] : llllli1l; }).join(""); return IIiiii1i; } ["generateStringArray"](lIl1ilIi, lllIIIIl) { const Ii11ll1l = Array(lIl1ilIi).fill(lllIIIIl), IIl1l1ii = Ii11ll1l.join(""); return IIl1l1ii; } ["uuid"](Illl = 40) { return i1l1ilIl(this.generateStringArray(Illl, "x")); } ["userAgent"]() { const { screen: iillli1I, tf: iii1I1i, iv: Ili1i1l1, clientVersion: lIi1lil, build: lillIIIi, uuid: IiIi1i1i } = this.phoneInfo, lIIil1l = { "ciphertype": 5, "cipher": { "ud": this.#base64Encode(IiIi1i1i), "sv": this.#base64Encode(iii1I1i), "iad": "" }, "ts": Date.now(), "hdid": "JM9F1ywUPwflvMIpYPok0tt5k9kW4ArJEU3lfLhxBqw=", "version": "1.0.3", "appname": "com.360buy.jdmobile", "ridx": -1 }; return { "jd4": "JD4iPhone/" + lillIIIi + "%20(iPhone;%20iOS;%20Scale/3.00);jdmall;iphone;version/" + lIi1lil + ";build/" + lillIIIi + ";network/wifi;screen/" + iillli1I.replace("*", "x") + ";os/" + Ili1i1l1, "app": "jdapp;iPhone;" + lIi1lil + ";;;M/5.0;appBuild/" + lillIIIi + ";jdSupportDarkMode/1;ef/1;ep/" + encodeURIComponent(JSON.stringify(lIIil1l)) + ";Mozilla/5.0 (iPhone; CPU iPhone OS " + Ili1i1l1.replaceAll(".", "_") + " like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1;" }; } ["jdJE"]() { const { build: l1iIiiil } = this.phoneInfo, lli1IIi1 = { "ciphertype": 5, "cipher": { "pin": this.#base64Encode(this.pin) }, "ts": parseInt(this.timestamp() / 1000), "hdid": "JM9F1ywUPwflvMIpYPok0tt5k9kW4ArJEU3lfLhxBqw=", "version": "1.0.3", "appname": "com.360buy.jdmobile", "ridx": -1 }, l111IIIi = { "ciphertype": 5, "cipher": { "User-Agent": "JD4iPhone/" + l1iIiiil + "%20(iPhone;%20iOS;%20Scale/3.00)" }, "ts": parseInt(this.timestamp() / 1000), "hdid": "JM9F1ywUPwflvMIpYPok0tt5k9kW4ArJEU3lfLhxBqw=", "version": "1.0.3", "appname": "com.360buy.jdmobile", "ridx": -1 }; return { "j-e-c": encodeURIComponent(JSON.stringify(lli1IIi1)), "j-e-h": encodeURIComponent(JSON.stringify(l111IIIi)) }; } ["userPin"](l1liI1i = this.cookie) { if (!l1liI1i) { return; } const Iiil1i = l1liI1i.split(";"); for (const Il1lii1l of Iiil1i) { const [il1il11i, iiIIl1] = Il1lii1l.split("="); if (il1il11i === "pt_pin") return iiIIl1; } return null; } ["getLastSegmentOfUrl"](iIl1iI1) { try { if (!iIl1iI1) return null; const IlliiiIl = new URL(iIl1iI1), IiliII1l = IlliiiIl.pathname, Ili1l1I1 = IiliII1l.substring(IiliII1l.lastIndexOf("/") + 1); return Ili1l1I1; } catch (llIilil1) { return null; } } ["getCookieByName"](l1iiIi) { return this.savedCookies[l1iiIi]; } ["handleSetCookieHeaders"](il111IIi) { let iIllIiII = {}; const IIiiIil = il111IIi["set-cookie"]; if (IIiiIil) { IIiiIil.forEach(i1lilIii => { const li1111ll = i1lilIii.match(/([^=]+)(?:=([^;]*))?/); if (li1111ll) { const II1iIIii = li1111ll[1].trim(), l11I11i = li1111ll[2] ? li1111ll[2].trim() : ""; iIllIiII[II1iIIii] = l11I11i; } }); } this.savedCookies = { ...this.savedCookies, ...iIllIiII }; this.ticket = ""; Object.entries(this.savedCookies).forEach(([II1I1lII, liII1111]) => { this.ticket += II1I1lII + "=" + liII1111 + ";"; }); } #handleHeaders(lIIIi1II) { if (this.mode === "hdb") { if (!lIIIi1II._s) return; let IiII1l1i = { "nonce": lIIIi1II._nonce ?? "", "s": lIIIi1II._s ?? "", "ts": lIIIi1II._ts ?? "" }; this.otherHeaders = { ...this.otherHeaders, ...IiII1l1i }; } } ["request"](l1III11) { const l11il1i1 = { "method": "get", "timeout": 20000 }, Ill1i = Object.assign({}, l11il1i1, l1III11); return new Promise((Illll1l1, il1llIII) => { I1II1lIl(Ill1i).then(lIIl11Ii => { const Iii1lI1 = lIIl11Ii.data, I1iIIill = lIIl11Ii.headers; Illll1l1({ "data": Iii1lI1, "headers": I1iIIill }); }).catch(iiiIllll => { il1llIII(iiiIllll); }); }); } async #checkProxy(l1ii1l1i) { try { return await I1II1lIl({ "url": this.activityUrl || "https://www.jd.com", "headers": { "User-Agent": this.ua.app }, "httpsAgent": l1ii1l1i, "timeout": 4000 }), true; } catch (IllililI) { return false; } } async #getProxyIp(l1IIllII = 10) { if (!Iii1iI1i.proxy.proxyState) return null; if (iIl1IlI1.wxProxyMode === 1) { if (IlIIlIli.proxyIp && IlIIlIli.proxyIpTime + iIl1IlI1.wxProxyInterval * 1000 > this.timestamp()) return IlIIlIli.proxyIp; let lll1lI11 = await Iii1iI1i.proxy.getCurrentProxy(); if (!lll1lI11) return null; return IlIIlIli.proxyIp = lll1lI11, IlIIlIli.proxyIpTime = this.timestamp(), lll1lI11; } else { if (iIl1IlI1.wxProxyMode === 2) { if (this.proxyIp && this.proxyIpTime + iIl1IlI1.wxProxyInterval * 1000 > this.timestamp()) { return this.proxyIp; } let i11I1ll1 = await Iii1iI1i.proxy.getCurrentProxy(); if (!i11I1ll1) return null; return this.log("获取到的ip:" + i11I1ll1), this.proxyIp = i11I1ll1, this.proxyIpTime = this.timestamp(), i11I1ll1; } else this.log("代理模式错误"); } return null; } async #handleRequestParams(i1il1iI) { const IIilIII = { ...this.headers }; !i1il1iI?.["noReferer"] && this.activityUrl && (IIilIII.Referer = this.activityUrl); const iliIi1l1 = { "url": "https://api.m.jd.com/", "method": "get", "headers": { ...IIilIII, ...i1il1iI?.["headers"], ...this.otherHeaders }, "timeout": iIl1IlI1.timeoutDuration * 1000 }; delete i1il1iI.headers; i1il1iI = Object.assign({}, iliIi1l1, i1il1iI); this.haskey(i1il1iI, "api") && (i1il1iI.url += i1il1iI.api); if (this.haskey(i1il1iI, "json")) i1il1iI.data = i1il1iI.json, i1il1iI.headers = { ...i1il1iI.headers, "Content-Type": "application/json;charset=UTF-8" }, i1il1iI.method = "post"; else { if (this.haskey(i1il1iI, "data")) { i1il1iI.headers = { ...i1il1iI.headers, "Content-Type": "application/x-www-form-urlencoded" }; i1il1iI.method = "post"; } } const ii1il1li = i1il1iI?.["functionId"] || "", llilli1l = i1il1iI?.["body"] || ""; if (this.haskey(i1il1iI, "sign")) { let Iliilili = i1l1iil.getSignData(ii1il1li, llilli1l, this.phoneInfo); i1il1iI.method == "get" ? i1il1iI.params = Object.assign({}, i1il1iI.params, Iliilili) : i1il1iI.data = Object.assign({}, i1il1iI.data, Iliilili); } let l1liI1 = false, lI1ill1l; if (this.haskey(i1il1iI, "h5st31")) l1liI1 = true, lI1ill1l = "3.1"; else { if (this.haskey(i1il1iI, "h5st41")) l1liI1 = true, lI1ill1l = "4.1"; else { if (this.haskey(i1il1iI, "h5st42")) l1liI1 = true, lI1ill1l = "4.2"; else { if (this.haskey(i1il1iI, "h5st43")) l1liI1 = true, lI1ill1l = "4.3"; else this.haskey(i1il1iI, "h5st44") && (l1liI1 = true, lI1ill1l = "4.4"); } } } if (l1liI1) { let ii1I1il1 = await this.h5st.encrypt(i1il1iI.appId, i1il1iI.functionId, i1il1iI.body, i1il1iI.appid, i1il1iI.client, i1il1iI.clientVersion, i1il1iI.t, lI1ill1l); i1il1iI.method == "get" ? i1il1iI.params = Object.assign({}, i1il1iI.params, ii1I1il1) : i1il1iI.data = Object.assign({}, i1il1iI.data, ii1I1il1); } i1il1iI = this.#checkAndEncryptParameters(i1il1iI); i1il1iI?.["headers"]["Content-Type"] === "application/x-www-form-urlencoded" && (i1il1iI.data = iIl1llII.stringify(i1il1iI.data)); if (i1il1iI?.["jdje"]) { i1il1iI.headers = { ...i1il1iI.headers, ...this.jdJE(), "x-referer-package": "com.360buy.jdmobile", "x-rp-client": "ios_4.0.0" }; } i1il1iI?.["headers"]?.["Referer"] && (i1il1iI.headers.Referer = this.encodeChineseParams(i1il1iI.headers.Referer)); let I1lliII = { "url": i1il1iI.url, "method": i1il1iI.method, "params": i1il1iI?.["params"] || {}, "data": i1il1iI?.["data"] || {}, "headers": i1il1iI?.["headers"] || {}, "timeout": i1il1iI?.["timeout"] || 30000, "maxRedirects": i1il1iI?.["maxRedirects"] || 5 }; if (!i1il1iI?.["noUseProxy"]) { const liI1iI1l = I1lliII.url.includes("https://") && I1lliII.url.includes("api.m.jd.com") ? iI111l1i.jdAppTlsOptions : {}, l1liiII = await this.#getProxyIp(); I1lliII.httpsAgent = II1li1II({ "proxy": l1liiII ? "http://" + l1liiII : null, "tlsOptions": liI1iI1l }); } return I1lliII; } #tlsOptions(lllllIll, Ilii1l1 = false) { !Ilii1l1 && lllllIll?.["url"]["includes"]("https") && lllllIll?.["url"]?.["includes"]("api.m.jd.com") && (l1liiii1.globalAgent = new l1liiii1.Agent(tlsOptions)); Ilii1l1 && l1liiii1.globalAgent.options && Object.keys(tlsOptions).forEach(l1ii11i1 => delete l1liiii1.globalAgent.options[l1ii11i1]); } #checkAndEncryptParameters(liIiI1l) { if (this.defenseUrls.some(lIIIii1i => liIiI1l.url.includes(lIIIii1i))) { if (this.mode === "wx") { liIiI1l.data = { "ecyText": i11IIIli({ ...liIiI1l.data, "actId": this.activityId }, this.getCookieByName("pToken"), this.getCookieByName("te")) }; liIiI1l.headers["Content-Type"] = "application/json;charset=UTF-8"; } else { if (this.mode === "100") { liIiI1l.data.actId = this.activityId; liIiI1l.data = { "ecyText": i11IIIli(liIiI1l.data, this.getCookieByName("pToken"), this.getCookieByName("te")) }; } } } if (this.mode == "hdb" && liIiI1l.method === "post" && iI111l1i.hdbTypes.some(iliiiI1I => liIiI1l.url.includes(iliiiI1I))) { liIiI1l.data.sysParams = { "sysmethod": liIiI1l.data.appJsonParams.method, "sign": "111111", "timestamp": 123456 }; } return liIiI1l; } async #proxyRequiredCheck(iliIi1ll, llliIIl) { if (iIl1IlI1.wxProxyEnable === 2 && iIl1IlI1.wxProxyUrl && iliIi1ll.match(iIl1IlI1.proxyRegx)) { if (iIl1IlI1.wxProxyMode === 1 && IlIIlIli.proxyIp && IlIIlIli.proxyIpTime && llliIIl && llliIIl < IlIIlIli.proxyIpTime) return true; return iIl1IlI1.wxProxySmart === 1 && Iii1iI1i.proxy.updateProxyEnable(true), this.proxyIp = null, IlIIlIli.proxyIp = null, Iii1iI1i.proxy.cleanProxy(), true; } return false; } #handleMatchingResponse(iiI1IliI) { if (iiI1IliI && iiI1IliI.constructor === Object) { iiI1IliI = JSON.stringify(iiI1IliI); iiI1IliI.includes("AUTH.FAILED.BLACK") && (this.black = true, this.putMsg("AUTH BLACK"), this.reseCookieStatus(), this.exit()); if (iiI1IliI.match(iIl1IlI1.reTryRegx) && !iiI1IliI.includes("AUTH.FAILED.BLACK")) { return true; } } return false; } #retryOnEmptyStringResponse(iiIiii11, i1i111lI) { if (!i1i111lI && this.defenseUrls.some(liI11111 => iiIiii11.url.includes(liI11111))) return true; return false; } async ["jd_api"](ii1i111i, il1il11l = true, ili1i1I1 = 0, IIi1iIl = 0) { let lIliill = Object.assign({}, ii1i111i), II1liI1l = ii1i111i?.["functionId"], iilIIIIl = await this.#handleRequestParams(ii1i111i), i1li1l1I = this.timestamp(); try { let { data: iIllii1i, headers: iI1i1l1 } = await this.request(iilIIIIl); il1il11l && this.handleSetCookieHeaders(iI1i1l1); this.#handleHeaders(iI1i1l1); if (ili1i1I1 < this.retryCount && this.#retryOnEmptyStringResponse(iilIIIIl, iIllii1i)) { return this.log("空数据重试" + ili1i1I1), await this.initPinToken(), await this.jd_api(lIliill, true, ili1i1I1 + 1, IIi1iIl); } if (ili1i1I1 < this.retryCount && this.#handleMatchingResponse(iIllii1i)) return this.debug(iIllii1i), this.log("重试" + ili1i1I1), await this.jd_api(lIliill, true, ili1i1I1 + 1, IIi1iIl); let ll1ilIli = this.json2Str(iIllii1i); if (ili1i1I1 < this.retryCount && iIllii1i && ll1ilIli && /您点的太快了|操作过于频繁/.test(ll1ilIli)) return this.debug(iIllii1i), this.log("等待重试" + ili1i1I1), await this.sleep(1500), await this.jd_api(lIliill, true, ili1i1I1 + 1, IIi1iIl); return iIllii1i; } catch (lii1Illl) { if (lii1Illl instanceof i1I1IiII || lii1Illl instanceof iiiIIIll) throw lii1Illl; const i1iiiIl1 = lii1Illl?.["response"]?.["status"], iIII111l = [301, 302]; if (this.retryStatusRegex?.["test"](i1iiiIl1) && ili1i1I1 < this.retryCount) return await this.jd_api(lIliill, true, ili1i1I1 + 1, IIi1iIl); if ([404, ...iIII111l].includes(i1iiiIl1) && ii1i111i?.["url"]?.["includes"]("getDefenseUrls")) return []; if (ii1i111i?.["maxRedirects"] === 0 && il1il11l && iIII111l.includes(i1iiiIl1)) return this.handleSetCookieHeaders(lii1Illl?.["response"]?.["headers"]), lii1Illl?.["response"]?.["headers"]; if (this.blackRegx?.["test"](i1iiiIl1)) return this.putMsg(lii1Illl.response?.["data"]?.["message"] || "黑号"), this.exit(); this.debug(lii1Illl.response?.["data"]); const I1IIll1i = lii1Illl.message; if (lii1Illl?.["response"]?.["status"] === 500 && this.defenseUrls.some(IiI1l1ii => iilIIIIl.url.includes(IiI1l1ii)) && ili1i1I1 < this.retryCount) { return await this.initPinToken(), this.log("500重试" + ili1i1I1), await this.jd_api(lIliill, true, ili1i1I1 + 1, IIi1iIl); } const IlIi1Ii = II1liI1l?.["includes"]("isvObfuscator"); if (IlIi1Ii && IIi1iIl > iIl1IlI1.isvObfuscatorRetry) return undefined; if (IIi1iIl < this.proxyRetryCount && (await this.#proxyRequiredCheck(I1IIll1i, i1li1l1I))) return iIl1IlI1.showProxyRetryLog && this.log("" + (IlIi1Ii ? "isvObfuscator " : "") + (lii1Illl?.["response"]?.["status"] ?? "") + "代理重试" + IIi1iIl), IlIi1Ii && (await this.sleep(iIl1IlI1.isvObfuscatorRetryWait * 1000)), await this.jd_api(lIliill, true, ili1i1I1, IIi1iIl + 1); return this.error("[" + (II1liI1l ?? lIliill?.["params"]?.["functionId"] ?? lIliill?.["data"]?.["functionId"] ?? lIliill?.["json"]?.["functionId"] ?? this.getLastSegmentOfUrl(ii1i111i?.["url"])) + "]请求失败," + (i1iiiIl1 ? "状态码[" + i1iiiIl1 + "]" : I1IIll1i)), undefined; } } async ["taskGet"](li1l, lIIil11I = {}) { let i1iiliil = li1l.startsWith("http") ? li1l : "https://" + this.domain + (this.prefix ? ("/" + this.prefix).replace(/\/\//g, "/") : "") + ("/" + li1l).replace(/\/\//g, "/"), iiIiiIl = { "url": i1iiliil, "method": "get", "params": lIIil11I, "headers": { "Referer": this.activityUrl, "Cookie": this.isvToken ? "IsvToken=" + this.isvToken + ";" + this.ticket : this.cookie } }; return await this.jd_api(iiIiiIl); } async ["taskPost"](l1ll1I1I, IliiIi1i = {}, iIiIIlli = {}, iIIlIIi = false) { let lIiIiIIl = this.prefix ? (this.domain + "/" + this.prefix + "/" + l1ll1I1I).replace(/\/\//g, "/") : (this.domain + "/" + l1ll1I1I).replace(/\/\//g, "/"), I1III1l1 = "https://" + lIiIiIIl, IlIili = { "url": I1III1l1, "method": "post", "headers": { "Referer": this.activityUrl, "Cookie": this.isvToken ? "IsvToken=" + this.isvToken + ";" + this.ticket : this.cookie, ...iIiIIlli } }; return iIIlIIi ? IlIili.json = IliiIi1i : IlIili.data = IliiIi1i, await this.jd_api(IlIili); } async["taskPostByJson"](i1IIlii1, Il111ll1 = {}, ll1ii1il = {}) { return await this.taskPost(i1IIlii1, Il111ll1, ll1ii1il, true); } ["wxStop"](Iil11l) { if (!Iil11l) return; for (let Il11II1l of iIl1IlI1.stopKeywords) { if (Iil11l.includes(Il11II1l)) { throw new i1I1IiII("退出"); } } } async["wxStopSync"](I1iIli1I) { if (!I1iIli1I) return; if (/已结束/.exec(I1iIli1I)) { await this.writeLongCacheByStop(); } for (let llii1 of iIl1IlI1.stopKeywords) { if (I1iIli1I.includes(llii1)) throw new i1I1IiII("退出"); } } async["wxCommonInfo"](liI11Iil = true, IIIiiIil = 3) { let IlI1ilii = await this.taskGet(this.activityUrl); if (IlI1ilii && IlI1ilii.includes("活动已经结束") && liI11Iil) { this.putMsg("活动已经结束,手动确认"); this.stop(); return; } (this.domain.includes("lzkj") || this.domain.includes("lzdz1")) && (await this.taskGet("/wxCommonInfo/token")); if (!this.ticket.includes("LZ_TOKEN_KEY")) { this.debug(this.ticket); IIIiiIil <= 0 && (this.putMsg("初始化LZ_TOKEN_KEY失败"), this.exit()); this.log("初始化LZ_TOKEN_KEY失败,正在重试..."); this.ticket = ""; return await this.wxCommonInfo(liI11Iil, IIIiiIil - 1); } } ["addressInit"]() { for (let i1l11lli of IlIIlIli.addressList) { if (i1l11lli.pt_pin === this.pin) { this.address = i1l11lli.address; this.remarks = i1l11lli.remarks; this.tg_id = i1l11lli.tg_id; return; } } } ["getAddress"]() { if (this.address) return; if (IlIIlIli.addressList.length === 0) { this.address = ""; return; } if (iIl1IlI1.saveAddressMode === 2) { const lIIil1i1 = IlIIlIli.addressList.find(iiIiii1I => !iiIiii1I.use); lIIil1i1 ? (this.address = lIIil1i1.address, lIIil1i1.use = true) : (IlIIlIli.addressList.forEach(iiIllIlI => iiIllIlI.use = false), this.address = IlIIlIli.addressList[0].address, IlIIlIli.addressList[0].use = true); return; } const i1II1II1 = li1iI1I => li1iI1I.pt_pin.includes("默认地址"), ill11iIl = IiI111ii => !IiI111ii.useNum || IiI111ii.useNum < iIl1IlI1.addressUseNum || iIl1IlI1.addressUseNum === 0, iIIlilII = IlIIlIli.addressList.filter(iii11ii1 => i1II1II1(iii11ii1) && ill11iIl(iii11ii1)), i1liIi1I = IlIIlIli.addressList.filter(III1l1Ii => !i1II1II1(III1l1Ii) && ill11iIl(III1l1Ii)); if (iIIlilII.length > 0) { const Illi11II = Math.floor(Math.random() * iIIlilII.length), i1i1i1l1 = iIIlilII[Illi11II]; this.address = i1i1i1l1.address; i1i1i1l1.useNum ? i1i1i1l1.useNum += 1 : i1i1i1l1.useNum = 1; } else { if (i1liIi1I.length > 0) { const IiiIili = Math.floor(Math.random() * i1liIi1I.length), lili1llI = i1liIi1I[IiiIili]; this.address = lili1llI.address; lili1llI.useNum ? lili1llI.useNum += 1 : lili1llI.useNum = 1; } } } async["getShopOpenCardInfo"](iI1lIl11 = this.venderId || this.shopId) { let l1iIlilI = { "venderId": iI1lIl11, "payUpShop": true, "queryVersion": "10.5.2", "appid": "27004", "needSecurity": true, "bizId": "shopmember_m_jd_com", "channel": "8018006" }, IIlii1l = await this.jd_api({ "url": "https://api.m.jd.com/client.action", "method": "post", "body": l1iIlilI, "data": { "functionId": "getShopOpenCardInfo", "body": l1iIlilI, "uuid": "88888" }, "functionId": "getShopOpenCardInfo", "headers": { "Referer": "https://shop.m.jd.com/" }, "appid": "shopmember_m_jd_com", "appId": "27004", "clientVersion": "9.2.0", "client": "H5", "t": Date.now(), "h5st43": true }, false); if (IIlii1l && IIlii1l.success) { let Illl1iI1 = IIlii1l?.["result"][0], IliI1Iii = Illl1iI1?.["interestsRuleList"] ?? []; this.openCardStatus = Illl1iI1?.["userInfo"]?.["openCardStatus"] ?? 0; this.giftList = IliI1Iii; if (IliI1Iii.length > 0) this.giftActId = IliI1Iii?.[0]?.["interestsInfo"]["activityId"] ?? ""; else { this.giftActId = ""; } } else this.giftActId = ""; return IIlii1l; } async["bindWithVender"](Ili1il1i = this.venderId || this.shopId) { let IIliliI = { "venderId": Ili1il1i, "bindByVerifyCodeFlag": 1, "registerExtend": {}, "writeChildFlag": 0, "channel": "8018006", "activityId": this.giftActId, "appid": "27004", "needSecurity": true, "bizId": "shopmember_m_jd_com" }, llilI1II = await this.jd_api({ "url": "https://api.m.jd.com/client.action", "method": "post", "body": IIliliI, "data": { "functionId": "bindWithVender", "appid": "shopmember_m_jd_com", "body": IIliliI, "uuid": "88888" }, "appid": "shopmember_m_jd_com", "appId": "27004", "functionId": "bindWithVender", "headers": { "Referer": "https://shop.m.jd.com/" }, "clientVersion": "9.2.0", "client": "H5", "t": Date.now(), "h5st43": true }, false); this.debug(llilI1II); if (llilI1II && llilI1II.code === 0) { if (llilI1II.busiCode === "0") { if (llilI1II.result?.["giftInfo"]?.["giftList"]) { let iIlI1ill = llilI1II.result.giftInfo.giftList.map(il1lii11 => "" + il1lii11.discountString + il1lii11.prizeName).join(","); this.log("加入店铺[" + Ili1il1i + "]会员成功,获得" + iIlI1ill); } else this.log("加入店铺[" + Ili1il1i + "]会员成功"); } else { this.log(llilI1II?.["message"]); if (llilI1II?.["message"]?.["includes"]("已经是本店会员")) { } else this.canNotOpenCard = true; } } else this.log("加入店铺[" + Ili1il1i + "]会员失败", llilI1II?.["message"]), this.canNotOpenCard = true; return llilI1II; } async["isvObfuscator"]() { if (IlIIlIli.redis) { let iIilIIi = await IlIIlIli.redis.get("" + this.pin); if (iIilIIi) { return this.isvToken = iIilIIi, { "code": "0", "token": this.isvToken }; } } else { let iI1lI11i = this.readFileSync("./tokens/" + this.pin), iIi1Ilil = iI1lI11i ? JSON.parse(iI1lI11i) : {}; if (iIi1Ilil && iIi1Ilil?.["expireTime"] > this.timestamp() - this.random(0, 2 * 60 * 1000) && iIi1Ilil?.["token"]) { return this.isvToken = iIi1Ilil.token, { "code": "0", "token": this.isvToken }; } } const ii11lll1 = { "url": "https://" + this.domain, "id": "" }, IiiillI = await this.jd_api({ "url": "https://api.m.jd.com/client.action", "method": "post", "functionId": "isvObfuscator", "body": ii11lll1, "data": {}, "headers": { ...this.headers, "User-Agent": this.ua.jd4 }, "sign": true, "noReferer": true, "jdje": true }, false); if (IiiillI && IiiillI?.["code"] === "0" && IiiillI?.["token"]) { let illIi111 = IiiillI.token; this.isvToken = illIi111; IlIIlIli.redis ? await IlIIlIli.redis.set("" + this.pin, illIi111, this.random(25, 28) * 60) : this.writeFileSync("tokens", this.pin, JSON.stringify({ "expireTime": this.timestamp() + this.random(20, 26) * 60 * 1000, "token": illIi111 })); } else IiiillI?.["code"] === "3" && IiiillI?.["errcode"] === 264 ? (this.putMsg("ck过期"), this.reseCookieStatus(), this.exit()) : this.log(IiiillI); if (!this.isvToken) { this.putMsg("获取Token失败"); this.reseCookieStatus(); this.exit(); } return IiiillI; } async["getShopInfo"](lIIIi11i = this.venderId, Iilili11 = this.shopId) { if (IlIIlIli.activity.shopName) { this.shopName = IlIIlIli.activity.shopName; this.venderId = IlIIlIli.activity.venderId; this.shopId = IlIIlIli.activity.shopId; return; } let IiliIlll = await this.jd_api({ "api": "pages_jd_com", "method": "post", "data": {}, "functionId": "shopDetail", "body": { "shopId": Iilili11?.["toString"](), "source": "appClient", "venderId": lIIIi11i?.["toString"]() }, "headers": { "User-Agent": this.ua.jd4, "jdgs": "-3107", "x-rp-client": "ios_4.0.0", "x-referer-package": "com.360buy.jdmobile" }, "sign": true, "jdje": true, "noReferer": true }); return IiliIlll && IiliIlll.code === "0" && IiliIlll.isSuccess && (this.shopName = IiliIlll.result.shopBaseInfo.shopName, this.venderId = IiliIlll.result.shopBaseInfo.venderId, this.shopId = IiliIlll.result.shopBaseInfo.shopId, IlIIlIli.activity = Object.assign(IlIIlIli.activity, { "shopName": this.shopName, "shopId": this.shopId, "venderId": this.venderId })), IiliIlll; } async["follow"](lliIilll = this.shopId) { let ilIi1i1 = await this.jd_api({ "api": "client.action", "method": "post", "data": {}, "functionId": "followShop", "body": { "member": "true", "follow": "true", "shopId": lliIilll.toString(), "award": "false", "sourceRpc": "shop_app_home_follow" }, "headers": { "User-Agent": this.ua.jd4, "jdgs": "-3107", "x-rp-client": "ios_4.0.0", "x-referer-package": "com.360buy.jdmobile" }, "sign": true, "jdje": true, "noReferer": true }); this.debug(ilIi1i1); if (ilIi1i1 && ilIi1i1.code === "0") return this.log(ilIi1i1.msg || "关注成功"), true; return this.log(ilIi1i1), false; } async["unfollow"](lil1IIII = this.shopId || this.venderId) { let ll1lilli = await this.jd_api({ "api": "client.action", "method": "post", "data": {}, "functionId": "followShop", "body": { "follow": "false", "shopId": lil1IIII.toString(), "award": "false", "sourceRpc": "shop_app_home_follow" }, "headers": { "User-Agent": this.ua.jd4, "jdgs": "-3107", "x-rp-client": "ios_4.0.0", "x-referer-package": "com.360buy.jdmobile" }, "sign": true, "jdje": true, "noReferer": true }); if (ll1lilli && ll1lilli.code === "0") { return this.log(ll1lilli.msg || "取消关注成功"), true; } return this.log(ll1lilli), false; } async["wxApi"](illI1lII, IIIIiI = {}) { return await this.taskPost(illI1lII, { "activityId": this.activityId, ...IIIIiI }); } async["getSimpleActInfoVo"](i1Il1II1 = "customer/getSimpleActInfoVo") { if (IlIIlIli.activity.activityType) { this.type = IlIIlIli.activity.type; this.venderId = IlIIlIli.activity?.["venderId"]; this.shopId = IlIIlIli.activity?.["shopId"]; this.activityType = IlIIlIli.activity?.["activityType"]; return; } let ii1lilii = await this.wxApi(i1Il1II1); if (ii1lilii && ii1lilii?.["result"] && ii1lilii?.["data"]) { IlIIlIli.activity = Object.assign(IlIIlIli.activity, ii1lilii?.["data"]); this.venderId = ii1lilii?.["data"]?.["venderId"]; this.shopId = ii1lilii?.["data"]?.["shopId"]; this.activityType = ii1lilii?.["data"]?.["activityType"]; const iII11IIl = { 5: "wxCollectionActivity", 6: "wxCollectionActivity", 7: "wxGameActivity", 11: "wxDrawActivity", 12: "wxDrawActivity", 13: "wxDrawActivity", 15: "sign", 16: "daily", 17: "wxShopFollowActivity", 18: "sevenDay", 20: "wxKnowledgeActivity", 24: "wxShopGift", 25: "wxShareActivity", 26: "wxPointDrawActivity", 42: "wxCollectCard", 46: "wxTeam", 65: "wxBuildActivity", 69: "wxFansInterActionActivity", 70: "wxCartKoi/cartkoi", 71: "wxSecond", 73: "wxShopGift", 100: "wxTeam", 102: "wxTeam", 103: "mc/wxMcLevelAndBirthGifts", 104: "mc/wxMcLevelAndBirthGifts", 119: "mc/wxMcLevelAndBirthGifts", 124: "wxScratchActive", 125: "wxPointBlindBox", 128: "wxGashaponActive", 129: "wxDollGrabbing", 204: "wxPointShop", 1001: "wxgame", 1002: "wxgame", 2001: "drawCenter", 2002: "drawCenter", 2003: "drawCenter", 2004: "drawCenter", 2006: "drawCenter" }; if (iII11IIl[this.activityType]) this.type = iII11IIl[this.activityType]; else { this.type = "wxDrawActivity"; } IlIIlIli.activity.type = this.type; } else { this.putMsg("手动确认,活动不存在或者已结束"); this.stop(); } return ii1lilii; } async["activityContent"](lIi1llIl = {}, lii11ll1 = "") { let I1l1Iill = await this.wxApi(this.type + "/activityContent", { "activityId": this.activityId, "pin": this.secretPin, ...lIi1llIl }); if (I1l1Iill && I1l1Iill?.["data"]) { let ll11iiII = lii11ll1 ? I1l1Iill.data[lii11ll1] : I1l1Iill.data, il1IIi1i = ll11iiII?.["startTime"], I11ili1i = ll11iiII?.["endTime"]; const iiilIiiI = ll11iiII?.["rule"] || ll11iiII?.["actRule"] || ""; try { if (!il1IIi1i || !I11ili1i) { const IIIlllI = /\d{4}-\d{2}-\d{2} \d{2}:\d{2}/g, iIIi1Il = iiilIiiI.match(IIIlllI); if (iIIi1Il) { il1IIi1i = new Date(iIIi1Il[0]).getTime(); I11ili1i = new Date(iIIi1Il[1]).getTime(); } } this.rule = iiilIiiI; IlIIlIli.activity.prizeList = this.rule.match(/奖品名称(:|:)(\S+)( |,)数量(:|:)(\d+)(个|份)/g) || this.rule.match(/[\u4E00-\u9FFF]等奖:(\S+) (\d+)份/g) || I11ili1i; IlIIlIli.activity.timeStr = this.formatDate(il1IIi1i, "yyyy-MM-dd HH:mm:ss") + "至" + this.formatDate(I11ili1i, "yyyy-MM-dd HH:mm:ss"); IlIIlIli.activity.startTime = il1IIi1i; IlIIlIli.activity.endTime = I11ili1i; } catch (l11i1l11) { } il1IIi1i && il1IIi1i > Date.now() && (this.putMsg("活动未开始"), IlIIlIli.activity.noStart = true, this.stop()); I11ili1i && I11ili1i < Date.now() && (this.putMsg("活动已结束"), await this.writeLongCacheByStop(), this.stop()); } return I1l1Iill; } async["getGiveContent"]() { let Il1liii = await this.wxApi("wxDrawActivity/getGiveContent", { "pin": this.secretPin }); if (Il1liii && Il1liii?.["data"]) { } return Il1liii; } async["initPinToken"](i111l1 = this.venderId, IlI1Ii = this.shopId) { let illlli1l = { "activityId": this.activityId, "jdToken": this.isvToken, "source": "01", "uuid": this.phoneInfo.uuid, "clientTime": Date.now() }, iiiii1Il = ""; this.mode === "100" ? (illlli1l = { ...illlli1l, "shareUserId": "", "shopId": IlI1Ii, "status": 1 }, iiiii1Il = "https://" + this.domain + this.prefix + "/api/user-info/initPinToken") : (illlli1l = { ...illlli1l, "venderId": i111l1, "fromType": "APP", "riskType": 1, "client": "iOS", "clientVersion": this.phoneInfo.clientVersion, "osVersion": this.phoneInfo.iv, "model": "iPhone" + this.phoneInfo.tf, "userAgent": this.ua.app }, iiiii1Il = "https://" + this.domain + "/customer/initPinToken"); let iiillI1 = await this.taskGet(this.mode === "wx" ? "customer/initPinToken" : "api/user-info/initPinToken", illlli1l); if (this.mode === "wx" && iiillI1 && iiillI1.result) this.secretPin = encodeURIComponent(iiillI1.data?.["secretPin"]), this.nickname = iiillI1.data?.["nickname"]; else this.mode === "100" && iiillI1 && iiillI1.resp_code === 0 ? this.pinToken = JSON.parse(iiillI1.data)?.["data"]?.["pinToken"] : (this.putMsg(iiillI1?.["errorMessage"] || iiillI1?.["data"] || iiillI1?.["resp_msg"]), this.wxStop(iiillI1?.["errorMessage"] || iiillI1?.["data"] || iiillI1?.["resp_msg"]), this.reseCookieStatus(), this.exit()); return iiillI1; } async["getMyPing"](ill11Ii = "customer/getMyPing", iIllI11I = this.isvToken, lI11IlIi = this.venderId) { let lIli1li1 = await this.wxApi(ill11Ii, { "userId": lI11IlIi, "token": iIllI11I, "fromType": "APP" }); if (lIli1li1 && lIli1li1?.["result"]) this.secretPin = lIli1li1.data?.["secretPin"], this.nickname = lIli1li1.data?.["nickname"]; else { let lllllIIi = lIli1li1?.["errorMessage"] || "获取pin失败"; this.putMsg(lllllIIi); this.wxStop(lllllIIi); lllllIIi.includes("请联系商家") && this.stop(); this.reseCookieStatus(); this.exit(); } return lIli1li1; } async["accessLog"](i1iiI1 = this.secretPin) { let I1IlIIIi = this.domain.includes("cjhy") ? "accessLog" : "accessLogWithAD"; await this.wxApi("common/" + I1IlIIIi, { "venderId": this.venderId, "code": this.activityType, "pin": i1iiI1, "activityId": this.activityId, "pageUrl": this.activityUrl, "subType": "app", "uuid": this.phoneInfo.uuid }); } async["saveAddress"](IlIl1ll1 = this.addressId, iI1liIi1 = this.prizeName) { IlIIlIli.isSaveAddress = true; this.getAddress(); if (!this.address) { this.putMsg("未配置地址或所有地址已达使用上限,退出填地址"); return; } if (iIl1IlI1.addressStopKeywords && iIl1IlI1.addressStopKeywords.some(iiIlli1i => { return iI1liIi1?.["includes"](iiIlli1i); })) { this.putMsg("触发关键词不填地址"); return; } if (iIl1IlI1.addressStopKeywordsRule && iIl1IlI1.addressStopKeywordsRule.some(II1iliii => { return this.rule?.["includes"](II1iliii); })) { this.putMsg("触发规则不填地址"); return; } this.log("使用地址", this.address); let liIIl1iI = false; if (this.mode == "wx") { this.address.generateId = IlIl1ll1; let iI1IliIi = await this.wxApi("wxAddress/save", { ...this.address, "venderId": this.venderId, "pin": this.secretPin, "activityId": this.activityId, "actType": this.activityType, "prizeName": iI1liIi1, "personalEmail": "" }); this.log(iI1IliIi); iI1IliIi && iI1IliIi.result ? (this.putMsg("已填地址"), liIIl1iI = true) : (this.putMsg("填地址失败"), this.putMsg(iI1IliIi.errorMessage)); } else { if (this.mode === "100") { const { phone: lIll1iiI, address: lIII1iIl, receiver: l1lll111, city: IlI111ll, county: liIliIii, province: i1I1i1ll } = this.address; let iI1li1Ii = { "mobile": lIll1iiI, "address": lIII1iIl, "realName": l1lll111, "city": IlI111ll, "county": liIliIii, "orderCode": IlIl1ll1, "province": i1I1i1ll }, illll1li = await this.lzkjApi("api/my/prize/update", iI1li1Ii); if (illll1li.resp_code === 0) this.putMsg("已填地址"), liIIl1iI = true; else { this.putMsg("填地址失败"); this.putMsg(illll1li.resp_msg); } } else { if (this.mode === "hdb") { const { phone: ll1lil1, address: liiIllil, receiver: IiliIlil, city: l1llIli1, county: i1li1III, province: lIil1l1 } = this.address; let l1ii1ilI = { "province": lIil1l1, "city": l1llIli1, "area": i1li1III, "detailAddress": liiIllil, "address": "" + lIil1l1 + l1llIli1 + i1li1III + liiIllil, "mobile": ll1lil1, "receiveName": IiliIlil, "activityLogId": IlIl1ll1 }, iill1lii = await this.hdbApi("postDeliveryInfo", l1ii1ilI); this.log(iill1lii); if (iill1lii && iill1lii.succ) this.putMsg("已填地址"), liIIl1iI = true; else { this.putMsg("填地址失败"); this.putMsg(iill1lii?.["message"]); } } else { if (this.mode === "hzbz") { const { phone: ll11iIli, address: I111111i, receiver: i1i1I1I1, city: liIilIi1, county: IiIiIiii, province: iII1Illi } = this.address; let ilil1lI1 = { "addressRegion": iII1Illi + "-" + liIilIi1 + "-" + IiIiIiii, "address": I111111i, "mobile": ll11iIli, "name": i1i1I1I1, "condtionId": "" }, I1111Iil = await this.hzbzApi("SaveUserInfo.json", ilil1lI1); this.log(I1111Iil); I1111Iil && I1111Iil.code === 0 ? (this.putMsg("已填地址"), liIIl1iI = true) : (this.putMsg("填地址失败"), this.putMsg(I1111Iil?.["txt"])); } else { if (this.mode === "jinggeng") { const { phone: l11i1I, address: illiI1II, receiver: liIll1, city: lilIi1i1, county: liiillli, province: i1ii11l1 } = this.address; let IiIii1ll = await this.jinggengApi("postBuyerInfo", { "receiverName": liIll1, "mobile": l11i1I, "address": i1ii11l1.replace("省", "").replace("市", "") + " " + lilIi1i1.replace("市", "") + " " + liiillli + illiI1II, "log_id": IlIl1ll1 }); this.log(IiIii1ll); IiIii1ll && IiIii1ll.succ ? (this.putMsg("已填地址"), liIIl1iI = true) : (this.putMsg("填地址失败"), this.putMsg(IiIii1ll?.["msg"])); } else { if (this.mode === "v2") { if (!this.activityPrizeId) return this.putMsg("activityPrizeId不存在,退出填地址"); const { phone: iii1lIlI, address: illIl1II, receiver: IIiliIlI, city: lI1lil1, county: lIl111II, province: l1lillli } = this.address; let li111lI = await this.v2Api("api/" + this.activityType + "/userAddressInfo", { "addressId": IlIl1ll1, "address": illIl1II, "county": lIl111II, "city": lI1lil1, "province": l1lillli, "mobile": iii1lIlI, "realName": IIiliIlI, "activityPrizeId": this.activityPrizeId }); this.log(li111lI); li111lI && li111lI.code === 200 ? (this.putMsg("已填地址"), liIIl1iI = true) : (this.putMsg("填地址失败"), this.putMsg(li111lI?.["message"])); } } } } } } if (liIIl1iI) { let iI1II1li = this.formatDate(Date.now(), "yyyy-MM-dd HH:mm:ss") + "," + iI1liIi1 + "," + this.pin + "," + this.address?.["phone"] + "," + this.address?.["address"] + "," + Iii1iI1i.envInfo.name + "," + (this.shopId ?? this.venderId) + "," + this.activityUrl + "\n"; this.appendFileSync("", "gifts.csv", iI1II1li); } IlIIlIli.isSaveAddress = false; } async["getPrize"](iI11Iil = false) { let Ill1li1i = await this.wxApi(this.type + "/getPrize", { "activityId": this.activityId, "pin": this.secretPin }); this.debug(Ill1li1i); if (Ill1li1i && Ill1li1i.result && Ill1li1i.data?.["drawOk"]) { this.putMsg(Ill1li1i.data.name || "空气"); iI11Iil && (await this.writeLongCache()); return; } let lIlIil = Ill1li1i?.["errorMessage"] || Ill1li1i?.["data"]?.["errorMessage"]; if (!lIlIil) return; return this.putMsg(lIlIil), this.wxStop(lIlIil), Ill1li1i; } async["login"](iiIlIilI = true, iliilIIi = this.isvToken) { if (this.mode === "100") { let I1IiliIl = { "activityId": this.activityId, "tokenPin": iliilIIi, "status": 1, "source": "01", "shareUserId": "", "uuid": this.phoneInfo.uuid, "client": "iOS", "clientVersion": this.phoneInfo.clientVersion, "osVersion": this.phoneInfo.iv, "model": "iPhone" + this.phoneInfo.tf, "userAgent": this.ua.app }; if (this.domain.includes("lzkj")) { } let i1i1iliI = await this.taskPostByJson("api/user-info/login", I1IiliIl); if (i1i1iliI && i1i1iliI.resp_code === 0) { this.token = i1i1iliI.data.token; this.headers.token = i1i1iliI.data.token; let liIllIl1 = this.haskey(i1i1iliI, "data.joinInfo.joinCodeInfo.joinCode"); this.joinDes = i1i1iliI.data.joinInfo.joinCodeInfo.joinDes; this.log("登录成功|" + liIllIl1 + "|" + this.joinDes); IlIIlIli.activity.shopId = i1i1iliI.data.shopId; this.shopId = i1i1iliI.data.shopId; this.joinCode = liIllIl1; const I1ii1l1 = /venderId=(\d+)/, iI1I1ll = i1i1iliI.data.joinInfo?.["openCardUrl"]; this.venderId = iI1I1ll ? iI1I1ll.match(I1ii1l1)[1] : this.shopId; IlIIlIli.activity = { ...IlIIlIli.activity, "shopId": this.shopId, "venderId": this.venderId }; if (liIllIl1 === "1003" || this.lzkjOpenCard && ["1005", "1002", "1006"].includes(liIllIl1) && !this.openCardTypes.includes(this.activityType)) return this.putMsg(this.joinDes), this.exit(); await this.lzkjApi("api/task/followShop/follow"); iiIlIilI && (await this.lzkjBaseInfo()); } else this.putMsg(i1i1iliI?.["resp_msg"] || "登录失败"), this.wxStop(i1i1iliI?.["resp_msg"]), this.exit(); return i1i1iliI; } else { if (["hdb"].includes(this.mode)) { let l11li1li = await this.taskPostByJson("front/fans/login", { "appJsonParams": { "id": this.activityId, "source": "01", "userId": this.userId, "token": iliilIIi, "method": "/front/fans/login" }, "sysParams": { "sign": "111111", "timestamp": 123456, "sysmethod": "/front/fans/login" } }); if (l11li1li && l11li1li?.["code"] == 200) this.buyerNick = l11li1li?.["result"]?.["buyerNick"], this.aesBuyerNick = l11li1li?.["result"]?.["aesBuyerNick"], this.userId = l11li1li?.["result"]?.["userId"], this.openCard = l11li1li?.["result"]?.["openCard"], IlIIlIli.activity.shopId = this.userId, IlIIlIli.activity.venderId = this.userId; else { if (l11li1li?.["message"]?.["includes"]("商家订购过期")) this.putMsg("商家订购过期"), this.stop(); else { this.putMsg(l11li1li?.["message"] || "登录失败"); this.exit(); } } return l11li1li; } else { if (this.mode === "v2") { let Il1IiIl = await this.v2Api("api/user/login", { "token": iliilIIi, "source": "01", "activityType": this.activityType, "templateCode": this.templateCode, "activityId": this.activityId, "shopId": this.shopId, "uuid": this.phoneInfo.uuid, "timestamp": this.timestamp() }); if (Il1IiIl && Il1IiIl?.["code"] === 200) { this.headers["Pin-Token"] = Il1IiIl?.["data"]?.["pinToken"]; this.headers["Activity-Id"] = this.activityId; this.headers["Shop-Id"] = this.shopId; this.headers["Activity-Type"] = this.activityType; this.headers["Template-Code"] = this.templateCode; this.secretPin = Il1IiIl?.["data"]?.["encryptPin"]; await this.getActivityBase(); } else this.putMsg(Il1IiIl?.["message"] || "登录失败"), this.exit(); return Il1IiIl; } } } } async["lzkjBaseInfo"]() { this.needPinToken && (await this.initPinToken()); await this.basicInfo(); await this.getPrizeList(); let activityContent = await this.lzkjApi("api/task/daySign/activity"); if (activityContent.data?.signPiize) { IlIIlIli.activity.daysign = activityContent.data?.signPiize } let prizeList1 = await this.lzkjApi("/api/task/sign/prizeList"); if (prizeList1.data?.prizeInfo) { IlIIlIli.activity.prizeList1 = prizeList1.data?.prizeInfo } this.prizeList && this.prizeList.length > 0 && this.prizeList.filter(iIllii1l => ![2].includes(iIllii1l.prizeType) && iIllii1l.leftNum !== 0).length === 0 && (this.putMsg("垃圾活动"), this.stop()); if (!["1001", "1004"].includes(this.joinCode) && this.openCardTypes.includes(this.activityType)) return await this.bindWithVender(), await this.login(false); if (this.joinCode === "1004") await this.login(false); } async["basicInfo"]() { let IIIi1lII = await this.taskPostByJson("api/active/basicInfo", { "activityId": this.activityId }); if (IIIi1lII && IIIi1lII.resp_code === 0) { const ll1ililI = { 10001: { "name": "签到抽奖", "api": "sign" }, 10002: { "name": "签到抽奖", "api": "sign" }, 10003: { "name": "签到抽奖", "api": "sign" }, 10004: { "name": "签到抽奖", "api": "sign" }, 10006: { "name": "邀好友", "api": "member" }, 10011: { "name": "答题有礼", "api": "knowledge" }, 10020: { "name": "幸运抽奖", "api": "jiugongge" }, 10021: { "name": "幸运抽奖", "api": "jiugongge" }, 10022: { "name": "每日抢好礼", "api": "dailyGrabs" }, 10023: { "name": "签到有礼", "api": "daySign" }, 10024: { "name": "加购有礼", "api": "addSku" }, 10025: { "name": "关注店铺", "api": "followShop" }, 10026: { "name": "积分抽奖", "api": "points" }, 10027: { "name": "积分PK", "api": "integralPk" }, 10030: { "name": "下单有礼", "api": "orderGift" }, 10031: { "name": "幸运抽奖", "api": "niudanji" }, 10032: { "name": "集卡有礼", "api": "collectCard" }, 10033: { "name": "组队瓜分", "api": "organizeTeam" }, 10034: { "name": "神券裂变", "api": "fissionCoupon" }, 10035: { "name": "秒读手速", "api": "dmpss" }, 10036: { "name": "购物车锦鲤", "api": "addSkuPrice" }, 10040: { "name": "签到有礼", "api": "daySign" }, 10041: { "name": "幸运抽奖", "api": "lotteryCenter" }, 10042: { "name": "幸运抽奖", "api": "lotteryCenter" }, 10043: { "name": "分享有礼", "api": "sharePolitely" }, 10044: { "name": "投票抽奖", "api": "votePolitely" }, 10045: { "name": "买家秀", "api": "buyersShow" }, 10046: { "name": "幸运抽奖", "api": "lotteryCenter" }, 10047: { "name": "盖楼有礼", "api": "building" }, 10048: { "name": "限时抢券", "api": "robCoupon" }, 10049: { "name": "完善信息", "api": "perfectInfo" }, 10053: { "name": "关注商品", "api": "followGoods" }, 10054: { "name": "上上签抽奖", "api": "upperSign" }, 10058: { "name": "店铺礼包", "api": "shopGift" }, 10059: { "name": "合成大赢家", "api": "bigwinner" }, 10060: { "name": "新人优惠券", "api": "couponMarketing" }, 10063: { "name": "翻牌抽奖", "api": "lotteryCenter" }, 10062: { "name": "翻牌抽奖", "api": "lotteryCenter" }, 10068: { "name": "邀请关注", "api": "inviteFollowShop" }, 10069: { "name": "关注有礼", "api": "lkFollowShop" }, 10070: { "name": "邀请入会", "api": "member" }, 10073: { "name": "幸运抽奖", "api": "lotteryCenter" }, 10077: { "name": "首购有礼", "api": "first/buy" }, 10078: { "name": "满额有礼", "api": "consumptionGift" }, 10079: { "name": "积分兑换", "api": "pointsExchange" }, 10080: { "name": "积分刮刮乐", "api": "points" }, 10081: { "name": "答题有礼", "api": "questionnaire" }, 10082: { "name": "互动游戏", "api": "game" }, 10084: { "name": "互动游戏", "api": "game" }, 10086: { "name": "互动游戏", "api": "game" }, 10089: { "name": "互动游戏", "api": "game" }, 10091: { "name": "互动游戏", "api": "game" }, 10092: { "name": "互动游戏", "api": "game" }, 10093: { "name": "互动游戏", "api": "game" }, 10094: { "name": "互动游戏", "api": "game" }, 10095: { "name": "互动游戏", "api": "game" }, 335: { "name": "入会有礼", "api": "rights" } }, { shopName: IliIIIiI, startTime: II1illi1, endTime: IIIi1i1I, actType: iIl111li } = IIIi1lII.data; this.actType = iIl111li; this.type = ll1ililI[iIl111li]?.["api"]; this.shopName = IliIIIiI; const ii11Ii11 = this.formatDate(II1illi1, "yyyy-MM-dd HH:mm:ss") + "至" + this.formatDate(IIIi1i1I, "yyyy-MM-dd HH:mm:ss"); IlIIlIli.activity = { ...IlIIlIli.activity, "shopName": IliIIIiI, "actType": iIl111li, "startTime": II1illi1, "endTime": IIIi1i1I, "timeStr": ii11Ii11 }; II1illi1 && II1illi1 > Date.now() && (this.putMsg("活动未开始"), IlIIlIli.activity.noStart = true, this.stop()); IIIi1i1I && IIIi1i1I < Date.now() && (this.putMsg("活动已结束"), await this.writeLongCacheByStop(), this.stop()); if (!this.type) { this.putMsg("未知类型"); this.exit(); return; } } return IIIi1lII; } async["getDefenseUrls"]() { if (IlIIlIli.activity.defenseUrls) return this.defenseUrls = IlIIlIli.activity.defenseUrls; const { domain: Iil11ll1, mode: IilllIil } = this; let lili1lll; if (IilllIil === "wx") lili1lll = "https://" + Iil11ll1 + "/customer/getDefenseUrls"; else { if (IilllIil === "100") lili1lll = "https://" + this.domain + this.prefix + "/api/user-info/getDefenseUrls"; else { this.defenseUrls = []; return; } } let iiillIII = await this.jd_api({ "url": lili1lll, "maxRedirects": 0 }, false); if (this.haskey(iiillIII, "data")) { this.defenseUrls = IilllIil === "wx" ? iiillIII.data : iiillIII.data.map(l11lii => l11lii.interfaceName); } else { this.defenseUrls = []; } IlIIlIli.activity.defenseUrls = this.defenseUrls; } async["getPrizeList"]() { if (IlIIlIli.activity.prizeList) { this.prizeList = IlIIlIli.activity.prizeList; return; } let liIi1I11 = await this.lzkjApi("api/prize/drawPrize"); liIi1I11 && liIi1I11.resp_code === 0 && (this.prizeList = liIi1I11.data?.["prizeInfo"] ?? [], IlIIlIli.activity.prizeList = this.prizeList); } async["getUserId"]() { let lii1I111 = await this.lzkjApi("api/task/share/getUserId"); return lii1I111 && lii1I111.resp_code === 0 && (this.shareUserId = lii1I111.data?.["shareUserId"]), lii1I111; } async["lzkjToDo"](illi11ii, Ii1ill1 = "", IIiIl1Ii = 0) { let iii11I = { 1: "关注店铺", 2: "浏览店铺", 3: "浏览商品", 4: "浏览会场/直播", 5: "关注商品", 6: "预约商品", 7: "加购商品", 8: "购买商品", 9: "分享商品", 10: "分享店铺", 11: "分享会场", 12: "分享活动", 13: "会员开卡", 14: "每日签到", 15: "邀请助力", 22: "购买商品" }, III1I1ii = await this.lzkjApi("api/basic/task/toDo", { "taskId": illi11ii, "skuId": Ii1ill1 }); if (III1I1ii && III1I1ii.resp_code === 0) { return this.log("任务[" + (iii11I[IIiIl1Ii] || illi11ii || IIiIl1Ii) + "]完成"), true; } return false; } async["lzkjTask"](ilIl11i = []) { try { if (ilIl11i.length > 0) { for (let liIli1li of ilIl11i) { if (liIli1li.status === 1) continue; const { taskType: iIi1ll1I, taskId: iIllll, completeCount: I1I11il1, oneClickPurchase: iIi1i1ii, finishNum: Il1IIIi1, maxNum: iIi1II11, oneClickFollowPurchase: l1liI1Ii, activeLimit = {} } = liIli1li; if ([8, 13, 15, 22].includes(iIi1ll1I)) continue; if ([1, 14].includes(iIi1ll1I)) { await this.lzkjToDo(iIllll, "", iIi1ll1I); continue; } if (iIi1i1ii === 0 || l1liI1Ii === 0) { await this.lzkjToDo(iIllll, "", iIi1ll1I); continue; } let ilIIi1iI = liIli1li.shareCount || liIli1li.completeCount || 0, IIli1II = (iIi1II11 ?? activeLimit?.["limitNum"] ?? 1) * Il1IIIi1; if (ilIIi1iI < IIli1II) { let I1iliili = liIli1li?.["skuInfoVO"]?.["filter"](liliiIi => liliiIi?.["status"] === 0); for (let lllIl1li = 0; lllIl1li < IIli1II; lllIl1li++) { await this.lzkjToDo(iIllll, I1iliili?.[lllIl1li]?.["skuId"] || "", iIi1ll1I); ilIIi1iI++; if (ilIIi1iI >= IIli1II) break; } } } } } catch (i11l1iii) { this.log(i11l1iii.message); } } async["acquire"](l1ii1l1l) { let iI1I11l = await this.lzkjApi("api/prize/receive/acquire", { "prizeInfoId": l1ii1l1l, "status": 1 }); if (iI1I11l && iI1I11l.resp_code === 0) { this.putMsg(iI1I11l.data?.["prizeName"]); iI1I11l.data.prizeType === 3 && (this.addressId = iI1I11l.data?.["addressId"], this.prizeName = iI1I11l.data?.["prizeName"], await this.saveAddress()); return; } this.putMsg(iI1I11l?.["resp_msg"]); this.wxStop(iI1I11l?.["resp_msg"]); } async["lzkjApi"](i1i1Ilil, IiIIiIlI = {}) { return await this.taskPostByJson(i1i1Ilil, IiIIiIlI, { "token": this.token }); } ["getHmacSha256Sign"](il1II1i1, i1IlliIl) { const ilIiil1l = "actid" + this.activityId + "buyernick" + this.aesBuyerNick + "sysmethod" + il1II1i1 + "timestamp" + i1IlliIl; return this.hmacSHA256(this.getCookieByName("_sk") || "1111", ilIiil1l); } async["hdbApi"](li11liiI, liIiIi1i = {}, Il11lii1 = false, Iiill1ll = true) { let IiIi1iIi = Il11lii1 ? "/front/task/" + li11liiI : "/front/activity/" + li11liiI, iIlI1i1I = await this.taskPostByJson(IiIi1iIi, { "appJsonParams": { "id": this.activityId, "userId": this.userId, "method": IiIi1iIi, "buyerNick": this.aesBuyerNick, ...liIiIi1i } }); if (iIlI1i1I && /数字签名不匹配|数字签名已失效|用户未登录/.exec(iIlI1i1I?.["message"]) && Iiill1ll) return await this.login(), await this.hdbApi(li11liiI, liIiIi1i, Il11lii1, false); return iIlI1i1I; } async["loadFrontAct"]() { let iIlIi11I = await this.hdbApi("loadFrontAct"); if (iIlIi11I && iIlIi11I?.["succ"]) { IlIIlIli.activity.shopName = iIlIi11I?.["result"]?.["activity"]?.["shopTitle"]; let ll1lilll = iIlIi11I.result?.["activity"]?.["startTime"], i1I11I1I = iIlIi11I.result?.["activity"]?.["endTime"], IiIiIll1 = iIlIi11I.result?.["user"]?.["shopId"], I11Ilil = iIlIi11I.result?.["user"]?.["venderId"]; this.shopId = IiIiIll1; this.venderId = I11Ilil; IlIIlIli.activity.actType = iIlIi11I.result?.["activity"]?.["actType"]; IlIIlIli.activity = { ...IlIIlIli.activity, "shopId": IiIiIll1, "venderId": I11Ilil, "startTime": ll1lilll, "endTime": i1I11I1I }; let prizedata = iIlIi11I.result.activity.remark; IlIIlIli.activity.hdbprizedata = prizedata; await this.loadFrontAward(this.hdbPrefix + "front/activity/loadFrontAward"); ll1lilll && ll1lilll > Date.now() && (this.putMsg("活动未开始"), IlIIlIli.activity.noStart = true, this.stop()); if (i1I11I1I && i1I11I1I < Date.now()) { this.putMsg("活动已结束"); await this.writeLongCacheByStop(); this.stop(); } } } async["reportPVUV"]() { await this.hdbApi("reportPVUV"); } async["loadFrontAward"]() { let IIIilIlI = await this.hdbApi("loadFrontAward"); if (IIIilIlI && IIIilIlI.succ) { // this.prizeList = IIIilIlI.result ?? []; let prizes = IIIilIlI.result || [] IlIIlIli.activity.prizeList = prizes; IlIIlIli.activity.prizeList.length > 0 && IlIIlIli.activity.prizeList.filter(IIIIiIil => !["JD_D_COUPON"].includes(IIIIiIil.awardType)).length === 0 && (this.putMsg("垃圾活动"), this.stop()); } return IIIilIlI; } ["formatDateString"](llliliIl) { if (llliliIl?.["match"](/\d{4}年\d{1,2}月\d{1,2}日\d{2}:\d{2}:\d{2}/)) return llliliIl.replace(/(\d{4})年(\d{1,2})月(\d{1,2})日(\d{2}:\d{2}:\d{2})/, "$1-$2-$3 $4"); return llliliIl; } async["getRuleSETime"](illiIli1 = this.rule) { const IlilIiii = /(\d{4}-\d{1,2}-\d{1,2} \d{2}:\d{2}|\d{4}-\d{1,2}-\d{1,2}\s\d{2}:\d{2}:\d{2}|\d{4}年\d{1,2}月\d{1,2}日\d{2}:\d{2}:\d{2})/g, I1IlI1li = illiIli1.match(IlilIiii); if (I1IlI1li) { const illI11lI = this.formatDateString(I1IlI1li[0]), Il11ll = this.formatDateString(I1IlI1li[1]); this.startTime = new Date(illI11lI).getTime(); this.endTime = new Date(Il11ll).getTime(); IlIIlIli.activity.startTime = this.startTime; IlIIlIli.activity.endTime = this.endTime; this.startTime && this.startTime > Date.now() && (this.putMsg("活动未开始"), IlIIlIli.activity.noStart = true, this.stop()); this.endTime && this.endTime < Date.now() && (this.putMsg("活动已结束"), await this.writeLongCacheByStop(), this.stop()); } } async["jinggengShopInfo"]() { let iiilIlII = await this.taskGet(this.activityUrl); if (iiilIlII) { let lIlll = lIl1ii.load(iiilIlII); const lii1llli = lIlll("#shop_sid").attr("value"), l1illi1l = lIlll("#shop_title").attr("value"), actType = lIlll("#actType").attr("value"), lIIiI1lI = lIlll("#description").text(); this.debug("shop_sid", lii1llli); this.shopId = lii1llli; this.venderId = this.userId; this.shopName = l1illi1l; this.rule = lIIiI1lI; this.buyerSign = lIlll('#buyerSign')?.val() || ''; if (this.activityUrl.includes("loadBlindBox")) { if (this.activityUrl.includes("loadBlindBox")) { IlIIlIli.activity.prizeList = JSON.parse(lIlll('#jdEquityList').attr("value")); } else { IlIIlIli.activity.prizeList = JSON.parse(lIlll('#awards', 'body').text()); } } if (this.activityUrl.includes("showSign")) { let description = this.rule.replace(/;/g, '\n'); let dailySignIn = []; let continuousSignIn = []; for (const item of description.split("\n")) { let dailySignInMatch = item.match(/每日签到赠送(\d+)([\u4e00-\u9fa5]{2})/); if (dailySignInMatch) { dailySignIn.push({ type: "每日签到", quantity: parseInt(dailySignInMatch[1]), unit: (dailySignInMatch[2]) }); } let continuousSignInMatch = item.match(/连续签到(\d+)天,赠送(\d+)([\u4e00-\u9fa5]{2})/); if (continuousSignInMatch) { continuousSignIn.push({ type: "连续签到", dayNum: parseInt(continuousSignInMatch[1]), quantity: parseInt(continuousSignInMatch[2]), unit: continuousSignInMatch[3] }); } } IlIIlIli.activity.prizeList = [...dailySignIn, ...continuousSignIn]; } const IllIll11 = lIlll("title").text(); return IlIIlIli.activity.shopName = this.shopName, IlIIlIli.activity.shopId = this.shopId, IlIIlIli.activity.venderId = this.venderId, IlIIlIli.activity.actType = actType, await this.getRuleSETime(lIIiI1lI), IllIll11?.["includes"]("已结束") && (this.putMsg("活动已结束"), await this.writeLongCacheByStop(), this.stop()), lIlll; } return undefined; } async["setMixNick"](IllillI = this.isvToken) { let IlII1i1 = await this.taskPost("front/setMixNick", { "strTMMixNick": IllillI, "userId": this.userId, "source": "01" }); return this.debug(IlII1i1), IlII1i1 && IlII1i1.succ && (this.mixNick = IlII1i1?.["msg"]), IlII1i1 && IlII1i1?.["msg"]?.["includes"]("商家token过期") && (this.putMsg("商家token过期"), this.stop()), !this.mixNick && (this.putMsg("获取mixNick失败"), this.exit()), IlII1i1; } async["jinggengApi"](Iill1llI, I1illiI = {}) { let I1Il1l1I = await this.taskPost("ql/front/" + Iill1llI, { "act_id": this.activityId, "user_id": this.userId, ...I1illiI }, { "buyerSign": this.buyerSign }); return I1Il1l1I; } async["gzslApi"](l1lliil1, i1lIiiI = {}, Illl1lII = false) { let Iil1l1 = { "token": this.isvToken, "source": "01", "activityId": this.activityId, ...i1lIiiI }; Illl1lII && (Iil1l1.wxToken = this.isvToken); let li1II1il = await this.taskPostByJson("wuxian/user/" + l1lliil1 + "/" + this.activityId + (Illl1lII ? "?wxToken=" + encodeURIComponent(this.isvToken) : ""), Iil1l1); return li1II1il; } async["hzbzInfo"]() { let lI1liilI = await this.taskGet(this.activityUrl); if (!lI1liilI) return; let lIiliI11 = this.textToHtml(lI1liilI), i1il1Ili = lIiliI11("#draw_info").text(); i1il1Ili = this.parseJSON(i1il1Ili); let iIIiI111 = i1il1Ili?.["stime"] || 0, IIlIll1I = i1il1Ili?.["etime"] || 0; this.shopName = i1il1Ili?.["shopName"]; this.shopId = i1il1Ili?.["shopId"]; this.rule = i1il1Ili?.["drawRule"]; IlIIlIli.activity.shopId = this.shopId; IlIIlIli.activity.venderId = this.shopId; IlIIlIli.activity.shopName = this.shopName; IlIIlIli.activity.startTime = iIIiI111; IlIIlIli.activity.endTime = IIlIll1I; if (iIIiI111 && iIIiI111 > this.timestamp()) { this.putMsg("活动未开始"); this.stop(); return; } if (IIlIll1I && IIlIll1I < this.timestamp()) { this.putMsg("活动已结束"); await this.writeLongCacheByStop(); this.stop(); return; } return lIiliI11; } async["hzbzApi"](lilli1i1, liI1liI = {}) { let l1iilI1 = await this.taskPost("bigdraw/" + lilli1i1, liI1liI); return l1iilI1; } // async ["v2Api"](llII1iI, I1IIiiii = undefined) { // let ii1Ii1li = await this.taskPostByJson(llII1iI, this.encryptCrypto("AES", "CBC", "Pkcs7", "2JjUvJEAsA2Yog==", JSON.stringify(I1IIiiii, null, 2), "Hd5W5ONsYKmGm9QA")); // return ii1Ii1li && ii1Ii1li.data && (ii1Ii1li.data = ii1Ii1li?.["data"] ? this.str2Json(this.decryptCrypto("AES", "CBC", "Pkcs7", "2JjUvJEAsA2Yog==", ii1Ii1li.data, "Hd5W5ONsYKmGm9QA")) : ii1Ii1li.data), ii1Ii1li; // } async["v2Api"](I1111lii, l11llII = undefined) { let I1Ill = await this.taskPostByJson(I1111lii, this.encryptCrypto("AES", "CBC", "Pkcs7", "2JjUvJEAsA2Yog==", JSON.stringify(l11llII, null, 2), "Hd5W5ONsYKmGm9QA")); return I1Ill && I1Ill.data && (I1Ill.data = I1Ill?.["data"] ? this.str2Json(this.isDataEncrypted(I1Ill.data) ? this.decryptCrypto("AES", "CBC", "Pkcs7", "2JjUvJEAsA2Yog==", I1Ill.data, "Hd5W5ONsYKmGm9QA") : I1Ill.data) : I1Ill.data), I1Ill; } ["isDataEncrypted"](str) { try { // 尝试对字符串进行Base64解码 const decodedStr = atob(str); // 检查解码后的字符串是否包含可读字符 return !/ ^ [\x00 -\x7F] *$/.test(decodedStr); // 如果不全是ASCII字符,则可能是加密的 } catch (err) { // 如果解码失败,说明不是有效的Base64字符串 return false; } } async["getActivityBase"]() { let Iiii1iil = await this.v2Api("api/common/getActivityBase"); // this.debug(Iiii1iil); if (Iiii1iil && Iiii1iil.code === 200) { this.shopName = Iiii1iil.data.shopName; let IiilIil1 = Iiii1iil.data.startTime, IliIliIl = Iiii1iil.data.endTime, jdActivityType = Iiii1iil.data.jdActivityType, IIlIli = Iiii1iil.data.openCardLink ?? ""; this.venderId = this.getQueryString(IIlIli, "venderId") ?? this.shopId; IiilIil1 && IiilIil1 > this.timestamp() && (this.putMsg("活动未开始"), IlIIlIli.activity.noStart = true, this.stop()); IliIliIl && IliIliIl < this.timestamp() && (this.putMsg("活动已结束"), await this.writeLongCacheByStop(), this.stop()); let li1Ii11I = Iiii1iil.data.thresholdResponseList ?? []; for (let illi1l11 of li1Ii11I) { if (illi1l11?.["type"] === 2 || illi1l11?.["type"] === 1) { await this.v2Api("api/common/followShop"); if (illi1l11?.["type"] === 1) this.openCard = false; continue; } } IlIIlIli.activity.shopName = this.shopName; IlIIlIli.activity.startTime = IiilIil1; IlIIlIli.activity.endTime = IliIliIl; IlIIlIli.activity.shopId = this.shopId; IlIIlIli.activity.venderId = this.venderId; IlIIlIli.activity.activityType = jdActivityType; return; } this.putMsg(Iiii1iil?.["message"] || "获取活动信息失败"); this.wxStop(Iiii1iil?.["message"]); this.exit(); } async["v2getRule"]() { let Iiii1iil = await this.taskGet("api/common/getRule"); if (Iiii1iil && Iiii1iil.code === 200) { let prizedata = Iiii1iil.data; IlIIlIli.activity.prizedata = prizedata; return; } this.exit(); } async["v2getPrizes"]() { let Iiii1iil = await this.v2Api("api/" + this.activityType + "/getPrizes"); this.debug(Iiii1iil); if (Iiii1iil && Iiii1iil.code === 200) { let prizeList = Iiii1iil.data; IlIIlIli.activity.prizeList = prizeList; return; } this.exit(); } async["v2getPrizeList"]() { let Iiii1iil = await this.v2Api("api/" + this.activityType + "/getPrizeList"); this.debug(Iiii1iil); if (Iiii1iil && Iiii1iil.code === 200) { let prizeList = Iiii1iil.data; IlIIlIli.activity.prizeList = prizeList; return; } this.exit(); } async["v2Task"]() { let l11lIii = await this.v2Api("api/" + this.activityType + "/getTask"); this.debug(l11lIii); if (l11lIii && l11lIii.code === 200) { let llI1lIll = l11lIii?.["data"] || []; for (let liIIiIli of llI1lIll) { if (liIIiIli.taskFinishGiveAllLotteryCount >= liIIiIli.totalLimit) continue; switch (liIIiIli.taskType) { case 2: case 10: case 12: await this.v2ToDoTask(liIIiIli.taskType); break; case 5: case 7: case 9: if ([5, 7].includes(liIIiIli.taskType) && liIIiIli.optWay === 2) { this.debug("一键任务"); await this.v2ToDoTask(liIIiIli.taskType); break; } let IiI1il1l = liIIiIli.taskType === 5 ? "getFollowSkuTaskSkuList" : liIIiIli.taskType === 7 ? "getTaskAddSku" : "getShareSkuTaskSkuList", i11Iilll = await this.v2Api("api/" + this.activityType + "/" + IiI1il1l), i1Iili1 = [5, 9].includes(liIIiIli.taskType) ? i11Iilll?.["data"]?.["filter"](lIli1II => !lIli1II.isOperated) || [] : i11Iilll?.["data"]?.["filter"](ll1Iil11 => ll1Iil11.status === 0) || []; for (let l1I1l1il = liIIiIli.taskUnitFinishCount || 0; l1I1l1il < Math.min(liIIiIli.perOperateCount * liIIiIli.limit, i1Iili1.length); l1I1l1il++) { await this.v2ToDoTask(liIIiIli.taskType, i1Iili1.shift().skuId); } break; } } } } async["v2ToDoTask"](liil1iII, liliI11I = "", iiIiIIii = null) { let IllII1il = { 2: "浏览店铺", 5: "关注商品", 7: "加购商品", 8: "购买商品", 9: "分享商品", 10: "分享店铺", 12: "分享活动" }, lIi1lI1 = iiIiIIii ?? { 2: "browseShop", 5: "followSku", 7: "addSku", 9: "shareSku", 10: "shareShop", 12: "shareActivity" }, il11iil = await this.v2Api("api/" + this.activityType + "/" + lIi1lI1[liil1iII], { "skuId": liliI11I }); this.debug(il11iil, "api/" + this.activityType + "/" + lIi1lI1[liil1iII], liliI11I); if (il11iil && il11iil.code === 200) return this.log("任务[" + (IllII1il[liil1iII] || liliI11I || liil1iII) + "]完成"), il11iil.data; } } class lI1l11l1 { constructor(iIillIii) { this.activityUrl = iIillIii; this.switchInterval = iIl1IlI1.wxProxyInterval; this.proxyEnable = false; this.proxyState = true; this.wxProxyMode = iIl1IlI1.wxProxyMode; this.proxie = null; this.currentIndex = 0; this.isLocked = false; this.wxProxyCheck = iIl1IlI1.wxProxyCheck; this.subscriptionUrls = typeof iIl1IlI1.wxProxyUrl === "string" ? iIl1IlI1.wxProxyUrl.split("@").filter(i1lIil1i => i1lIil1i && i1lIil1i.trim()).map((l1iIi1i, IIiI1Iii) => { return { "name": IIiI1Iii + 1, "url": l1iIi1i, "priority": 1, "enabled": true }; }) : iIl1IlI1.wxProxyUrl.filter(Ii1iI1 => Ii1iI1.enabled).sort((illiii11, ll11IIIl) => ll11IIIl.priority - illiii11.priority); } ["log"](...Il1iIlIl) { iIl1IlI1.logger.info("proxy|", ...Il1iIlIl); } ["updateProxyEnable"](Iiillii) { !Iiillii && (this.proxie = null, this.proxyState = false); this.proxyEnable = Iiillii; } async ["acquireLock"]() { if (!this.isLocked) return this.isLocked = true, {}; while (this.isLocked) { await new Promise(iilI1l => setTimeout(iilI1l, 100)); } return {}; } ["releaseLock"]() { this.isLocked = false; } async ["fetchProxies"](liI111li = 10) { if (this.subscriptionUrls.length === 0) return this.log("没有启用的代理订阅地址"), false; let lll1111 = 0; const { name = lll1111, url: iilI1Il1 } = this.subscriptionUrls[lll1111]; try { const Ii1lIIIl = await IliilIlI.get(iilI1Il1), il11l1Ii = typeof Ii1lIIIl.data === "object" && Ii1lIIIl.data !== null ? JSON.stringify(Ii1lIIIl.data) : Ii1lIIIl.data, i111IlIl = /((\w+:\w+@\w+\.\w+:\d+)|(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d+)|([\w-]+\.[\w.-]+:\d+))(?![\u4e00-\u9fa5])/g, i1lIIil1 = il11l1Ii.match(i111IlIl); if (i1lIIil1) { this.log("已成功从[" + name + "]提取[" + i1lIIil1.length + "]ip"); if (this.wxProxyMode === 2) this.proxie = i1lIIil1; else { this.proxie = [i1lIIil1[0]]; this.log("获取到的ip:" + this.proxie[0]); if (this.wxProxyCheck === 1 && !(await this.checkPing(this.proxie[0]))) { if (liI111li > 0) { return this.log(this.proxie[0] + "不通,正在重新获取..."), await new Promise(iliII111 => setTimeout(iliII111, 2000)), await this.fetchProxies(liI111li - 1); } else return false; } } return true; } else { this.log(il11l1Ii); const illllIi1 = "[" + name + "]提取ip失败"; this.subscriptionUrls.splice(lll1111, 1); if (this.subscriptionUrls.length === 0) return this.log(illllIi1 + ",已无可用代理地址,退出代理"), false; return this.log(illllIi1 + ",降级提取"), await this.fetchProxies(liI111li - 1); } } catch (I1IliI1l) { const lI11i11l = "[" + name + "]订阅地址失效"; this.subscriptionUrls.splice(lll1111, 1); if (this.subscriptionUrls.length === 0) { return this.log(lI11i11l + ",已无可用代理地址,退出代理"), false; } return this.log(lI11i11l + ",降级提取"), await this.fetchProxies(liI111li); } } async ["setCurrentProxy"](lIlliIII = false) { if (!this.proxyState) return false; if (!lIlliIII && this.wxProxyMode === 2 && this.proxie?.["length"] > 0) return true; if (!this.isLocked) { this.lock = await this.acquireLock(); try { if (this.subscriptionUrls.length === 0) return false; if (!(await this.fetchProxies())) return this.log("获取代理ip失败,退出代理"), this.updateProxyEnable(false), false; return true; } finally { this.releaseLock(); } } else return await this.acquireLock(), true; } async ["getProxy"](Ill1Ili = 10) { let i111ll1 = this.proxie.shift(); if (!i111ll1 && Ill1Ili <= 0) return null; if (!i111ll1) return await this.setCurrentProxy(), await this.getProxy(Ill1Ili - 1); if (this.wxProxyCheck === 1 && !(await this.checkPing(i111ll1))) return Ill1Ili > 0 ? (this.log(i111ll1 + "不通,正在重新获取..."), await this.getProxy(Ill1Ili - 1)) : null; return i111ll1; } ["cleanProxy"]() { this.proxie = null; } async ["getCurrentProxy"]() { if (!this.proxyEnable) { return null; } return (!this.proxie || this.proxie?.["length"] === 0) && (await this.setCurrentProxy()), this.proxie ? this.proxie.length === 1 && this.wxProxyMode === 1 ? this.proxie[0] : await this.getProxy() : null; } async ["checkPing"](liI1iiii) { try { const liil1li = liI1iiii.split(":"); if (liil1li.length !== 2) return false; return await I1II1lIl({ "url": this.activityUrl || "https://www.jd.com", "headers": { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" }, "httpsAgent": new IIIlIII1("http://" + liI1iiii), "timeout": 4000 }), true; } catch (ii1I1IIl) { return false; } } } class iIIIili1 { constructor(iI111iii, Illliill) { this.cookies = iI111iii; this.TaskClass = Illliill; this._tasks = {}; } *["taskGenerator"]() { for (let i1IIllii = 0; i1IIllii < this.cookies.length; i1IIllii++) { !(i1IIllii in this._tasks) && (this._tasks[i1IIllii] = new this.TaskClass(i1IIllii, this.cookies[i1IIllii])); yield this._tasks[i1IIllii]; } } ["getTask"](iiI1li1i) { return !(iiI1li1i in this._tasks) && iiI1li1i < this.cookies.length && (this._tasks[iiI1li1i] = new this.TaskClass(iiI1li1i, this.cookies[iiI1li1i])), this._tasks[iiI1li1i]; } get ["cookie_all_obj"]() { const li11llli = this; return new Proxy([], { "get"(iIiilIi, Ill11li1) { if (Ill11li1 === "length") return li11llli.cookies.length; if (typeof Ill11li1 === "string" && !isNaN(Ill11li1)) { const Il1I1lIl = Number(Ill11li1); if (Il1I1lIl < li11llli.cookies.length) { return li11llli.getTask(Il1I1lIl); } } return iIiilIi[Ill11li1]; }, "ownKeys"() { return Array.from({ "length": li11llli.cookies.length }, (i11lIii, iliIll1l) => String(iliIll1l)); }, "getOwnPropertyDescriptor"(ll1lII1, IlIiiI1I) { if (typeof IlIiiI1I === "string" && !isNaN(IlIiiI1I)) { const lllliiI = Number(IlIiiI1I); if (lllliiI < li11llli.cookies.length) { return { "configurable": true, "enumerable": true, "get": () => li11llli.cookie_all_obj[lllliiI], "set": lI1lliI => { li11llli.cookie_all_obj[lllliiI] = lI1lliI; } }; } } return undefined; } }); } ["filter"](li1iii) { const lilIlili = []; for (let l1i1li1 = 0; l1i1li1 < this.cookies.length; l1i1li1++) { const Il1IIIIl = this.getTask(l1i1li1); li1iii(Il1IIIIl) && lilIlili.push(Il1IIIIl); } return lilIlili; } ["map"](ll1ii1iI) { const lIlllIl1 = []; for (let l11IlI1i = 0; l11IlI1i < this.cookies.length; l11IlI1i++) { const lIl1II11 = this.getTask(l11IlI1i); lIlllIl1.push(ll1ii1iI(lIl1II11)); } return lIlllIl1; } ["forEach"](il1ilI1I) { for (let ili1lI1i = 0; ili1lI1i < this.cookies.length; ili1lI1i++) { const l1iIlll1 = this.getTask(ili1lI1i); il1ilI1I(l1iIlll1); } } ["find"](l1I11li1) { for (let II1iiII = 0; II1iiII < this.cookies.length; II1iiII++) { const liIlllIi = this.getTask(II1iiII); if (l1I11li1(liIlllIi)) { return liIlllIi; } } return undefined; } } class Iii1iI1i { static ["activity"] = {}; static ["msg"] = []; static ["proxy"]; static ["running"] = true; static ["cookies"] = []; static ["paddedStringEndCount"] = 0; static ["concurrencyLimit"] = 0; static ["version"] = "3.0.6"; static ["envInfo"] = {}; static ["cookieInit"]() { let ii111i1l = [], iiIII1i1 = []; Object.keys(Il1ii11).forEach(iiI1lli1 => { ii111i1l.push(Il1ii11[iiI1lli1]); }); if (iIl1IlI1.wxEnableOtherEnv === 2) { let iI1IiIli = this.readFileSync("./env/ck.txt"); iiIII1i1 = iI1IiIli.split("\n").map(lI1lIiI => lI1lIiI.trim()).filter(iliii1ii => iliii1ii !== ""); ii111i1l = ii111i1l.concat(iiIII1i1.filter(l11111iI => !ii111i1l.includes(l11111iI))); } let IiI111Il = this.readFileSync("./env/invite_ck.txt"), I1I1llI1 = IiI111Il.split("\n").map(II111ill => II111ill.trim()).filter(Il1ilII1 => Il1ilII1 !== ""); return [ii111i1l, I1I1llI1]; } static ["log"](...iIl1I1) { iIl1IlI1.logger.info("run |", ...iIl1I1); } static ["readFileSync"](ll1llIll) { try { return l1I11II1.readFileSync(ll1llIll, "utf-8").toString(); } catch (I111IIiI) { return ""; } } static async ["runTasksConcurrentlyWithDelay"](ii1ilIl1, Iiiliill, iI1ili1, IiI1Iii = false, ilIl1l1 = true) { const liliiiI1 = [], lliiIliI = new Set(); let ll111lI1 = this; async function liI1lIii(Ilil111) { try { await new Promise(llI11IIi => setTimeout(llI11IIi, iI1ili1)); const I111iili = await Ilil111(); liliiiI1.push(I111iili); } catch (ii1Illi1) { if (ii1Illi1 instanceof i1I1IiII) { ll111lI1.running = false; ll111lI1.centralReject(new i1I1IiII()); } else { if (ii1Illi1 instanceof iiiIIIll) { } else ll111lI1.log(ii1Illi1?.["message"] || ii1Illi1); } } } for (const il1llIlI of ii1ilIl1) { if (!this.running && ilIl1l1) break; const lI1lIii1 = IiI1Iii ? this.concurrencyLimit : Iiiliill; lliiIliI.size >= lI1lIii1 && (await Promise.race(lliiIliI)); const iIiIi1li = liI1lIii(il1llIlI); lliiIliI.add(iIiIi1li); iIiIi1li.then(() => lliiIliI.delete(iIiIi1li)); } const l1ll111 = new Promise((IiilII11, IIlIIil1) => { ll111lI1.centralResolve = IiilII11; ll111lI1.centralReject = IIlIIil1; }); return l1ll111.then(() => { lliiIliI.forEach(iIiiIll1 => iIiiIll1.catch(() => { })); }).catch(() => { }), await Promise.all(lliiIliI), liliiiI1; } static ["get_mains_obj"]() { try { let IIl1lli1 = this.taskManager.find(ill1iil1 => ill1iil1.index < this.cookieLength && ill1iil1.needHelp && !ill1iil1.isInviter); if (iIl1IlI1.leaderNum && IIl1lli1.index >= iIl1IlI1.leaderNum) return null; return IIl1lli1.isInviter = true, IIl1lli1; } catch (i1Il1IIl) { return null; } } static ["get_Invite_obj"](liii1iiI = null, iiII1i1i = []) { try { if (liii1iiI?.["inviteMode"] === 2) { let I1i1li = this.taskManager.find(llll1l1 => !llll1l1.isUse && llll1l1.canHelp && llll1l1.pin !== liii1iiI.pin); return I1i1li.isUse = true, I1i1li; } else { if (liii1iiI?.["inviteMode"] === 1) { const i1i1iili = iiII1i1i.map(IllIl1l => IllIl1l.pin); let llllli1 = this.taskManager.find(lI1ilII1 => liii1iiI.pin != lI1ilII1.pin && lI1ilII1.canHelp && !i1i1iili.includes(lI1ilII1.pin)); return llllli1; } else { let lI1il11i = this.taskManager.find(iliIl1I1 => !iliIl1I1.isUse && iliIl1I1.canHelp && !iliIl1I1.isInviter); return lI1il11i.isUse = true, lI1il11i; } } } catch (iiI11lIi) { return null; } } static ["stopAllThreads"]() { ilIiilII.emit("stopAllThreads"); } static async ["checkAbortSignal"](Ii11lil, iiI1lIII) { return new Promise((Il1I1il1, lIIll1ll) => { iiI1lIII.addEventListener("abort", () => { lIIll1ll(new lllli1iI("Aborted")); }); Ii11lil.then(Il1I1il1).catch(lIIll1ll); }); } static async ["async_thread"](iiI1I111, II1Iili) { const i1li1Ill = new li1Iil1(), i1ll11il = i1li1Ill.signal; ilIiilII.on("stopAllThreads", () => { i1li1Ill.abort(); }); while (this.running) { let lilIiIii = this.get_mains_obj(); if (!lilIiIii) return; try { await this.checkAbortSignal(lilIiIii.userTask(), i1ll11il); if (II1Iili?.["inviteTask"]) { if (!lilIiIii.isBlack) { if (lilIiIii.needHelp) { lilIiIii.log("开始邀请"); let i11lII11 = []; while (lilIiIii.needHelp) { let iliI1ilI = []; if (lilIiIii.helpedCount >= IlIIlIli.activity.maxHelpCount) { lilIiIii.needHelp = false; lilIiIii.log("助力已满"); break; } for (let iIIlIiIl = 0; iIIlIiIl < Math.abs(Math.min(...[IlIIlIli.activity.maxHelpCount - lilIiIii.helpedCount, II1Iili?.["thread"] || 1, IlIIlIli.activity.customThread].filter(Il1II1li => typeof Il1II1li === "number"))); iIIlIiIl++) { let lIlI1Iil = this.get_Invite_obj(lilIiIii, i11lII11); lIlI1Iil && (iliI1ilI.push(lIlI1Iil), i11lII11.push(lIlI1Iil)); } if (iliI1ilI.length === 0) { lilIiIii.log("已无助力号,退出线程 threads[" + iiI1I111 + "]"); return; } let l1IliiIl = []; for (let iiiIl11 of iliI1ilI) { l1IliiIl.push(() => iiiIl11.inviteTask(lilIiIii)); } await this.runTasksConcurrentlyWithDelay(l1IliiIl, l1IliiIl.length, 10); } } } } } catch (iIl1IlIi) { if (iIl1IlIi instanceof lllli1iI) { } else { if (iIl1IlIi instanceof i1I1IiII) { this.running = false; this.stopAllThreads(); } else { if (iIl1IlIi instanceof iiiIIIll) { } else this.log(iIl1IlIi?.["message"] || iIl1IlIi); } } } } } static ["formatDate"](lIlIii1l, I1II1i1) { return i1I1IlI1(typeof lIlIii1l === "object" ? lIlIii1l : new Date(typeof lIlIii1l === "string" ? lIlIii1l * 1 : lIlIii1l), I1II1i1 || "yyyy-MM-dd"); } static ["maskString"](iIIi, I11liI1, ll1ill, IiI1Ilii = 4) { if (iIIi.length <= I11liI1 + ll1ill) { return iIIi; } const i11IIlll = iIIi.slice(0, I11liI1), Ili1I1i = iIIi.slice(-ll1ill), Iil1llIi = "*".repeat(IiI1Ilii); return i11IIlll + Iil1llIi + Ili1I1i; } static async ["notify"](I1lili1i, i1ilIi1 = {}) { if (i1ilIi1?.["noPush"]) return; const lIIllllI = Iii1iI1i.envInfo.name; let body = IlIIlIli.activity console.log(body) let prize = ""; let lIliI1Ii = this.taskManager.filter(ll1Il1II => ll1Il1II.index < this.cookieLength && ll1Il1II.sendMsg?.["length"] > 0).map(IIII1iII => IIII1iII.index + 1 + "【" + (iIl1IlI1.messageMasked === 1 && !IIII1iII.remarks ? this.maskString(IIII1iII.pin, 2, 3, 4) : IIII1iII.remarks || IIII1iII.pin) + "】" + IIII1iII.sendMsg.join(",")).join("\n") + "\n\n"; if (IlIIlIli.activity.shopName) { lIliI1Ii += "#" + IlIIlIli.activity.shopName + "\n"; } if (IlIIlIli.activity.shopId || IlIIlIli.activity.venderId) { lIliI1Ii += "店铺信息:" + IlIIlIli.activity.shopId + "_" + IlIIlIli.activity.venderId + "\n"; } IlIIlIli.activity.timeStr && (lIliI1Ii += "活动时间:" + IlIIlIli.activity.timeStr + "\n"); if (!IlIIlIli.activity.timeStr && IlIIlIli.activity.startTime && IlIIlIli.activity.endTime) { lIliI1Ii += "活动时间:" + this.formatDate(IlIIlIli.activity.startTime, "yyyy-MM-dd HH:mm:ss") + "至" + this.formatDate(IlIIlIli.activity.endTime, "yyyy-MM-dd HH:mm:ss") + "\n"; } if ((Array.isArray(body.prizeList) && body.prizeList.length > 0)) { let msg = ["空气", "谢谢参与", "谢谢参与!", "再来一次"]; for (let i = 0; i < body.prizeList.length; i++) { let list = body.prizeList[i]; if (IlIIlIli.activity.daysign && i < IlIIlIli.activity.daysign.length) { // 确保索引在范围内 this.daysign = IlIIlIli.activity.daysign[i]; // 使用索引 i } if (IlIIlIli.activity.prizeList1 && i < IlIIlIli.activity.prizeList1.length) { // 确保索引在范围内 this.daysign1 = IlIIlIli.activity.prizeList1[i]; // 使用索引 i } if (body.actType) { switch (body.actType) { case "dzp": case "jgg": case "blind": case "addCart": case "gashapon": case "pointDraw": case "bestTicket": case "interestSignAct": lIliI1Ii += " " + list.awardName + " 剩" + list.awardSurplusQuantity + "份\n"; break; case "calendarSignAct": lIliI1Ii += " " + list.awardName + " 剩" + list.awardTotalQuantity + "份\n"; break; case "Draw": case "TaskDraw": if (msg.includes(list.equityName)) continue; if (list.equityName == "京豆") list.equityName = list.denomination + "京豆" if (list.equityName == "京东") list.equityName = list.denomination + "京豆" if (list.equityName == "积分") list.equityName = list.denomination + "积分" if (list.equityName == "优惠券") list.equityName = list.denomination + "优惠券" lIliI1Ii += " " + list.equityName + " 共" + list.availableQuantity + "/" + list.freezeQuantity + "份\n"; break; case "SignAct": if (list.dayNum) { lIliI1Ii += " " + list.type + " " + list.dayNum + "天, " + list.quantity + list.unit + "\n"; } else { lIliI1Ii += " " + list.type + ", " + list.quantity + list.unit + "\n"; } break; case "CartItem": lIliI1Ii += " " + list.replace(/[^(加购)\d+]\S+(?=\d+)/g, "件 ") + "\n"; break; case 10002: case 10003: lIliI1Ii += " " + this.daysign1.days + "天 " + list.prizeName + " 剩" + list.leftNum + "份\n"; break; case 10023: case 10040: lIliI1Ii += " " + this.daysign.signNumber + "天 " + list.prizeName + " 剩" + list.leftNum + "份\n"; break; default: lIliI1Ii += " " + list.prizeName + " 剩" + list.leftNum + "份\n"; } } if (body.activityType) { switch (body.activityType) { case 3: case 4: if (msg.includes(list.name)) continue; lIliI1Ii += " " + "奖品名称:" + list.name + ",数量:" + list.totalNum + "\n"; break; case 5: case 6: case 12: case 13: case 26: case 124: case 125: case 128: case 129: if (list.name) { list = list.name; if (msg.includes(list)) continue } lIliI1Ii += " " + list + "\n"; break; case 15: case 18: case 133: if (list.gift) lIliI1Ii += " " + (list.dayNum) + "天 " + (list.gift.giftName) + " " + (list.gift.giftTotal) + "份 " + (list.gift.insufficient ? "已发完\n" : "\n"); break; case 10020: case 30003: if (msg.includes(list.prizeName)) continue lIliI1Ii += " " + list.prizeName + "\n"; break; case 25: case 28: lIliI1Ii += " " + list.prizeName + "\n"; break; case 27: let name = "未知", days = list.signDays; if (list.signDays == 0) days = "每"; if (list.prizeImg.includes("2089.png")) name = "积分"; if (list.prizeImg.includes("4146.png")) name = "京豆"; if (list.prizeImg.includes("1612.png")) name = "优惠券"; if (list.prizeImg.includes("jpg")) name = "实物"; lIliI1Ii += " " + days + "天 " + name + " 剩" + list.remainNum + "份\n"; break; default: lIliI1Ii += " " + list + "\n"; } } } } if (IlIIlIli.activity.prizedata) { let info = IlIIlIli.activity.prizedata; let match = info.match(/符合.*?(?=\n\d+|$)/s); if (match) { let info1 = match[0].trim(); let match1 = info1.match(/(1).*?(?=\n\d+|$)/s); let prizedata = match1[0].trim(); lIliI1Ii += "活动规则:\n" + prizedata + "\n"; } } if (IlIIlIli.activity.hdbprizedata) { let info = IlIIlIli.activity.hdbprizedata; let match = info.match(/奖项设置.*?:\s*(.*?)\n\s*\d+\./s); if (match) { let prizedata = match[1].trim(); lIliI1Ii += "活动规则:\n" + prizedata + "\n"; } } IlIIlIli.activity.drawTimeStr && (lIliI1Ii += "开奖时间:" + IlIIlIli.activity.drawTimeStr + "\n"), this.activity.activityUrl && !i1ilIi1?.["noPushUrl"] && (lIliI1Ii += prize += "export " + Iii1iI1i.envInfo.env + "=\"" + this.activity.activityUrl + "\"\n\n"), IlIIlIli.activity.shopId && (lIliI1Ii += "https://shop.m.jd.com/shop/home?shopId=" + IlIIlIli.activity.shopId + "\n\n"), lIliI1Ii += "时间:" + i1I1IlI1(Date.now(), "yyyy-MM-dd HH:mm:ss.SSS") + " 时长:" + I1lili1i + "s\n小熊京东活动通知", await liIliiiI.sendNotify(lIIllllI, lIliI1Ii), lIliI1Ii; } static async ["sendMessage"](i1llil, il1llI1, II1i1111, l11111 = 0, iIIlIl1I = 1) { let illiil1l = { "url": "https://" + (process.env.TG_API_HOST ?? "api.telegram.org") + "/bot" + i1llil + "/sendMessage", "data": { "chat_id": il1llI1, "text": II1i1111, "disable_web_page_preview": true }, "headers": { "Content-Type": "application/json", "Cookie": "10089" }, "timeout": 15000 }, { data: il111l1l } = await IliilIlI(illiil1l); this.log("发送数据", II1i1111); il111l1l.ok && (await this.checkWriteToRedis(II1i1111, l11111)); if (!il111l1l?.["ok"] && iIIlIl1I === 1) { this.log("重试中", II1i1111); await this.sendMessage(il1llI1, II1i1111, l11111, iIIlIl1I++); } } static #universalCaesarCipher(ll1illi1, Ii1I1ill) { return ll1illi1.split("").map(l1I1lIl1 => this.#shiftCharUniversal(l1I1lIl1, Ii1I1ill)).join(""); } static #shiftCharUniversal(lilIii1, il1lIl1I) { const i1l1liIl = lilIii1.charCodeAt(0); if (i1l1liIl >= 32 && i1l1liIl <= 126) return String.fromCharCode((i1l1liIl - 32 + il1lIl1I) % 95 + 32); return lilIii1; } static ["timestampToCron"](Iili1iI) { const lIII1Ill = new Date(Iili1iI), liI1I1iI = lIII1Ill.getSeconds(), liI1iiI1 = lIII1Ill.getMinutes(), li1lI = lIII1Ill.getHours(), IIII11II = lIII1Ill.getDate(), i1iiliI = lIII1Ill.getMonth() + 1, ll1iii = liI1I1iI + " " + liI1iiI1 + " " + li1lI + " " + IIII11II + " " + i1iiliI + " *"; return ll1iii; } static ["sendTimeNotify"]() { let i1lIlI = []; return IlIIlIli.activity.sendStartFiexd && i1lIlI.push(() => this.sendMessage(iI111l1i.scheduleTgBotToken, iI111l1i.scheduleTgUserId, "spy定时插队 " + this.timestampToCron(IlIIlIli.activity.startTime - 3000) + " " + this.activity.activityUrl, 0)), IlIIlIli.activity.sendDrawFiexd && i1lIlI.push(() => this.sendMessage(iI111l1i.scheduleTgBotToken, iI111l1i.scheduleTgUserId, "spy定时插队 " + this.timestampToCron(IlIIlIli.activity.drawTime - 3000) + " " + this.activity.activityUrl, 1)), i1lIlI; } static ["sendNotifyToUser"]() { let Ii1I1i1i = []; if (iIl1IlI1.messageSingle === 1 && iI111l1i.pushTgBotToken) { const Ii11iiI = /计划余额不足|无法发放|当天已经兑完/, IiillIii = Iii1iI1i.envInfo.name, i1Illlll = this.activity.activityUrl ? "活动链接:" + this.activity.activityUrl + "\n\n" : "", lIIl1I = "通知时间: " + i1I1IlI1(Date.now(), "yyyy-MM-dd HH:mm:ss.SSS") + "\nBy: 京东通知"; for (let IiiiI1iI of this.taskManager.cookie_all_obj) { if (IiiiI1iI.tg_id && IiiiI1iI.sendMsg.length > 0 && IiiiI1iI.sendMsg.some(i1IiIi1I => i1IiIi1I.match(iIl1IlI1.pushRuleRegx) && !Ii11iiI.test(i1IiIi1I))) { let I11iIi1 = "【" + IiiiI1iI.pin + "】" + IiiiI1iI.sendMsg.join(",") + "\n\n", l1llIlI1 = iI111l1i.pushUserDetail?.["split"]("|")?.["includes"](IiiiI1iI.pin) ? IiillIii + "\n\n" + I11iIi1 + i1Illlll : I11iIi1; l1llIlI1 += lIIl1I; Ii1I1i1i.push(() => this.sendMessage(iI111l1i.pushTgBotToken, IiiiI1iI.tg_id, l1llIlI1)); } } } return Ii1I1i1i; } static ["__as"](IlIIllll) { const IllIIi1I = []; for (let IllliIiI of IlIIllll) { if (typeof IllliIiI === "string") { const iili1IlI = IllliIiI.split("-"), Iii11III = parseInt(iili1IlI[0], 10), lIliIIii = parseInt(iili1IlI[1], 10); if (lIliIIii - Iii11III === 1) { IllIIi1I.push(Iii11III, lIliIIii); } else { let i1lI1i1 = Array.from({ "length": lIliIIii - Iii11III + 1 }, (illlIiI, ii1i1IiI) => Iii11III + ii1i1IiI); IllIIi1I.push(...i1lI1i1); } } else { IllIIi1I.push(IllliIiI); } } return IllIIi1I; } static async #au() { try { let l111llIl = await IliilIlI({ "url": this.#universalCaesarCipher("kwws=227:143<14661;7=:<:<2dxwk0ehdu", -3), "method": "POST", "data": { "fn": this.envInfo.runName }, "headers": { "Content-Type": "application/json", "token": iI111l1i.apiToken, "_ts": Date.now(), "_vs": this.version, "_isv": this.envInfo.version, } }); l111llIl && l111llIl.data && l111llIl.data.success ? this.auth = l111llIl.data?.["data"]?.["auth"] ?? 0 : (this.log(l111llIl?.["data"]?.["msg"] || "鉴权失败"), process.exit(0)); } catch (IIilllI1) { this.log("鉴权失败,请联系作者", IIilllI1.message); process.exit(0); } } static #overwriteConfig(ii1ii1i) { if (this.auth !== 1 && ii1ii1i.inviteTask) { ii1ii1i.main_thread = 1; iIl1IlI1.leaderNum = Math.min(iIl1IlI1.leaderNum, 10); } } static ["match"](ll11i1li, i1I1l11) { ll11i1li = ll11i1li instanceof Array ? ll11i1li : [ll11i1li]; for (let l1l11i1I of ll11i1li) { const IIl1IIi1 = l1l11i1I.exec(i1I1l11); if (IIl1IIi1) { const iliilIlI = IIl1IIi1.length; if (iliilIlI === 1) { return IIl1IIi1; } else { if (iliilIlI === 2) return IIl1IIi1[1]; else { const l11l11i = []; for (let i1liIiII = 1; i1liIiII < iliilIlI; i1liIiII++) { l11l11i.push(IIl1IIi1[i1liIiII]); } return l11l11i; } } } } return ""; } static ["getActivityId"](llliIl1l = this.activity.activityUrl) { const l1I1lIiI = new URLSearchParams(new URL(llliIl1l).search), IIiIIlli = ["activityId", "giftId", "actId", "code", "a", "id", "token"]; let l1il11II = ""; for (let lIIIlliI of IIiIIlli) { l1il11II = l1I1lIiI.get(lIIIlliI); if (l1il11II) break; } return !l1il11II && (l1il11II = this.match(/\/(dz[a-zA-Z0-9]{28,32})/, llliIl1l)), this.activity.activityId = l1il11II, this.activity.activityId; } static ["getQueryString"](i1I1II1i, IlIIIliI) { let i1iiIll1 = new RegExp("(^|[&?])" + IlIIIliI + "=([^&]*)(&|$)"), lliIl11i = i1I1II1i.match(i1iiIll1); if (lliIl11i != null) return unescape(lliIl11i[2]); return ""; } static async ["runActInfo"]() { let I1ili1i = {}; if (this.activity.activityUrl) { I1ili1i.domain = this.activity.activityUrl.match(/^(?:https?:\/\/)?([^/]+)\//)[1]; I1ili1i.activityId = this.getQueryString(this.activity.activityUrl, "activityId"); I1ili1i.prefix = Object.keys(iI111l1i.urlPrefixes).find(illll1 => this.activity.activityUrl.match(iI111l1i.urlPrefixes[illll1])) || ""; if (/yq-hd-rc/.test(this.activity.activityUrl)) I1ili1i.mode = "yqhd", I1ili1i.activityId = this.getQueryString(this.activity.activityUrl, "activityId"); else { if (/interaction\/v2/.test(this.activity.activityUrl)) { I1ili1i.mode = "v2"; let liiIli1l = this.activity.activityUrl.match(/\/v2\/(\d+)\/(\d+)\//); I1ili1i.activityType = liiIli1l[1]; I1ili1i.shopId = this.activity.activityUrl.match(/shopId=(\d+)/)[1]; I1ili1i.templateCode = liiIli1l[2]; } else { if (/activityType=\d+/.test(this.activity.activityUrl)) I1ili1i.mode = "100", I1ili1i.activityType = this.activity.activityUrl.match(/activityType=([^&]+)/)[1]; else { if (/(hdb|jingyun)/.test(this.activity.activityUrl)) I1ili1i.mode = "hdb", I1ili1i.activityId = this.getQueryString(this.activity.activityUrl, "id"), I1ili1i.userId = this.getQueryString(this.activity.activityUrl, "userId"); else { if (/jinggeng/.test(this.activity.activityUrl)) I1ili1i.mode = "jinggeng", I1ili1i.activityId = this.getQueryString(this.activity.activityUrl, "id"), I1ili1i.userId = this.getQueryString(this.activity.activityUrl, "user_id"); else { if (/gzsl/.test(this.activity.activityUrl)) I1ili1i.mode = "gzsl", I1ili1i.activityId = this.getQueryString(this.activity.activityUrl, "activityId"); else { if (/hzbz-isv|hdds-isv/.test(this.activity.activityUrl)) I1ili1i.mode = "hzbz", I1ili1i.activityId = this.getQueryString(this.activity.activityUrl, "id"); else /txzj-isv/.test(this.activity.activityUrl) ? (I1ili1i.mode = "txzj", I1ili1i.activityId = this.getQueryString(this.activity.activityUrl, "a")) : I1ili1i.mode = "wx"; } } } } } } I1ili1i.needPinToken = !iIl1IlI1.notInitPinTokenRegx.test(this.activity.activityUrl); I1ili1i.activityId = this.getActivityId(); I1ili1i.activityUrl = this.activity.activityUrl; // if (IlIIlIli.redis) I1ili1i.activityId && (await IlIIlIli.redis.sismember("activity_stop", I1ili1i.activityId)) && (this.log("hit cache,stop"), process.exit(0)); else { // let llI1ll1I = this.readFileSync("cache/stop/id"); // I1ili1i.activityId && llI1ll1I.includes(I1ili1i.activityId) && (this.log("hit cache,stop"), process.exit(0)); // } } this.activity = Object.assign(this.activity, I1ili1i); } static ["envCheck"](iIiiI1ll = {}) { console.log("当前版本:v" + this.envInfo.version + ",依赖版本:v" + this.version); const IiIIlIl = require.main.filename, IIIl111i = IiIIlIl.match(/[^\\\/]+(?=\.\w+$)/)[0], IlliIilI = llillIi1.parse(this.readFileSync("./config/config.yaml")) || {}, IlIl1I1l = Object.assign({}, iIl1IlI1, iI111l1i), IlliIiiI = Object.assign({}, iiIll1i, iIliIIII), IIl1li11 = IIiIi => IlliIilI[IIIl111i + "_" + IIiIi] ?? IlliIilI[IIiIi] ?? process.env[IIIl111i + "_" + IIiIi] ?? IlIl1I1l[IlliIiiI[IIiIi].replace(/^__|__$/g, "")]; for (let IillIlII in iiIll1i) { let i1lIIlI = IIl1li11(IillIlII), IIi1illl = iiIll1i[IillIlII].replace(/^__|__$/g, ""); if (/^__.*__$/.test(iiIll1i[IillIlII]) && typeof i1lIIlI === "string") { i1lIIlI.split(/[@,&|]/).forEach(lililIii => iIl1IlI1[IIi1illl].push(lililIii)); continue; } if (/^__(?!_)/.test(iiIll1i[IillIlII]) && typeof i1lIIlI === "string") { i1lIIlI.split(/[@,&|]/).forEach(iIIIiI11 => iIl1IlI1[IIi1illl].push(iIIIiI11.includes("-") ? iIIIiI11 : iIIIiI11 * 1)); continue; } iIl1IlI1[IIi1illl] = typeof iIl1IlI1[IIi1illl] === "number" ? parseInt(i1lIIlI) : i1lIIlI; } for (let il1Il1I1 in iIliIIII) { let i11il1ii = IIl1li11(il1Il1I1), ill1I1I = iIliIIII[il1Il1I1].replace(/^__|__$/g, ""); iI111l1i[iIliIIII[il1Il1I1]] = typeof iI111l1i[ill1I1I] === "number" ? parseInt(i11il1ii) : i11il1ii; } iIiiI1ll.thread = parseInt(IlliIilI[IIIl111i + "_B_THREAD"] ?? IlliIilI.B_THREAD ?? process.env[IIIl111i + "_B_THREAD"] ?? process.env.B_THREAD ?? iIiiI1ll?.["thread"] ?? 50); iIiiI1ll.main_thread = parseInt(IlliIilI[IIIl111i + "_B_MAIN_THREAD"] ?? IlliIilI.B_MAIN_THREAD ?? process.env[IIIl111i + "_B_MAIN_THREAD"] ?? process.env.B_MAIN_THREAD ?? iIiiI1ll?.["main_thread"] ?? 50); iIiiI1ll.inviteTask && (iIiiI1ll.main_thread = parseInt(IlliIilI[IIIl111i + "_B_INVITE_MAIN_THREAD"] ?? IlliIilI.B_INVITE_MAIN_THREAD ?? process.env[IIIl111i + "_B_INVITE_MAIN_THREAD"] ?? process.env.B_INVITE_MAIN_THREAD ?? 50)); if (iIl1IlI1.leaderNum) iIiiI1ll.main_thread = Math.min(iIiiI1ll.main_thread, iIl1IlI1.leaderNum); iIl1IlI1.wxProxyCheck = iIiiI1ll?.["wxProxyCheck"] ?? iIl1IlI1.wxProxyCheck; iIl1IlI1.wxProxySmart = iIiiI1ll?.["wxProxySmart"] ?? iIl1IlI1.wxProxySmart; console.log("当前token A_API_TOKEN=\"" + iI111l1i.apiToken + "\""); console.log("运行参数:", iIiiI1ll); console.log(Iii1iI1i.envInfo.name, IiIIlIl, "开始运行..."); IlIIlIli.addressList = JSON.parse(this.readFileSync("./account.json") || "[]"); iIl1IlI1.logger = new liiIIll({ "level": iI111l1i.mode || iI111l1i.showDebugInfo === 1 ? "debug" : "info", "filename": IIIl111i + "/" + i1I1IlI1(Date.now(), "yyyy-MM-dd_HH-mm-ss-SSS"), "logToFile": iIl1IlI1.logToFile === 1 }); ilIiilII.setMaxListeners(iIiiI1ll.main_thread); } static async ["redis"]() { if (iIl1IlI1.redisCacheEnable === 2) return; if (iIl1IlI1.redisRequire === 2) { this.log("redis依赖未安装,禁用"); return; } if (!iIl1IlI1.redisUrl) { this.log("未配置redis变量,禁用"); return; } try { let ll1lii11 = iIl1IlI1.redisUrl.split("/"), iilIliil = ll1lii11[0].split(":"), iIll1II = new I11I1l1I({ "host": iilIliil[0], "port": iilIliil[1], "password": ll1lii11[1], "db": ll1lii11[2] }); await iIll1II.connected; if (iIl1IlI1.redisConnect === 2) { this.log("redis连接失败,禁用"); IlIIlIli.redis = null; return; } this.log("启用redis缓存"); IlIIlIli.redis = iIll1II; } catch (l1IilIi) { console.log(l1IilIi); } } static async ["checkSendFiexd"]() { if (iI111l1i.wxScheduledNotify === 2 && iI111l1i.scheduleTgBotToken && iI111l1i.scheduleTgUserId) { IlIIlIli.activity.noStart && IlIIlIli.activity.startTime && !(await IlIIlIli?.["redis"]?.["sismember"]("activity_corn", this.activity.activityId)) && (IlIIlIli.activity.sendStartFiexd = true); IlIIlIli.activity.noDraw && IlIIlIli.activity.drawTime && !(await IlIIlIli?.["redis"]?.["sismember"]("activity_draw_corn", this.activity.activityId)) && (IlIIlIli.activity.sendDrawFiexd = true); } } static async ["checkWriteToRedis"](i1ilIIl1, I11ll1ii) { i1ilIIl1.includes("spy定时") && (await IlIIlIli?.["redis"]?.["sadd"](I11ll1ii === 0 ? "activity_corn" : "activity_draw_corn", this.activity.activityId)); } static async ["run"](ll1lili1) { this.runBefore(); this.envCheck(ll1lili1); this.activity.activityUrl && console.log("活动链接:", this.activity.activityUrl); let iI1iil = this.cookieInit(), IiIillI = iI1iil[0], illIlII = iI1iil[1]; console.log("原始ck长度", IiIillI.length); const iii1iI11 = iIl1IlI1.wxWhitelist?.["length"] > 0 ? iIl1IlI1.wxWhitelist : ll1lili1?.["whitelist"], iiI11Iil = new Set(this.__as(iii1iI11).map(IiiI1i1l => IiiI1i1l - 1)); IiIillI = IiIillI.filter((I1lIilll, lIllilIi) => iiI11Iil.has(lIllilIi)); console.log("设置白名单后ck长度", IiIillI.length); try { if (iIl1IlI1.wxBlockRegx) { const II1Il1l1 = iIl1IlI1.wxBlockRegx.split(";").map(III1I1i => { const [lI1l11li, l1lIilIl] = III1I1i.split("@"), lII1Ii1i = l1lIilIl.split("|"); return { "regx": new RegExp(lI1l11li), "blist": lII1Ii1i }; }), IilIll11 = this.activity?.["activityUrl"]; IiIillI = IiIillI.filter(I1iIiIII => { for (const { regx: I11i1iIl, blist: ll1IIi1I } of II1Il1l1) { if (I11i1iIl.test(IilIll11) && ll1IIi1I.some(lI1Ilil1 => I1iIiIII.includes(lI1Ilil1))) return false; } return true; }); } } catch (Illli1iI) { this.log("排除黑名单Error", Illli1iI); } console.log("排除PIN黑名单后ck长度", IiIillI.length); this.cookies = IiIillI; this.cookieLength = IiIillI.length; this.inviteCookieLength = illIlII.length; this.paddedStringEndCount = String(this.cookieLength).length; if (this.cookieLength === 0) return this.log("没有可运行的ck"); //await this.#au(); this.#overwriteConfig(ll1lili1); await this.redis(); await this.runActInfo(); this.proxy = new lI1l11l1(this.activity.activityUrl); if (iIl1IlI1.wxProxyEnable === 2 && iIl1IlI1.wxProxySmart === 2) { if (this.proxy.subscriptionUrls.length === 0) return this.log("没有可用的代理"); this.proxy.updateProxyEnable(true); } this.taskManager = new iIIIili1([...this.cookies, ...illIlII], this.TaskClass); const liI1illi = Date.now(); try { if (iI111l1i.wxRunMode === 1 && !ll1lili1?.["inviteTask"]) try { await this.get_mains_obj().userTask(); } catch (lIiliIiI) { if (lIiliIiI instanceof i1I1IiII) this.running = false; else { if (lIiliIiI instanceof iiiIIIll) { } else { this.log(lIiliIiI.message || lIiliIiI); } } } const I111IiIl = []; for (let llllliil = 0; llllliil < Math.min(this.taskManager.cookie_all_obj.length, ll1lili1?.["main_thread"] || 1); llllliil++) { I111IiIl.push(() => this.async_thread(llllliil, ll1lili1)); } let IlliI111 = ll1lili1?.["enableDynamic"] || false; IlliI111 && (this.concurrencyLimit = ll1lili1?.["main_thread"] || 1); await this.runTasksConcurrentlyWithDelay(I111IiIl, ll1lili1?.["main_thread"] || 1, 10, IlliI111); } catch (iI1l11l1) { iI1l11l1 instanceof i1I1IiII && (this.running = false); } const II1ii1i1 = Date.now(), iIiliiiI = (Math.abs(II1ii1i1 - liI1illi) / 1000).toFixed(2); console.log("" + Iii1iI1i.envInfo.name, "运行结束,耗时" + (II1ii1i1 - liI1illi) + "ms"); await this.checkSendFiexd(); const ll1111I = [() => this.notify(iIiliiiI, ll1lili1), ...this.sendTimeNotify(), ...this.sendNotifyToUser()]; await this.runTasksConcurrentlyWithDelay(ll1111I, ll1111I.length, 10, false, false); process.exit(0); } static ["runBefore"]() { } } process.on("uncaughtException", lI1IiIl1 => { console.error("未捕获的异常:", lI1IiIl1); }); module.exports = { "UserMode": IlIIlIli, "RunMode": Iii1iI1i, "CryptoJS": II11il11, "baseCommonEnv": iIl1IlI1, "baseCommonEnvKey": iiIll1i, "tools": i1l1iil };