|
|
@@ -253,7 +253,7 @@ function getPlanLotteryDrongonMaxTurn() {
|
|
|
return Number(amount);
|
|
|
}
|
|
|
|
|
|
-function getPlanLotteryCostrReduceA(){
|
|
|
+function getPlanLotteryCostrReduceA() {
|
|
|
let multiple = magicJS.data.read('168_PksPlanLotteryCostrReduceA', null);
|
|
|
if (multiple == null) {
|
|
|
return 16;
|
|
|
@@ -261,7 +261,7 @@ function getPlanLotteryCostrReduceA(){
|
|
|
return Number(multiple);
|
|
|
}
|
|
|
|
|
|
-function getPlanLotteryCostrReduceB(){
|
|
|
+function getPlanLotteryCostrReduceB() {
|
|
|
let multiple = magicJS.data.read('168_PksPlanLotteryCostrReduceB', null);
|
|
|
if (multiple == null) {
|
|
|
return 8;
|
|
|
@@ -269,7 +269,7 @@ function getPlanLotteryCostrReduceB(){
|
|
|
return Number(multiple);
|
|
|
}
|
|
|
|
|
|
-function getPlanLotteryCostrReduceC(){
|
|
|
+function getPlanLotteryCostrReduceC() {
|
|
|
let multiple = magicJS.data.read('168_PksPlanLotteryCostrReduceC', null);
|
|
|
if (multiple == null) {
|
|
|
return 4;
|
|
|
@@ -277,6 +277,14 @@ function getPlanLotteryCostrReduceC(){
|
|
|
return Number(multiple);
|
|
|
}
|
|
|
|
|
|
+function getAllowBetProbability(planType) {
|
|
|
+ let value = magicJS.data.read('168_PksPlanAllowBetProbability', null);
|
|
|
+ if (value == null) {
|
|
|
+ return 70;
|
|
|
+ }
|
|
|
+ return Number(value);
|
|
|
+}
|
|
|
+
|
|
|
async function getHtmlContent(url, headers) {
|
|
|
let options = {
|
|
|
url: `${url}`,
|
|
|
@@ -491,17 +499,17 @@ function checkHitPrize(drawCodeStr, planStr, posNum = 0) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-function calcPlanMatchCount(planArr, planStr){
|
|
|
+function calcPlanMatchCount(planArr, planStr) {
|
|
|
let mateCount = 0;
|
|
|
- for(let i=0; i < planArr.length; i++){
|
|
|
- if(planStr.indexOf(planArr[i]) > -1){
|
|
|
- mateCount+=1;
|
|
|
+ for (let i = 0; i < planArr.length; i++) {
|
|
|
+ if (planStr.indexOf(planArr[i]) > -1) {
|
|
|
+ mateCount += 1;
|
|
|
}
|
|
|
}
|
|
|
return mateCount;
|
|
|
}
|
|
|
|
|
|
-function analyseBetProbability(planType, pksPlanItemData, pksPlanListData){
|
|
|
+async function analyseBetProbability(planType, pksPlanItemData, pksPlanListData) {
|
|
|
let probability = 100;
|
|
|
let planC = pksPlanItemData.planC;
|
|
|
let planB = pksPlanItemData.planB;
|
|
|
@@ -511,31 +519,73 @@ function analyseBetProbability(planType, pksPlanItemData, pksPlanListData){
|
|
|
let planAArr = planA.split(',');
|
|
|
let maxMateCount = 7;
|
|
|
let curMateCount = 0;
|
|
|
- if(planType == 'A'){
|
|
|
+
|
|
|
+ let oneCostC = Math.floor(pksPlanItemData.lotteryCostC / 3);
|
|
|
+ let oneCostB = Math.floor(pksPlanItemData.lotteryCostB / 4);
|
|
|
+ let oneCostA = Math.floor(pksPlanItemData.lotteryCostA / 5);
|
|
|
+ let turnNumC = Math.floor(Math.log2(oneCostC));
|
|
|
+ let turnNumB = Math.floor(Math.log2(oneCostB));
|
|
|
+ let turnNumA = Math.floor(Math.log2(oneCostA));
|
|
|
+
|
|
|
+ let maxTurnCount = turnNumA * 3;
|
|
|
+ let logMsg = '';
|
|
|
+ if (planType == 'A') {
|
|
|
maxMateCount = Math.min(planAArr.length, planBArr.length) + Math.min(planAArr.length, planCArr.length);
|
|
|
curMateCount = calcPlanMatchCount(planAArr, planB) + calcPlanMatchCount(planAArr, planC);
|
|
|
- }else if(planType == 'B'){
|
|
|
+ maxTurnCount = turnNumA * 3;
|
|
|
+ logMsg += `\n[1]推荐计划A与BC号码交合次数:${curMateCount}/${maxMateCount}`;
|
|
|
+ } else if (planType == 'B') {
|
|
|
maxMateCount = Math.min(planBArr.length, planAArr.length) + Math.min(planBArr.length, planCArr.length);
|
|
|
curMateCount = calcPlanMatchCount(planBArr, planA) + calcPlanMatchCount(planBArr, planC);
|
|
|
- }else{
|
|
|
+ maxTurnCount = turnNumB * 3;
|
|
|
+ logMsg += `\n[1]推荐计划B与AC号码交合次数:${curMateCount}/${maxMateCount}`;
|
|
|
+ } else {
|
|
|
maxMateCount = Math.min(planCArr.length, planAArr.length) + Math.min(planCArr.length, planBArr.length);
|
|
|
curMateCount = calcPlanMatchCount(planCArr, planA) + calcPlanMatchCount(planCArr, planB);
|
|
|
+ maxTurnCount = turnNumC * 3;
|
|
|
+ logMsg += `\n[1]推荐计划C与AB号码交合次数:${curMateCount}/${maxMateCount}`;
|
|
|
+ }
|
|
|
+ logMsg += `\n[2]推荐计划CBA相合连续期数系数:(${turnNumC}+${turnNumB}+${turnNumA})=${(turnNumC + turnNumB + turnNumA)}/${maxTurnCount}`;
|
|
|
+ let factor1 = 25 * (curMateCount / maxMateCount);
|
|
|
+ let factor2 = 0;
|
|
|
+ if (maxTurnCount > 5) {
|
|
|
+ factor2 = 25 * (turnNumC + turnNumB + turnNumA) / maxTurnCount;
|
|
|
}
|
|
|
- let factor1 = 25*(curMateCount/maxMateCount);
|
|
|
|
|
|
- let oneCostC = Math.floor(pksPlanItemData.lotteryCostC/3);
|
|
|
- let oneCostB = Math.floor(pksPlanItemData.lotteryCostB/4);
|
|
|
- let oneCostA = Math.floor(pksPlanItemData.lotteryCostA/5);
|
|
|
- let turnNumC = Math.floor(Math.log2(oneCostC));
|
|
|
- let turnNumB = Math.floor(Math.log2(oneCostB));
|
|
|
- let turnNumA = Math.floor(Math.log2(oneCostA));
|
|
|
+ probability = probability - factor1 - factor2;
|
|
|
|
|
|
- let maxTurnCount = turnNumA*3;
|
|
|
- let factor2 = 25*(turnNumC+turnNumB+turnNumA)/maxTurnCount;
|
|
|
+ let factor3 = 0;
|
|
|
+ let nowDate = formatNow();
|
|
|
+ let killData = await getPksKillNumListFirst(gLotteryCode, nowDate, 30);
|
|
|
+ if (killData) {
|
|
|
+ let killNumDict = killData.firstNumDict;
|
|
|
+ let killTotalCount = 0;
|
|
|
+ if (planType == 'A') {
|
|
|
+ killTotalCount = calcPlanKillTotalCount(killNumDict, planAArr);
|
|
|
+ } else if (planType == 'B') {
|
|
|
+ killTotalCount = calcPlanKillTotalCount(killNumDict, planBArr);
|
|
|
+ } else {
|
|
|
+ killTotalCount = calcPlanKillTotalCount(killNumDict, planCArr);
|
|
|
+ }
|
|
|
+ factor3 = killTotalCount * 5;
|
|
|
+ logMsg += `\n[3]杀号:${JSON.stringify(killNumDict)} 杀中次数:${killTotalCount}`;
|
|
|
+ }
|
|
|
+ probability = probability - factor3;
|
|
|
+ logMsg += `\n综合中奖概率减 系数1=${factor1.toFixed(2)} 系数2=${factor2.toFixed(2)} 系数3=${factor3.toFixed(2)}`;
|
|
|
+ magicJS.logger.info(logMsg);
|
|
|
|
|
|
- probability = probability - factor1 - factor2;
|
|
|
+ return [probability, logMsg];
|
|
|
+}
|
|
|
|
|
|
- return probability;
|
|
|
+function calcPlanKillTotalCount(killNumDict, planArr) {
|
|
|
+ let retValue = 0;
|
|
|
+ for (let i = 0; i < planArr.length; i++) {
|
|
|
+ let n = parseInt(planArr[i]);
|
|
|
+ if (killNumDict[n]) {
|
|
|
+ retValue += killNumDict[n];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return retValue;
|
|
|
}
|
|
|
|
|
|
async function checkPlanCBuyNotify(pksPlanItemData, pksPlanListData) {
|
|
|
@@ -579,10 +629,17 @@ async function checkPlanCBuyNotify(pksPlanItemData, pksPlanListData) {
|
|
|
}
|
|
|
|
|
|
if (isPlanLotteryAutoBet()) {
|
|
|
- let probability = analyseBetProbability('C', pksPlanItemData, pksPlanListData);
|
|
|
- if(probability >= 70){
|
|
|
+ let [probability, analyseLogMsg] = await analyseBetProbability('C', pksPlanItemData, pksPlanListData);
|
|
|
+ let proAllowValue = getAllowBetProbability('C');
|
|
|
+ if (probability >= proAllowValue) {
|
|
|
let maxBetAmount = getPlanLotteryMaxBetAmount();
|
|
|
let betRet = await tryDragonBet(preDrawIssue, planC, turnOneCost, maxBetAmount);
|
|
|
+ tipsMsg += `\n预估中奖率:${probability.toFixed(2)}`;
|
|
|
+ tipsMsg += analyseLogMsg;
|
|
|
+ } else {
|
|
|
+ tipsMsg = '⚠️' + tipsMsg;
|
|
|
+ tipsMsg += `\n预估中奖率:${probability.toFixed(2)},小于预设值${proAllowValue},请自主下单`;
|
|
|
+ tipsMsg += analyseLogMsg;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -632,10 +689,17 @@ async function checkPlanBBuyNotify(pksPlanItemData, pksPlanListData) {
|
|
|
}
|
|
|
|
|
|
if (isPlanLotteryAutoBet()) {
|
|
|
- let probability = analyseBetProbability('B', pksPlanItemData, pksPlanListData);
|
|
|
- if(probability >= 70){
|
|
|
+ let [probability, analyseLogMsg] = await analyseBetProbability('B', pksPlanItemData, pksPlanListData);
|
|
|
+ let proAllowValue = getAllowBetProbability('B');
|
|
|
+ if (probability >= proAllowValue) {
|
|
|
let maxBetAmount = getPlanLotteryMaxBetAmount();
|
|
|
let betRet = await tryDragonBet(preDrawIssue, planB, turnOneCost, maxBetAmount);
|
|
|
+ tipsMsg += analyseLogMsg;
|
|
|
+ tipsMsg += `\n预估中奖率:${probability.toFixed(2)}`;
|
|
|
+ } else {
|
|
|
+ tipsMsg = '⚠️' + tipsMsg;
|
|
|
+ tipsMsg += `\n预估中奖率:${probability.toFixed(2)},小于预设值${proAllowValue},请自主下单`;
|
|
|
+ tipsMsg += analyseLogMsg;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -685,10 +749,17 @@ async function checkPlanABuyNotify(pksPlanItemData, pksPlanListData) {
|
|
|
}
|
|
|
|
|
|
if (isPlanLotteryAutoBet()) {
|
|
|
- let probability = analyseBetProbability('A', pksPlanItemData, pksPlanListData);
|
|
|
- if(probability >= 70){
|
|
|
+ let [probability, analyseLogMsg] = await analyseBetProbability('A', pksPlanItemData, pksPlanListData);
|
|
|
+ let proAllowValue = getAllowBetProbability('A');
|
|
|
+ if (probability >= proAllowValue) {
|
|
|
let maxBetAmount = getPlanLotteryMaxBetAmount();
|
|
|
let betRet = await tryDragonBet(preDrawIssue, planA, turnOneCost, maxBetAmount);
|
|
|
+ tipsMsg += analyseLogMsg;
|
|
|
+ tipsMsg += `\n预估中奖率:${probability.toFixed(2)}`;
|
|
|
+ } else {
|
|
|
+ tipsMsg = '⚠️' + tipsMsg;
|
|
|
+ tipsMsg += `\n预估中奖率:${probability.toFixed(2)},小于预设值${proAllowValue},请自主下单`;
|
|
|
+ tipsMsg += analyseLogMsg;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -704,7 +775,7 @@ async function getPksPlanList(lotCode, date, rows = 30) {
|
|
|
if (cacheData && cacheData[0]) {
|
|
|
let timeStr = date + ' ' + cacheData[0].preDrawTime;
|
|
|
let preDrawDate = new Date(timeStr);
|
|
|
- magicJS.logger.info(`${timeStr}`);
|
|
|
+ magicJS.logger.info(`开奖时间:${timeStr}`);
|
|
|
if (Date.now() < preDrawDate.getTime()) {
|
|
|
magicJS.logger.info(`getPksPlanList.do无需请求,使用缓存数据`);
|
|
|
return cacheData;
|
|
|
@@ -968,6 +1039,83 @@ async function getLotteryPksInfo(lotCode) {
|
|
|
return result.result.data;
|
|
|
}
|
|
|
|
|
|
+async function getPksKillNumListFirst(lotCode, date, rows = 30) {
|
|
|
+ let result = await getPksKillNumAllList(lotCode, date, rows);
|
|
|
+ if (!result) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let killNumItem = result.list[0];
|
|
|
+ let firstNum = killNumItem.firstNum;
|
|
|
+ let numDict = {};
|
|
|
+ let numArr = [];
|
|
|
+ for (let i = 0; i < firstNum.length; i += 2) {
|
|
|
+ let n = firstNum[i];
|
|
|
+ if (!numDict[n]) {
|
|
|
+ numDict[n] = 1;
|
|
|
+ numArr.push(n);
|
|
|
+ } else {
|
|
|
+ numDict[n] += 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ result.firstNumArr = numArr;
|
|
|
+ result.firstNumDict = numDict;
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+async function getPksKillNumAllList(lotCode, date, rows = 30) {
|
|
|
+ const url = `https://${gHost}/api/KillNum/getPksKillNumList.do?lotCode=${lotCode}&rows=${rows}&date=${date}`;
|
|
|
+ magicJS.logger.info(url);
|
|
|
+ let cacheData = magicJS.data.read('168_PksKillNumListCache', null);
|
|
|
+ // magicJS.logger.info(`cacheData=${JSON.stringify(cacheData)}`);
|
|
|
+ if (cacheData && cacheData.list) {
|
|
|
+ let itemData = cacheData.list[0];
|
|
|
+ magicJS.logger.info(`期号:${itemData.preDrawIssue} 开奖时间:${itemData.preDrawDate}`);
|
|
|
+ let preDrawDate = new Date(itemData.preDrawDate);
|
|
|
+ if (Date.now() < preDrawDate.getTime()) {
|
|
|
+ magicJS.logger.info(`getPksKillNumList.do无需请求,使用缓存数据`);
|
|
|
+ return cacheData;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const myRequest = {
|
|
|
+ url: url,
|
|
|
+ headers: gCommonHeaders,
|
|
|
+ body: ``
|
|
|
+ };
|
|
|
+ let result = await magicJS.http.get(myRequest).then(response => {
|
|
|
+ try {
|
|
|
+ const body = response.body;
|
|
|
+ // magicJS.logger.info(JSON.stringify(body));
|
|
|
+ let rspData;
|
|
|
+ if (typeof body === "string") {
|
|
|
+ return {
|
|
|
+ errorCode: -1,
|
|
|
+ message: '操作失败',
|
|
|
+ result: null,
|
|
|
+ };
|
|
|
+ } else if (typeof body === "object") {
|
|
|
+ rspData = body;
|
|
|
+ }
|
|
|
+ return rspData;
|
|
|
+ } catch (e) {
|
|
|
+ magicJS.logger.error(e);
|
|
|
+ }
|
|
|
+ }).catch(err => {
|
|
|
+ const msg = `请求发生异常\n${JSON.stringify(err)}`;
|
|
|
+ magicJS.logger.error(msg);
|
|
|
+ });
|
|
|
+ if (!result) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (result.errorCode != 0 || result.result == void 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (result.result.businessCode != 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ magicJS.data.write('168_PksKillNumListCache', JSON.stringify(result.result.data));
|
|
|
+ return result.result.data;
|
|
|
+}
|
|
|
+
|
|
|
function updateRequestHeaders() {
|
|
|
gCaiLeToken = magicJS.data.read('DIII_CaiLeYuan_Token', '');
|
|
|
gCaiLeHeaders['token'] = gCaiLeToken;
|
|
|
@@ -994,11 +1142,11 @@ async function tryDragonBet(drawIssue, planStr, betAmount, maxBetAmount = 96) {
|
|
|
}
|
|
|
let result = await doDragonBet(drawIssue, planStr, betAmount);
|
|
|
if (!result) {
|
|
|
- let loginRet = await tryReLogin();
|
|
|
- if (!loginRet) {
|
|
|
- return;
|
|
|
- }
|
|
|
- result = await doDragonBet(drawIssue, planStr, betAmount);
|
|
|
+ let loginRet = await tryReLogin();
|
|
|
+ if (!loginRet) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ result = await doDragonBet(drawIssue, planStr, betAmount);
|
|
|
}
|
|
|
if (result && result.statusCode == 200) {
|
|
|
if (checkBetResult(result)) {
|
|
|
@@ -1057,153 +1205,153 @@ async function doDragonBet(drawIssue, planStr, betAmount) {
|
|
|
|
|
|
|
|
|
async function tryReLogin() {
|
|
|
- let recognizeRet = await tryGenerateCaptchaAndRecognize(3);
|
|
|
- if (!recognizeRet) {
|
|
|
- return;
|
|
|
- }
|
|
|
- let validateRet = await doValidateCaptcha(recognizeRet.uuid, recognizeRet.positionX, recognizeRet.positionY);
|
|
|
- if (!validateRet || validateRet.statusCode != 200) {
|
|
|
- return;
|
|
|
- }
|
|
|
- let vFinalResult = validateRet.result;
|
|
|
- if (vFinalResult.status != 'OK') {
|
|
|
- return;
|
|
|
- }
|
|
|
- let username = 'aiyo21';
|
|
|
- let password = 'aiyo510520';
|
|
|
- let loginRet = await doLogin(username, password, vFinalResult.code, vFinalResult.cryptograph);
|
|
|
- if (!loginRet || loginRet.statusCode != 0) {
|
|
|
- return;
|
|
|
- }
|
|
|
- let newToken = loginRet.token;
|
|
|
- gCaiLeToken = newToken;
|
|
|
- gCaiLeHeaders['token'] = gCaiLeToken;
|
|
|
- magicJS.data.write('DIII_CaiLeYuan_Token', newToken);
|
|
|
- magicJS.notification.appendNotifyInfo(`🎉重登成功,最新token已刷新`);
|
|
|
- return true;
|
|
|
+ let recognizeRet = await tryGenerateCaptchaAndRecognize(3);
|
|
|
+ if (!recognizeRet) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let validateRet = await doValidateCaptcha(recognizeRet.uuid, recognizeRet.positionX, recognizeRet.positionY);
|
|
|
+ if (!validateRet || validateRet.statusCode != 200) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let vFinalResult = validateRet.result;
|
|
|
+ if (vFinalResult.status != 'OK') {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let username = 'aiyo21';
|
|
|
+ let password = 'aiyo510520';
|
|
|
+ let loginRet = await doLogin(username, password, vFinalResult.code, vFinalResult.cryptograph);
|
|
|
+ if (!loginRet || loginRet.statusCode != 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let newToken = loginRet.token;
|
|
|
+ gCaiLeToken = newToken;
|
|
|
+ gCaiLeHeaders['token'] = gCaiLeToken;
|
|
|
+ magicJS.data.write('DIII_CaiLeYuan_Token', newToken);
|
|
|
+ magicJS.notification.appendNotifyInfo(`🎉重登成功,最新token已刷新`);
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
async function tryGenerateCaptchaAndRecognize(tryCount = 1) {
|
|
|
- let captchaRet = null;
|
|
|
- let recognizeRet = null;
|
|
|
- for(let i = 0; i < tryCount; i++) {
|
|
|
- captchaRet = await doGenerateCaptcha();
|
|
|
- if (!captchaRet || captchaRet.statusCode != 200) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- recognizeRet = await tryAutoRecognizeCaptcha('ddddocr', captchaRet.result);
|
|
|
- if (!recognizeRet) {
|
|
|
- continue;
|
|
|
- } else {
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- return recognizeRet;
|
|
|
+ let captchaRet = null;
|
|
|
+ let recognizeRet = null;
|
|
|
+ for (let i = 0; i < tryCount; i++) {
|
|
|
+ captchaRet = await doGenerateCaptcha();
|
|
|
+ if (!captchaRet || captchaRet.statusCode != 200) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ recognizeRet = await tryAutoRecognizeCaptcha('ddddocr', captchaRet.result);
|
|
|
+ if (!recognizeRet) {
|
|
|
+ continue;
|
|
|
+ } else {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return recognizeRet;
|
|
|
}
|
|
|
|
|
|
async function doLogin(username, password, code, cryptograph) {
|
|
|
- const url = `https://${gCaiLeHost}/rest/login`;
|
|
|
- let reqData = {
|
|
|
- username: username,
|
|
|
- password: password,
|
|
|
- code: code,
|
|
|
- cryptograph: cryptograph,
|
|
|
- platform: "ios",
|
|
|
- version: "3.0.48",
|
|
|
- };
|
|
|
- let result = await clyRequest('post', url, reqData);
|
|
|
- return result;
|
|
|
+ const url = `https://${gCaiLeHost}/rest/login`;
|
|
|
+ let reqData = {
|
|
|
+ username: username,
|
|
|
+ password: password,
|
|
|
+ code: code,
|
|
|
+ cryptograph: cryptograph,
|
|
|
+ platform: "ios",
|
|
|
+ version: "3.0.48",
|
|
|
+ };
|
|
|
+ let result = await clyRequest('post', url, reqData);
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
async function doValidateCaptcha(uuid, positionX, positionY) {
|
|
|
- const url = `https://${gCaiLeHost}/rest/captcha/validate`;
|
|
|
- let reqData = {
|
|
|
- uuid: uuid,
|
|
|
- positionX: positionX,
|
|
|
- positionY: positionY,
|
|
|
- };
|
|
|
- let result = await clyRequest('post', url, reqData);
|
|
|
- return result;
|
|
|
+ const url = `https://${gCaiLeHost}/rest/captcha/validate`;
|
|
|
+ let reqData = {
|
|
|
+ uuid: uuid,
|
|
|
+ positionX: positionX,
|
|
|
+ positionY: positionY,
|
|
|
+ };
|
|
|
+ let result = await clyRequest('post', url, reqData);
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
async function doGenerateCaptcha() {
|
|
|
- const url = `https://${gCaiLeHost}/rest/captcha/generate`;
|
|
|
- let result = await clyRequest('get', url);
|
|
|
- return result;
|
|
|
+ const url = `https://${gCaiLeHost}/rest/captcha/generate`;
|
|
|
+ let result = await clyRequest('get', url);
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
async function tryAutoRecognizeCaptcha(typeStr, captchaInfo) {
|
|
|
- switch (typeStr) {
|
|
|
- case 'ddddocr':
|
|
|
- return recognizeCaptchaByDdddocr(captchaInfo);
|
|
|
- }
|
|
|
+ switch (typeStr) {
|
|
|
+ case 'ddddocr':
|
|
|
+ return recognizeCaptchaByDdddocr(captchaInfo);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
async function recognizeCaptchaByDdddocr(captchaInfo) {
|
|
|
- let puzzleImage = captchaInfo.puzzleImage;
|
|
|
- let backgroundImage = captchaInfo.backgroundImage;
|
|
|
- let positionY = captchaInfo.positionY;
|
|
|
- let uuid = captchaInfo.uuid;
|
|
|
- let reqData = {
|
|
|
- recognize_type: 'slide',
|
|
|
- puzzle_image: encodeURIComponent(puzzleImage),
|
|
|
- background_image: encodeURIComponent(backgroundImage),
|
|
|
- position_y: positionY,
|
|
|
- uuid: uuid,
|
|
|
- }
|
|
|
- let form = magicJS.objToQueryStr(reqData);
|
|
|
- let headers = {
|
|
|
- 'Accept': `application/json`,
|
|
|
- 'Origin': `https://api.jojo21.com`,
|
|
|
- 'Connection': `keep-alive`,
|
|
|
- 'Host': `api.jojo21.com`,
|
|
|
- 'User-Agent': gCaiLeUserAgent,
|
|
|
- 'Content-Type': 'application/x-www-form-urlencoded',
|
|
|
- };
|
|
|
- let options = {
|
|
|
- url: 'http://api.jojo21.com/captcha/ddddocr',
|
|
|
- headers: headers,
|
|
|
- body: form,
|
|
|
- };
|
|
|
-
|
|
|
- let result = await magicJS.http.post(options).then(response => {
|
|
|
- try {
|
|
|
- const body = response.body;
|
|
|
- let rspData = null;
|
|
|
- if (typeof body === "string") {
|
|
|
- return {
|
|
|
- code: -1,
|
|
|
- message: "Response Exception"
|
|
|
- };
|
|
|
- } else if (typeof body === "object") {
|
|
|
- rspData = body;
|
|
|
- }
|
|
|
- magicJS.logger.info(`rspData=${JSON.stringify(rspData)}`);
|
|
|
- return rspData;
|
|
|
- } catch (e) {
|
|
|
- magicJS.logger.error(e);
|
|
|
- }
|
|
|
- }).catch(err => {
|
|
|
- const msg = `请求滑块验证异常\n${JSON.stringify(err)}`;
|
|
|
- magicJS.logger.error(msg);
|
|
|
- });
|
|
|
- if (result && result.code == 1) {
|
|
|
- let targetInfo = result.result.target;
|
|
|
- if (Math.abs(targetInfo[1] - positionY) > 4){
|
|
|
- return null;
|
|
|
- }
|
|
|
- result.positionX = targetInfo[0] + randomFloat(0, 0.5);
|
|
|
- result.positionY = positionY;
|
|
|
- result.uuid = uuid;
|
|
|
- return result;
|
|
|
- }
|
|
|
- return null;
|
|
|
+ let puzzleImage = captchaInfo.puzzleImage;
|
|
|
+ let backgroundImage = captchaInfo.backgroundImage;
|
|
|
+ let positionY = captchaInfo.positionY;
|
|
|
+ let uuid = captchaInfo.uuid;
|
|
|
+ let reqData = {
|
|
|
+ recognize_type: 'slide',
|
|
|
+ puzzle_image: encodeURIComponent(puzzleImage),
|
|
|
+ background_image: encodeURIComponent(backgroundImage),
|
|
|
+ position_y: positionY,
|
|
|
+ uuid: uuid,
|
|
|
+ }
|
|
|
+ let form = magicJS.objToQueryStr(reqData);
|
|
|
+ let headers = {
|
|
|
+ 'Accept': `application/json`,
|
|
|
+ 'Origin': `https://api.jojo21.com`,
|
|
|
+ 'Connection': `keep-alive`,
|
|
|
+ 'Host': `api.jojo21.com`,
|
|
|
+ 'User-Agent': gCaiLeUserAgent,
|
|
|
+ 'Content-Type': 'application/x-www-form-urlencoded',
|
|
|
+ };
|
|
|
+ let options = {
|
|
|
+ url: 'http://api.jojo21.com/captcha/ddddocr',
|
|
|
+ headers: headers,
|
|
|
+ body: form,
|
|
|
+ };
|
|
|
+
|
|
|
+ let result = await magicJS.http.post(options).then(response => {
|
|
|
+ try {
|
|
|
+ const body = response.body;
|
|
|
+ let rspData = null;
|
|
|
+ if (typeof body === "string") {
|
|
|
+ return {
|
|
|
+ code: -1,
|
|
|
+ message: "Response Exception"
|
|
|
+ };
|
|
|
+ } else if (typeof body === "object") {
|
|
|
+ rspData = body;
|
|
|
+ }
|
|
|
+ magicJS.logger.info(`rspData=${JSON.stringify(rspData)}`);
|
|
|
+ return rspData;
|
|
|
+ } catch (e) {
|
|
|
+ magicJS.logger.error(e);
|
|
|
+ }
|
|
|
+ }).catch(err => {
|
|
|
+ const msg = `请求滑块验证异常\n${JSON.stringify(err)}`;
|
|
|
+ magicJS.logger.error(msg);
|
|
|
+ });
|
|
|
+ if (result && result.code == 1) {
|
|
|
+ let targetInfo = result.result.target;
|
|
|
+ if (Math.abs(targetInfo[1] - positionY) > 4) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ result.positionX = targetInfo[0] + randomFloat(0, 0.5);
|
|
|
+ result.positionY = positionY;
|
|
|
+ result.uuid = uuid;
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function randomFloat(min, max) {
|
|
|
- return Math.random() * (max - min) + min;
|
|
|
+ return Math.random() * (max - min) + min;
|
|
|
}
|
|
|
|
|
|
function generateRandString(length) {
|
|
|
@@ -1216,7 +1364,7 @@ function generateRandString(length) {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
-async function clyRequest(method, url, reqData, printRspData=true) {
|
|
|
+async function clyRequest(method, url, reqData, printRspData = true) {
|
|
|
if (!gCaiLeHeaders['token'] || gCaiLeHeaders['token'].length == 0) {
|
|
|
magicJS.logger.info(`❌token已失效请重新登陆获取!`);
|
|
|
return;
|
|
|
@@ -1274,9 +1422,9 @@ async function clyRequest(method, url, reqData, printRspData=true) {
|
|
|
} else if (typeof body === "object") {
|
|
|
rspData = body;
|
|
|
}
|
|
|
- if (printRspData) {
|
|
|
- magicJS.logger.info(`rspData=${JSON.stringify(rspData)}`);
|
|
|
- }
|
|
|
+ if (printRspData) {
|
|
|
+ magicJS.logger.info(`rspData=${JSON.stringify(rspData)}`);
|
|
|
+ }
|
|
|
if (rspData) {
|
|
|
return rspData;
|
|
|
} else {
|