shawenguan 1 년 전
부모
커밋
7cd2379242
3개의 변경된 파일287개의 추가작업 그리고 87개의 파일을 삭제
  1. 1 1
      BoxJsSub/hbcpre.json
  2. 36 31
      Scripts/hbcpre/hbcpreHelper.js
  3. 250 55
      Scripts/hbcpre/hbcpreOrder.js

+ 1 - 1
BoxJsSub/hbcpre.json

@@ -75,7 +75,7 @@
                     "id": "HbcpreUserInfo",
                     "name": "用户信息",
                     "val": "",
-                    "type": "text",
+                    "type": "textarea",
                     "placeholder": "",
                     "desc": "授权token"
                 },

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 36 - 31
Scripts/hbcpre/hbcpreHelper.js


+ 250 - 55
Scripts/hbcpre/hbcpreOrder.js

@@ -130,44 +130,31 @@ async function tryQuickOrder(){
     }
     for(let i=0; i < willBuyList.length; i++){
         const iData = willBuyList[i];
-        const buyReqData ={
-            seriesId: iData.seriesId,
-            seriesType: 0,
-            limitPrice: willPrice,
-        };
         magicJS.logger.info(`开始进行【${iData.seriesName}#${iData.amount}】快捷下单`);
-        let buyRet = await hbRequest({API: '/mall/sell/quickOrder', METHOD: 'post'}, buyReqData);
+        let buyRet = await quickOrder(iData.seriesId, willPrice, iData.seriesType);
         if(buyRet){
             if(buyRet.code == 200){
-                // magicJS.notification.appendNotifyInfo(`🎉产品【${iData.title}】快捷下单成功`);
-                if(buyRet.data.url){
-                    let queryData = magicJS.parseQueryStr(buyRet.data.url);
-                    let newHeaders = {
-                        'Accept' : `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8`,
-                        'Accept-Encoding' : `gzip, deflate, br`,
-                        'Cookie' : `aliyungf_tc=deb5a0bf09b2b2914456330284da78f4dd6625813acc42b992eb59069c342eed`,
-                        'Connection' : `keep-alive`,
-                        'Sec-Fetch-Mode' : `navigate`,
-                        'Host' : `cash.yeepay.com`,
-                        'User-Agent' : gUserAgent,
-                        'Sec-Fetch-Site' : `cross-site`,
-                        'Referer' : `https://luanshu.hbcpre.com/`,
-                        'Sec-Fetch-Dest' : `document`,
-                        'Accept-Language' : `zh-CN,zh-Hans;q=0.9`,
-                        'X-AMZ-Date': new Date().toUTCString(),
-                    };
-                    let cashierInit0 = await openUrl(buyRet.data.url, newHeaders);
-                    if(cashierInit0){
+                // magicJS.notification.appendNotifyInfo(`🎉产品【${iData.seriesName}】快捷下单成功`);
+                if(buyRet.data.orderId){
+                    let orderInfo = await getOrderDetail(buyRet.data.orderId);
+                    let payRet = null;
+                    if(orderInfo){
+                        let walletPayInfo = await getPayChannels(1, orderInfo.worksId);
+                        payRet = await doOrderPay(walletPayInfo.payType);
+                    }
+                    if(payRet){
+                        let bOpenRet = await browserOpenUrl(payRet.paymentInfo);
+                        let queryData = magicJS.parseQueryStr(payRet.paymentInfo);
                         let cashierInit1 = await yeepayWapRequest(queryData.token, queryData.merchantNo, 'BDbiAXHCpS5A*VlA7eDbTg%3D%3D');
-                        let cashierInit2 = await yeepayNewWap(queryData.token, queryData.merchantNo);
+                        let cashierInit2 = await yeepayNewWap(queryData.token);
                         let paySuccFlag = await doYeepay(queryData.token, parseFloat(iData.pay_price)+priceFloatInterval);
                         if(paySuccFlag){
-                            magicJS.notification.post(scriptName, "", `🎉产品【${iData.title}】快捷下单成功,并支付成功!`);
+                            magicJS.notification.post(scriptName, "", `🎉产品【${iData.seriesName}】快捷下单成功,并支付成功!`);
                         } else {
-                            magicJS.notification.post(scriptName, "", `🎉产品【${iData.title}】快捷下单成功,需前往支付!`, buyRet.data.url);
+                            magicJS.notification.post(scriptName, "", `🎉产品【${iData.seriesName}】快捷下单成功,需前往支付!`, payRet.paymentInfo);
                         }
                     } else {
-                        magicJS.notification.post(scriptName, "", `🎉产品【${iData.title}】快捷下单成功,需前往支付!`, buyRet.data.url);
+                        magicJS.notification.post(scriptName, "", `🎉产品【${iData.seriesName}】快捷下单成功,需前往支付!`, 'https://luanshu.hbcpre.com/order/ls/?id=2');
                     }
                 }
             } else {
@@ -179,6 +166,92 @@ async function tryQuickOrder(){
     }
 }
 
+
+async function tryNormalOrder(){
+    let itemId = magicJS.data.read(HbcpreConstKey.castingId, null);
+    let itemName = magicJS.data.read(HbcpreConstKey.collectionName, null);
+    if(!itemId && !itemName){
+        magicJS.logger.info(`缺少产品下单信息`);
+        return;
+    }
+    let itemList = magicJS.data.read(HbcpreConstKey.collectionClassList, []);
+    let willPrice = Number(magicJS.data.read(HbcpreConstKey.orderLimitPrice, 99999));
+    let priceFloatInterval = Number(magicJS.data.read(HbcpreConstKey.floatPriceIntaval, 0));
+    let willBuyList = [];
+    if(itemId){
+        for(let i=0; i < itemList.length; i++){
+            const iData = itemList[i];
+            const id = iData.id;
+            const price = parseFloat(iData.amount || 99999.99);
+            if(id == itemId){
+                if(price <= willPrice + priceFloatInterval){
+                    willBuyList.push(iData);
+                }
+                break;
+            }
+        }
+    }
+    if(itemName){
+        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;
+            }
+        }
+    }
+    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}】快捷下单`);
+        let worksItem = await filterStableWorksData(iData.seriesId, willPrice, priceFloatInterval);
+        if(worksItem){
+            let buyRet = await normalOrder(worksItem);
+            if(buyRet){
+                if(buyRet.code == 200){
+                    // magicJS.notification.appendNotifyInfo(`🎉产品【${iData.seriesName}】快捷下单成功`);
+                    if(buyRet.data.orderId){
+                        let orderInfo = await getOrderDetail(buyRet.data.orderId);
+                        let payRet = null;
+                        if(orderInfo){
+                            let walletPayInfo = await getPayChannels(1, orderInfo.worksId);
+                            payRet = await doOrderPay(walletPayInfo.payType);
+                        }
+                        if(payRet){
+                            let bOpenRet = await browserOpenUrl(payRet.paymentInfo);
+                            let queryData = magicJS.parseQueryStr(payRet.paymentInfo);
+                            let cashierInit1 = await yeepayWapRequest(queryData.token, queryData.merchantNo, 'BDbiAXHCpS5A*VlA7eDbTg%3D%3D');
+                            let cashierInit2 = await yeepayNewWap(queryData.token);
+                            let paySuccFlag = await doYeepay(queryData.token, parseFloat(iData.pay_price)+priceFloatInterval);
+                            if(paySuccFlag){
+                                magicJS.notification.post(scriptName, "", `🎉产品【${iData.seriesName}】快捷下单成功,并支付成功!`);
+                            } else {
+                                magicJS.notification.post(scriptName, "", `🎉产品【${iData.seriesName}】快捷下单成功,需前往支付!`, payRet.paymentInfo);
+                            }
+                        } else {
+                            magicJS.notification.post(scriptName, "", `🎉产品【${iData.seriesName}】快捷下单成功,需前往支付!`, 'https://luanshu.hbcpre.com/order/ls/?id=2');
+                        }
+                    }
+                } else {
+                    magicJS.logger.info(buyRet.message);
+                }
+            } else {
+                magicJS.logger.info(`发生异常或者超时,请重试!`);
+            }
+
+        } else {
+            magicJS.logger.info(`没有匹配符合价格要求的产品`);
+        }
+    }
+}
+
 function shallowClone(obj) {
     let clone = {};
     for (let key in obj) {
@@ -189,6 +262,140 @@ function shallowClone(obj) {
     return clone;
 }
 
+async function quickOrder(seriesId, limitPrice, seriesType){
+    let reqData = {
+        seriesType: seriesType || 0,
+        seriesId: seriesId,
+        limitPrice: limitPrice,
+    };
+    let result = await hbRequest({API: '/mall/sell/quickOrder', METHOD: 'post'}, reqData);
+    return result;
+}
+
+
+async function normalOrder(worksItem){
+    let reqData = {
+        seriesType: worksItem.seriesType,
+        seriesId: worksItem.seriesId,
+        worksId: worksItem.worksId,
+        worksNo: worksItem.wordsNo,
+        amount: parseInt(worksItem.priceCny).toString(),
+    };
+    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 = {
+        seriesId: seriesId,
+        page: pageNum,
+        pageSize: pageSize,
+        sort: sort,
+        status: status,
+    };
+    let result = await hbRequest({API: '/mall/works/page', METHOD: 'get'}, reqData);
+    if(result.code == 200){
+        return result.data;
+    }
+    return null;
+}
+
+async function filterStableWorksData(seriesId, limitPrice, priceFloatInterval){
+    let totalPageNum = 1;
+    let pageNum = 1;
+    let retMateItem = null;
+    while(pageNum < 100){
+        let pageData = await getMarketWorksData(seriesId, 1, 1, 50, pageNum);
+        if(!pageData){
+            await magicJS.utils.sleep(500);
+            continue;
+        }
+        let itemList = pageData.list;
+        for(let i=0; i < itemList.length; i++){
+            if(itemList[i].priceCny <= limitPrice + priceFloatInterval && itemList[i].worksStatus == 6){
+                retMateItem = itemList[i];
+                break;
+            }
+        }
+        if(retMateItem){
+            break;
+        }
+        if(pageData.hashNext != !){
+            break;
+        }
+        pageNum += 1;
+        await magicJS.utils.sleep(500);
+    }
+    return retMateItem;
+}
+
+async function getOrderDetail(orderId){
+    let reqData = {
+        orderId: orderId,
+    };
+    let result = await hbRequest({API: '/mall/order/detail', METHOD: 'get'}, reqData);
+    if(result.code == 200){
+        return result.data;
+    }
+    return null;
+}
+
+async function getPayChannels(type, worksId, purseName){
+    let reqData = {
+        type: type,
+        worksId: worksId,
+    };
+    let result = await hbRequest({API: '/mall/wallet/getPayChannels', METHOD: 'get'}, reqData);
+    if(result.code == 200){
+        let dataList = result.data;
+        if(purseName){
+            for(let i = 0; i < dataList.length; i++){
+                if(dataList[i].purseName.indexOf(purseName) > -1){
+                    return dataList[i];
+                }
+            }
+        }
+        return dataList[0];
+    }
+    return null;
+}
+
+
+async function doOrderPay(payType, orderId){
+    let reqData = {
+        payType: payType,
+        orderId: orderId,
+    };
+    let result = await hbRequest({API: '/mall/order/pay', METHOD: 'get'}, reqData);
+    if(result.code == 200){
+        return result.data;
+    }
+    return null;
+}
+
+async function browserOpenUrl(url, headers){
+    let options = {
+        url: `${url}`,
+        headers: headers,
+        body: ``
+    };
+    let result = await magicJS.http.get(options).then(response => {
+        try {
+            magicJS.logger.info(JSON.stringify(response));
+            const body = response.body;
+            magicJS.logger.info(body);
+            return body;
+        } catch (e) {
+            magicJS.logger.error(e);
+        }
+    }).catch(err => {
+        const msg = `打开网页异常\n${JSON.stringify(err)}`;
+        magicJS.logger.error(msg);
+    });
+    return result;
+}
+
 async function yeepayWapRequest(token, merchantNo, key){
     const url = `https://cash.yeepay.com/wap/request/${merchantNo}/${key}?token=${merchantNo}`;
     const headers = gYeepayHeaders;
@@ -535,30 +742,6 @@ function decryptAES(wordStr, keyStr, ivStr) {
     return decrypt.toString();
 }
 
-
-async function openUrl(url, headers){
-    let options = {
-        url: `${url}`,
-        headers: headers,
-        body: ``
-    };
-    let result = await magicJS.http.get(options).then(response => {
-        try {
-            magicJS.logger.info(JSON.stringify(response));
-            const body = response.body;
-            magicJS.logger.info(body);
-            return body;
-        } catch (e) {
-            magicJS.logger.error(e);
-        }
-    }).catch(err => {
-        const msg = `打开网页异常\n${JSON.stringify(err)}`;
-        magicJS.logger.error(msg);
-    });
-    return result;
-}
-
-
 async function hbRequest(config, data) {
     const api = config.API;
     const method = config.METHOD;
@@ -567,9 +750,21 @@ async function hbRequest(config, data) {
     headers['trans-id'] = md5.hex_md5_32Upper(`${new Date().getTime()}`);
 
     const baseConfig = getBaseConfig();
-    let body = JSON.stringify(data);
+    let body = '';
+    let url = `${baseConfig.api_host}${api}`;
+    if(method == 'post'){
+        let contentType = headers['Content-Type'];
+        if(contentType && contentType.indexOf('form') > -1){
+            // 表单
+            body = magicJS.objToQueryStr(data);
+        } else {
+            body = JSON.stringify(data);
+        }
+    } else {
+        url = `${url}?${magicJS.objToQueryStr(data)}`;
+    }
     let options = {
-        url: `${baseConfig.api_host}${api}`,
+        url: url,
         headers: headers,
         body: body
     };

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.