shawenguan 1 tahun lalu
induk
melakukan
1ac990b6d8

+ 1 - 1
BoxJsSub/hbcpre.json

@@ -82,7 +82,7 @@
                     "desc": "产品列表"
                 },
                 {
-                    "id": "HbcpreItemCntRwData",
+                    "id": "HbcpreMyOwnSeriesCntFakeData",
                     "name": "拥有的产品数量自定义",
                     "val": "",
                     "type": "text",

+ 122 - 55
Scripts/hbcpre/hbcpreGrab.js

@@ -9,24 +9,25 @@
 const scriptName = `华文数交首发`;
 const magicJS = MagicJS(scriptName, "INFO");
 const HbcpreConstKey = {
+    // 基础数据
+    decryptionEnabled: 'HbcpreDecryptionEnabled',
     token: 'HbcpreUserToken',
     userPhone: 'HbcpreUserPhoneNum',
     userId: 'HbcpreUserId',
     userInfo: 'HbcpreUserInfo',
-    orderFastModeEnabled: 'HbcpreOrderFastModeEnabled',
-    collectionClassList: 'HbcpreCollectionClassList',
-    collectionMaxNumLimit: 'HbcpreCollectionMaxNumLimit',
-    collectionLockMaxNum: 'HbcpreCollectionLockMaxNum',
-    castingId: 'HbcpreCastingId',
-    collectionName: 'HbcpreCollectionName',
-    orderLimitPrice: 'HbcpreOrderLimitPrice',
-    floatPriceIntaval: 'HbcpreFloatPriceIntaval',
-    itemCntRwData: 'HbcpreItemCntRwData',
-    walletPayPassword: 'HbcpreWalletPayPassword',
-
+    walletPayPassword: 'HbcpreWalletPayPassword',// 钱包支付密码
+    myOwnSeriesCntFakeData: 'HbcpreMyOwnSeriesCntFakeData', // 资产的伪装数据
+    myOwnSeriesListDict: 'HbcpreMyOwnSeriesList',
+    myOwnSeriesDetail: 'HbcpreMyOwnSeriesDetail',
+
+    // 首发相关的
+    homeSeriesDataGrabEnabled: 'HbcpreHomeSeriesDataGrabEnabled',
+    homeSeriesOpenTimeOffset: 'HbcpreOpeningTimeOffset',
     homeSeriesList: 'HbcpreHomeSeriesList',
+    homeSeriesInfo: 'HbcpreHomeSeriesInfo',
     homeSeriesId: 'HbcpreHomeSeriesId',
     homeSeriesName: 'HbcpreHomeSeriesName',
+    homeSeriesLimitBuy: 'HbcpreHomeSeriesLimitBuy',
 };
 
 const gUserAgent = `Mozilla/5.0 (iPhone; CPU iPhone OS 16_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1`;
@@ -101,46 +102,39 @@ async function tryGrabNew() {
         magicJS.logger.info(`缺少首发产品信息`);
         return;
     }
-    let itemList = magicJS.data.read(HbcpreConstKey.homeSeriesList, []);
-
-    let willPrice = Number(magicJS.data.read(HbcpreConstKey.orderLimitPrice, 99999));
-    let priceFloatInterval = Number(magicJS.data.read(HbcpreConstKey.floatPriceIntaval, 0));
+    let onlyUseCacheData = true;
     let willBuyList = [];
-    if (itemId.length > 0 && itemId > 0) {
-        magicJS.logger.info(`通过产品系列号来进行匹配`);
-        for (let i = 0; i < itemList.length; i++) {
-            const iData = itemList[i];
-            const seriesId = iData.seriesId;
-            const price = parseFloat(iData.amount || 99999.99);
-            if (seriesId == itemId) {
-                if (price <= willPrice + priceFloatInterval) {
-                    willBuyList.push(iData);
-                }
-                break;
-            }
-        }
-    }
-    if (willBuyList.length == 0 && itemName) {
-        magicJS.logger.info(`通过产品名称来进行匹配`);
-        for (let i = 0; i < itemList.length; i++) {
-            const iData = itemList[i];
-            const seriesName = iData.seriesName;
-            const price = parseFloat(iData.amount || 99999.99);
-            if (seriesName.indexOf(itemName) > -1) {
-                if (price <= willPrice + priceFloatInterval) {
-                    willBuyList.push(iData);
-                }
-                break;
+    let seriesSimple = getHomeSeriesCache(itemId, itemName);
+    if(seriesSimple){
+        willBuyList.push(seriesSimple);
+    } else {
+        if(!onlyUseCacheData){
+            seriesSimple = await filterStableSeriesData(itemId, itemName);
+            if(seriesSimple){
+                willBuyList.push(seriesSimple);
             }
         }
     }
+
     if (willBuyList.length == 0) {
         magicJS.logger.info(`没有匹配符合要求的产品`);
     }
     for (let i = 0; i < willBuyList.length; i++) {
         const iData = willBuyList[i];
-        magicJS.logger.info(`开始进行【${iData.seriesName}#${iData.amount || iData.price}】快捷下单`);
-        let buyRet = await primOrder(iData.seriesId, 1);
+        magicJS.logger.info(`开始进行【${iData.seriesName}】首发抢购`);
+        let seriesInfo = getHomeSeriesInfoCache(iData.seriesId);
+        let limitBuyNum = magicJS.data.read(HbcpreConstKey.homeSeriesLimitBuy, 1);
+        if(seriesInfo){
+            limitBuyNum = seriesInfo.limitBuy;
+        } else {
+            if(!onlyUseCacheData){
+                seriesInfo = await getSeriesInfo(iData.seriesId);
+                if(seriesInfo){
+                    limitBuyNum = seriesInfo.limitBuy;
+                }
+            }
+        }
+        let buyRet = await primOrder(iData.seriesId, limitBuyNum || 1);
         if (buyRet) {
             if (buyRet.code == 200) {
                 // magicJS.notification.appendNotifyInfo(`🎉产品【${iData.seriesName}】快捷下单成功`);
@@ -176,6 +170,92 @@ async function tryGrabNew() {
     }
 }
 
+function getHomeSeriesCache(seriesId, seriesName) {
+    let dataList = magicJS.data.read(HbcpreConstKey.homeSeriesList, []);
+    if(seriesId != void 0){
+        for (let i = 0; i < dataList.length; i++) {
+            if (seriesId == dataList[i].seriesId) {
+                return dataList[i];
+            }
+        }
+    }
+    if(seriesName != void 0){
+        for (let i = 0; i < dataList.length; i++) {
+            if (dataList[i].seriesName.indexOf(seriesName) > -1) {
+                return dataList[i];
+            }
+        }
+    }
+    return null;
+}
+
+function getHomeSeriesInfoCache(seriesId){
+    let storeKey = `${HbcpreConstKey.homeSeriesInfo}#${seriesId}`;
+    return magicJS.data.read(storeKey, null);
+}
+
+async function filterStableSeriesData(seriesId, seriesName) {
+    let pageNum = 1;
+    let retMateItem = null;
+    while (pageNum < 100) {
+        let pageDataRet = await getHomeSeries(pageNum, 10);
+        if (!pageDataRet) {
+            await magicJS.utils.sleep(500);
+            continue;
+        }
+        if(pageDataRet.code == 217){
+            // token失效
+            break;
+        }
+        if(pageDataRet.code != 200){
+            break;
+        }
+        let itemList = pageDataRet.data.list;
+        for (let i = 0; i < itemList.length; i++) {
+            if (seriesId && itemList[i].seriesId == seriesId) {
+                retMateItem = itemList[i];
+                break;
+            }
+            if (seriesName && itemList[i].seriesName.indexOf(seriesName) > -1){
+                retMateItem = itemList[i];
+                break;
+            }
+        }
+        if (retMateItem) {
+            break;
+        }
+        if (pageData.hashNext != 1) {
+            break;
+        }
+        pageNum += 1;
+        await magicJS.utils.sleep(500);
+    }
+    return retMateItem;
+}
+
+async function getHomeSeries(page, pageSize = 10){
+    let reqData = {
+        page: page,
+        pageSize: pageSize,
+    };
+    let result = await hbRequest({ API: '/mall/home/series', METHOD: 'get' }, reqData);
+    if(result.code == 200){
+        return result.data;
+    }
+    return null;
+}
+
+async function getSeriesInfo(seriesId){
+    let reqData = {
+        seriesId: seriesId,
+    };
+    let result = await hbRequest({ API: '/mall/series/seriesInfo', METHOD: 'get' }, reqData);
+    if(result.code == 200){
+        return result.data;
+    }
+    return null;
+}
+
 function shallowClone(obj) {
     let clone = {};
     for (let key in obj) {
@@ -201,19 +281,6 @@ async function primOrder(seriesId, buyNum) {
     return result;
 }
 
-
-async function normalOrder(worksItem) {
-    let reqData = {
-        seriesType: worksItem.seriesType,
-        seriesId: worksItem.seriesId,
-        worksId: worksItem.worksId,
-        worksNo: worksItem.worksNo,
-        amount: String(parseInt(worksItem.priceCny)),
-    };
-    let result = await hbRequest({ API: '/mall/sell/order', METHOD: 'post' }, reqData);
-    return result;
-}
-
 async function getMarketWorksData(seriesId, status, sort, pageSize, pageNum) {
     // sort 1=价格顺序 3=价格倒序 0=编号顺序 2=编号倒序
     let reqData = {

+ 59 - 9
Scripts/hbcpre/hbcpreHelper.js

@@ -24,25 +24,28 @@ const HbcpreConstKey = {
     userId: 'HbcpreUserId',
     userInfo: 'HbcpreUserInfo',
     walletPayPassword: 'HbcpreWalletPayPassword',// 钱包支付密码
-    mySeriesOwnCntFakeData: 'HbcpreItemCntRwData', // 资产的伪装数据
+    myOwnSeriesCntFakeData: 'HbcpreMyOwnSeriesCntFakeData', // 资产的伪装数据
+    myOwnSeriesListDict: 'HbcpreMyOwnSeriesList',
+    myOwnSeriesDetail: 'HbcpreMyOwnSeriesDetail',
 
     // 下单相关的
     marketSeriesDataGrabEnabled: 'HbcpreOrderItemDataGrabEnabled',
     marketItemWatchLocked: 'HbcpreCollectionWatchLocked',
     marketFastModeEnabled: 'HbcpreOrderFastModeEnabled',
     marketSeriesList: 'HbcpreCollectionClassList',
-    marketSeriesDetail: 'HbcpreCollectionClassDetail',
     marketSeriesId: 'HbcpreCastingId',
     marketSeriesName: 'HbcpreCollectionName',
     marketOrderLimitPrice: 'HbcpreOrderLimitPrice',
     marketOrderPriceInterval: 'HbcpreFloatPriceIntaval',
 
     // 首发相关的
+    homeSeriesDataGrabEnabled: 'HbcpreHomeSeriesDataGrabEnabled',
     homeSeriesOpenTimeOffset: 'HbcpreOpeningTimeOffset',
     homeSeriesList: 'HbcpreHomeSeriesList',
+    homeSeriesInfo: 'HbcpreHomeSeriesInfo',
     homeSeriesId: 'HbcpreHomeSeriesId',
     homeSeriesName: 'HbcpreHomeSeriesName',
-
+    homeSeriesLimitBuy: 'HbcpreHomeSeriesLimitBuy',
 
     drawItemDataGrabEnabled: 'HbcpreDrawItemDataGrabEnabled',
     compoundItemDataGrabEnabled: 'HbcpreCompoundItemDataGrabEnabled',
@@ -107,6 +110,16 @@ async function Main() {
     }
 }
 
+function shallowClone(obj) {
+    let clone = {};
+    for (let key in obj) {
+        if (obj.hasOwnProperty(key)) {
+            clone[key] = obj[key];
+        }
+    }
+    return clone;
+}
+
 function isDecryptionEnabled() {
     let flag = magicJS.data.read(HbcpreConstKey.decryptionEnabled, null);
     if (flag == null) {
@@ -131,6 +144,14 @@ function isSeriesDataGrabEnabled() {
     return JSON.parse(flag);
 }
 
+function isHomeSeriesDataGrabEnabled() {
+    let flag = magicJS.data.read(HbcpreConstKey.homeSeriesDataGrabEnabled, null);
+    if (flag == null) {
+        return false;
+    }
+    return JSON.parse(flag);
+}
+
 function isCompoundItemGrabEnabled() {
     let flag = magicJS.data.read(HbcpreConstKey.compoundItemDataGrabEnabled, null);
     if (flag == null) {
@@ -157,7 +178,7 @@ function isExchangeItemGrabEnabled() {
 
 function readMySeriesOwnCntFakeData() {
     gItemCntRwDict = {};
-    let text = magicJS.data.read(HbcpreConstKey.mySeriesOwnCntFakeData, null);
+    let text = magicJS.data.read(HbcpreConstKey.myOwnSeriesCntFakeData, null);
     if (text) {
         let segments = text.split('|');
         for (let i = segments.length - 1; i >= 0; i--) {
@@ -439,10 +460,21 @@ function handlerHomeSeriesList(){
     if (rspData.code != 200) {
         return;
     }
+    let dataList = magicJS.data.read(HbcpreConstKey.marketSeriesList, []);
+    let tmpItemDict = {};
+    for (let i = 0; i < dataList.length; i++) {
+        const id = dataList[i].seriesId;
+        tmpItemDict[id] = dataList[i];
+    }
+
     let otimeOffset = magicJS.data.read(HbcpreConstKey.homeSeriesOpenTimeOffset, 60000);
     let seriesList = rspData.data.list || [];
+
     for(let i=0; i < seriesList.length; i++){
         const item = seriesList[i];
+        const id = iData.seriesId;
+        tmpItemDict[id] = shallowClone(item);
+
         item.seriesName = `${item.seriesName}-剩${item.issueNum-item.soldNum}`;
         item.seriesName = `${item.seriesName} ${magicJS.formatDate(new Date(item.saleTime), 'MM-dd HH:mm:ss')}开售`;
         if(item.soldNum >= item.issueNum){
@@ -451,6 +483,13 @@ function handlerHomeSeriesList(){
         item.saleTime -= otimeOffset;
         item.status = 2;
     }
+
+    dataList = [];
+    for (let k in tmpItemDict) {
+        dataList.push(tmpItemDict[k]);
+    }
+    magicJS.data.write(HbcpreConstKey.homeSeriesList, dataList);
+    
     gRetBody = rspData;
 }
 
@@ -487,13 +526,13 @@ function handleMarketSeriesList() {
     if (rspData.code != 200) {
         return;
     }
-    let dataList = magicJS.data.read(HbcpreConstKey.marketSeriesList, []);
     let reqData = getQueryPlainData();
     let nftType = reqData.nftType || 0;//0=数字资产 1=盲盒
 
+    let dataList = magicJS.data.read(HbcpreConstKey.marketSeriesList, []);
     let tmpItemDict = {};
     for (let i = 0; i < dataList.length; i++) {
-        const id = dataList[i].id;
+        const id = dataList[i].seriesId;
         tmpItemDict[id] = dataList[i];
     }
 
@@ -550,6 +589,17 @@ function handleSeriesInfo() {
     // quantityNumber //发行
     // circulationNumber //流通
     if(seriesInfo.openingTime > 0){
+        if(isHomeSeriesDataGrabEnabled()){
+            let seriesId = seriesInfo.seriesId;
+            let storeKey = `${HbcpreConstKey.homeSeriesInfo}#${seriesInfo.seriesId}`;
+            magicJS.data.write(storeKey, seriesInfo);
+
+            magicJS.data.write(HbcpreConstKey.homeSeriesId, seriesInfo.seriesId);
+            magicJS.data.write(HbcpreConstKey.homeSeriesName, seriesInfo.seriesName);
+            magicJS.data.write(HbcpreConstKey.homeSeriesLimitBuy, seriesInfo.limitBuy);
+            magicJS.notification.post(scriptName, "", `🎉[${seriesInfo.seriesName}-限一ID购${seriesInfo.limitBuy}]首发数据采集成功!`);
+        }
+
         // 上新提前开放时间
         let otimeOffset = magicJS.data.read(HbcpreConstKey.homeSeriesOpenTimeOffset, 60000);
         seriesInfo.openingTime -= otimeOffset;
@@ -654,7 +704,7 @@ function handlerMySeriesList() {
     let currPage = rspData.data.currPage;
     let mySeriesData = {};
     if (currPage > 1) {
-        mySeriesData = magicJS.data.read(HbcpreConstKey.marketSeriesList, {});
+        mySeriesData = magicJS.data.read(HbcpreConstKey.myOwnSeriesListDict, {});
     }
     // reqData.type 0=数字资产 1=盲盒 5=我的寄售 4=已卖出
     if (reqData.type == 0 || reqData.type == 1) {
@@ -674,7 +724,7 @@ function handlerMySeriesList() {
             item.seriesName = `${seriesName}#¥${parseFloat(item.avgPrice).toFixed(2)}`;
             item.authorName = `存量(${formatNumberWithKAndW(item.soldNum)}/${formatNumberWithKAndW(item.issueNum)})`;
         }
-        magicJS.data.write(HbcpreConstKey.marketSeriesList, mySeriesData);
+        magicJS.data.write(HbcpreConstKey.myOwnSeriesListDict, mySeriesData);
         gRetBody = rspData;
     }
 }
@@ -691,7 +741,7 @@ function handlerMyWorksList() {
     let seriesId = reqData.seriesId;
     let currPage = rspData.data.currPage;
     let myWorksData = {};
-    let storeKey = `${HbcpreConstKey.marketSeriesDetail}#${seriesId}`;
+    let storeKey = `${HbcpreConstKey.myOwnSeriesDetail}#${seriesId}`;
     if (currPage > 1) {
         myWorksData = magicJS.data.read(storeKey, {});
     }

+ 3 - 2
Scripts/hbcpre/hbcpreOrder.js

@@ -15,14 +15,15 @@ const HbcpreConstKey = {
     userId: 'HbcpreUserId',
     userInfo: 'HbcpreUserInfo',
     walletPayPassword: 'HbcpreWalletPayPassword',// 钱包支付密码
-    mySeriesOwnCntFakeData: 'HbcpreItemCntRwData', // 资产的伪装数据
+    myOwnSeriesCntFakeData: 'HbcpreMyOwnSeriesCntFakeData', // 资产的伪装数据
+    myOwnSeriesListDict: 'HbcpreMyOwnSeriesList',
+    myOwnSeriesDetail: 'HbcpreMyOwnSeriesDetail',
 
     // 下单相关的
     marketSeriesDataGrabEnabled: 'HbcpreOrderItemDataGrabEnabled',
     marketItemWatchLocked: 'HbcpreCollectionWatchLocked',
     marketFastModeEnabled: 'HbcpreOrderFastModeEnabled',
     marketSeriesList: 'HbcpreCollectionClassList',
-    marketSeriesDetail: 'HbcpreCollectionClassDetail',
     marketSeriesId: 'HbcpreCastingId',
     marketSeriesName: 'HbcpreCollectionName',
     marketOrderLimitPrice: 'HbcpreOrderLimitPrice',