From 9aaaebd0fd726281917676b289514a9743548972 Mon Sep 17 00:00:00 2001 From: blackmatrix7 <27717518+blackmatrix7@users.noreply.github.com> Date: Wed, 15 Dec 2021 23:19:15 +0800 Subject: [PATCH] =?UTF-8?q?[AppleStore]=E5=A2=9E=E5=8A=A0MacbookPro?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E7=9B=91=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/applestore/applestore.js | 192 +++++++++++++++++--------------- 1 file changed, 102 insertions(+), 90 deletions(-) diff --git a/script/applestore/applestore.js b/script/applestore/applestore.js index b704a3bbf..3ca70b877 100644 --- a/script/applestore/applestore.js +++ b/script/applestore/applestore.js @@ -15,12 +15,18 @@ function getGoodsStock(parts, location, option = "") { url = encodeURI(`https://www.apple.com.cn/shop/fulfillment-messages?pl=true&mt=compact&parts.0=${parts}&location=${location}&_=${new Date().getTime()}`); } magicJS.get(url, (err, resp, data) => { - let obj = JSON.parse(data); - let stores = obj["body"]["content"]["pickupMessage"]["stores"]; - if (stores) { - resolve(stores); - } else { - magicJS.notify("查询库存失败,请检查配置是否正确。"); + try{ + let obj = JSON.parse(data); + let stores = obj["body"]["content"]["pickupMessage"]["stores"]; + if (stores) { + resolve(stores); + } else { + magicJS.notify("查询库存失败,请检查配置是否正确。"); + resolve([]); + } + } + catch (err){ + magicJS.logError(`解析库存数据失败,异常信息:${err}`); resolve([]); } }); @@ -31,96 +37,101 @@ async function watchStock(goods_models, applestore_region) { let stock = magicJS.read(APPLESTORE_STOCK_KEY); stock = !!stock ? stock : {}; let len = goods_models.length; + let tasks = []; for (let i = 0; i < len; i++) { - let partsConfig = goods_models[i].split("#"); - let parts = partsConfig[0]; - let option = partsConfig.length >= 2 ? partsConfig[1] : ""; - let name = partsConfig.length == 3 ? partsConfig[2] : ""; - let subObj = { watch: 0, pickup: 0, soldout: 0, changed: 0 }; - let availability = await getGoodsStock(parts, applestore_region, option); - - if (availability && availability.length > 0) { - // 获取AppleStore取货信息 - for (let store of availability) { - let storeNumber = store["storeNumber"]; - if (!stock.hasOwnProperty(parts)) { - stock[parts] = { title: store["partsAvailability"][parts]["storePickupProductTitle"], stores: {} }; - } - if (!stock[parts]["stores"][storeNumber]) { - stock[parts]["stores"][storeNumber] = { notify: false, pickup: false, msg: "等待查询", city: store["city"], name: store["storeName"] }; - } - if (stock[parts]["stores"][storeNumber]["msg"] != store["partsAvailability"][parts]["pickupSearchQuote"]) { - // 更新库存情况 - stock[parts]["stores"][storeNumber]["msg"] = store["partsAvailability"][parts]["pickupSearchQuote"]; - stock[parts]["stores"][storeNumber]["pickup"] = store["partsAvailability"][parts]["pickupDisplay"] != "unavailable"; - // 库存变化推送通知 - stock[parts]["stores"][storeNumber]["notify"] = true; - } else { - // 库存未变化不推送 - stock[parts]["stores"][storeNumber]["notify"] = false; - } - } - - let now = new Date(); - if (!stock[parts]["title"] && !name) { - name = "未命名商品"; - } - let logStr = `${name}\n`; - let title = `${name} - ${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}`; - let watchResult = "全部售罄"; - let stockInContent = ""; // 有库存的型号与店铺 - let soldOutContent = ""; // 售罄的型号与店铺 - let unchangContent = ""; // 没有变化的型号与店铺 - let content = ""; - - // 整理通知内容 - for (let storeStock of Object.values(stock[parts]["stores"])) { - subObj["watch"] += 1; - // 有货 - if (storeStock["pickup"]) { - subObj["pickup"] += 1; - if (watchResult == "全部售罄") watchResult = `${storeStock["city"]} ${storeStock["name"]}`; - if (storeStock["notify"] === true) { - subObj["changed"] += 1; - if (!!stockInContent) stockInContent += "\n"; - stockInContent += `🔆 ${storeStock["name"]} - ${storeStock["msg"]}↑`; - } else { - if (!!unchangContent) unchangContent += "\n"; - unchangContent += `🔆 ${storeStock["name"]} - ${storeStock["msg"]}● `; + const wrap = async () =>{ + let partsConfig = goods_models[i].split("#"); + let parts = partsConfig[0]; + let option = partsConfig.length >= 2 ? partsConfig[1] : ""; + let name = partsConfig.length == 3 ? partsConfig[2] : ""; + let subObj = { watch: 0, pickup: 0, soldout: 0, changed: 0 }; + let availability = await getGoodsStock(parts, applestore_region, option); + + if (availability && availability.length > 0) { + // 获取AppleStore取货信息 + for (let store of availability) { + let storeNumber = store["storeNumber"]; + if (!stock.hasOwnProperty(parts)) { + stock[parts] = { title: store["partsAvailability"][parts]["storePickupProductTitle"], stores: {} }; } - logStr += `${storeStock["name"]} - ${storeStock["msg"]}\n`; - } - - // 售罄 - else { - subObj["soldout"] += 1; - if (storeStock["notify"] === true) { - subObj["changed"] += 1; - if (!!soldOutContent) soldOutContent += "\n"; - soldOutContent += `🚫 ${storeStock["name"]} - ${storeStock["msg"]}↓`; - } else { - if (!!unchangContent) unchangContent += "\n"; - unchangContent += `🚫 ${storeStock["name"]} - ${storeStock["msg"]}○`; + if (!stock[parts]["stores"][storeNumber]) { + stock[parts]["stores"][storeNumber] = { notify: false, pickup: false, msg: "等待查询", city: store["city"], name: store["storeName"] }; + } + if (stock[parts]["stores"][storeNumber]["msg"] != store["partsAvailability"][parts]["pickupSearchQuote"]) { + // 更新库存情况 + stock[parts]["stores"][storeNumber]["msg"] = store["partsAvailability"][parts]["pickupSearchQuote"]; + stock[parts]["stores"][storeNumber]["pickup"] = store["partsAvailability"][parts]["pickupDisplay"] != "unavailable"; + // 库存变化推送通知 + stock[parts]["stores"][storeNumber]["notify"] = true; + } else { + // 库存未变化不推送 + stock[parts]["stores"][storeNumber]["notify"] = false; } - logStr += `${storeStock["name"]} - ${storeStock["msg"]}\n`; } + + let now = new Date(); + if (!stock[parts]["title"] && !name) { + name = "未命名商品"; + } + let logStr = `${name}\n`; + let title = `${name} - ${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}`; + let watchResult = "全部售罄"; + let stockInContent = ""; // 有库存的型号与店铺 + let soldOutContent = ""; // 售罄的型号与店铺 + let unchangContent = ""; // 没有变化的型号与店铺 + let content = ""; + + // 整理通知内容 + for (let storeStock of Object.values(stock[parts]["stores"])) { + subObj["watch"] += 1; + // 有货 + if (storeStock["pickup"]) { + subObj["pickup"] += 1; + if (watchResult == "全部售罄") watchResult = `${storeStock["city"]} ${storeStock["name"]}`; + if (storeStock["notify"] === true) { + subObj["changed"] += 1; + if (!!stockInContent) stockInContent += "\n"; + stockInContent += `🔆 ${storeStock["name"]} - ${storeStock["msg"]}↑`; + } else { + if (!!unchangContent) unchangContent += "\n"; + unchangContent += `🔆 ${storeStock["name"]} - ${storeStock["msg"]}● `; + } + logStr += `${storeStock["name"]} - ${storeStock["msg"]}\n`; + } + + // 售罄 + else { + subObj["soldout"] += 1; + if (storeStock["notify"] === true) { + subObj["changed"] += 1; + if (!!soldOutContent) soldOutContent += "\n"; + soldOutContent += `🚫 ${storeStock["name"]} - ${storeStock["msg"]}↓`; + } else { + if (!!unchangContent) unchangContent += "\n"; + unchangContent += `🚫 ${storeStock["name"]} - ${storeStock["msg"]}○`; + } + logStr += `${storeStock["name"]} - ${storeStock["msg"]}\n`; + } + } + if (!!stockInContent) { + content = stockInContent; + } + // 配置为无货通知且存在无货情况时 + if (magicJS.read("applestore_settings_notify_soldout") == true) { + content = !!stockInContent ? stockInContent + `\n${soldOutContent}\n${unchangContent}` : !!soldOutContent ? `${soldOutContent}\n${unchangContent}` : unchangContent; + } + if (!!content) { + let subTitle = `监控: ${subObj.watch} 售罄: ${subObj.soldout} 有货: ${subObj.pickup} ${watchResult}`; + magicJS.notify(title, subTitle, content, "applestore://"); + } + magicJS.logInfo(logStr); } - if (!!stockInContent) { - content = stockInContent; - } - // 配置为无货通知且存在无货情况时 - if (magicJS.read("applestore_settings_notify_soldout") == true) { - content = !!stockInContent ? stockInContent + `\n${soldOutContent}\n${unchangContent}` : !!soldOutContent ? `${soldOutContent}\n${unchangContent}` : unchangContent; - } - if (!!content) { - let subTitle = `监控: ${subObj.watch} 售罄: ${subObj.soldout} 有货: ${subObj.pickup} ${watchResult}`; - magicJS.notify(title, subTitle, content, "applestore://"); - } - magicJS.logInfo(logStr); } + tasks.push(wrap()); } + await Promise.all(tasks); // 存储本次库存检查结果 magicJS.write(APPLESTORE_STOCK_KEY, stock); } @@ -141,11 +152,12 @@ async function watchStock(goods_models, applestore_region) { // 监控库存 await watchStock(goods_models, applestore_region); - if (magicJS.isNode) { - while (6 <= new Date().getHours() <= 23) { + while (magicJS.isNode) { + let hours = new Date().getHours() + if (hours <= 1 || hours >= 6){ await watchStock(goods_models, applestore_region); - await magicJS.sleep(3000); } + await magicJS.sleep(5000); } magicJS.done();