|
|
@@ -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
|
|
|
};
|