shawenguan 1 rok temu
rodzic
commit
6969cfd9a7
2 zmienionych plików z 291 dodań i 165 usunięć
  1. 3 3
      Scripts/168/diiiHelper.js
  2. 288 162
      Scripts/168/pksPlanHelper.js

Plik diff jest za duży
+ 3 - 3
Scripts/168/diiiHelper.js


+ 288 - 162
Scripts/168/pksPlanHelper.js

@@ -239,7 +239,7 @@ function getPlanLotteryDrongonMaxTurn() {
 	return Number(amount);
 }
 
-function getPlanLotteryCostrReduceA(){
+function getPlanLotteryCostrReduceA() {
 	let multiple = magicJS.data.read('168_PksPlanLotteryCostrReduceA', null);
 	if (multiple == null) {
 		return 16;
@@ -247,7 +247,7 @@ function getPlanLotteryCostrReduceA(){
 	return Number(multiple);
 }
 
-function getPlanLotteryCostrReduceB(){
+function getPlanLotteryCostrReduceB() {
 	let multiple = magicJS.data.read('168_PksPlanLotteryCostrReduceB', null);
 	if (multiple == null) {
 		return 8;
@@ -255,7 +255,7 @@ function getPlanLotteryCostrReduceB(){
 	return Number(multiple);
 }
 
-function getPlanLotteryCostrReduceC(){
+function getPlanLotteryCostrReduceC() {
 	let multiple = magicJS.data.read('168_PksPlanLotteryCostrReduceC', null);
 	if (multiple == null) {
 		return 4;
@@ -263,6 +263,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}`,
@@ -477,17 +485,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;
@@ -497,33 +505,62 @@ 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;
+	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;
+	} 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;
+	} else {
 		maxMateCount = Math.min(planCArr.length, planAArr.length) + Math.min(planCArr.length, planBArr.length);
 		curMateCount = calcPlanMatchCount(planCArr, planA) + calcPlanMatchCount(planCArr, planB);
+		maxTurnCount = turnNumC * 3;
 	}
-	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));
-
-	let maxTurnCount = turnNumA*3;
-	let factor2 = 25*(turnNumC+turnNumB+turnNumA)/maxTurnCount;
+	let factor1 = 25 * (curMateCount / maxMateCount);
+	let factor2 = 25 * (turnNumC + turnNumB + turnNumA) / maxTurnCount;
 
 	probability = probability - factor1 - factor2;
 
+	let factor3 = 0;
+	let nowDate = formatNow();
+	let killData = await getPksKillNumListFirst(gLotteryCode, nowDate, 30);
+	if (killData) {
+		let killNumDict = killData.firstNumDict;
+		if (planType == 'A') {
+			factor3 = calcPlanKillFactor(killNumDict, planAArr);
+		} else if (planType == 'B') {
+			factor3 = calcPlanKillFactor(killNumDict, planBArr);
+		} else {
+			factor3 = calcPlanKillFactor(killNumDict, planCArr);
+		}
+	}
+	probability = probability - factor3;
+
 	return probability;
 }
 
+function calcPlanKillFactor(killNumDict, planArr, baseValue = 5) {
+	let retValue = 0;
+	for (let i = 0; i < planArr.length; i++) {
+		let n = parseInt(planArr[i]);
+		if (killNumDict[n]) {
+			retValue += killNumDict[n] * baseValue;
+		}
+	}
+	return retValue;
+}
+
 async function checkPlanCBuyNotify(pksPlanItemData, pksPlanListData) {
 	let initCost = 1;
 	let turnCount = magicJS.data.read('168_PksPlanDrawTurnCountC', 0);
@@ -565,10 +602,14 @@ async function checkPlanCBuyNotify(pksPlanItemData, pksPlanListData) {
 	}
 
 	if (isPlanLotteryAutoBet()) {
-		let probability = analyseBetProbability('C', pksPlanItemData, pksPlanListData);
-		if(probability >= 70){
+		let probability = await analyseBetProbability('C', pksPlanItemData, pksPlanListData);
+		let proAllowValue = getAllowBetProbability('C');
+		if (probability >= proAllowValue) {
 			let maxBetAmount = getPlanLotteryMaxBetAmount();
 			let betRet = await tryDragonBet(preDrawIssue, planC, turnOneCost, maxBetAmount);
+		} else {
+			tipsMsg = '⚠️' + tipsMsg;
+			tipsMsg += `\n胜率:${probability},不大于预设值${proAllowValue},请自主下单`;
 		}
 	}
 
@@ -618,10 +659,14 @@ async function checkPlanBBuyNotify(pksPlanItemData, pksPlanListData) {
 	}
 
 	if (isPlanLotteryAutoBet()) {
-		let probability = analyseBetProbability('B', pksPlanItemData, pksPlanListData);
-		if(probability >= 70){
+		let probability = await analyseBetProbability('B', pksPlanItemData, pksPlanListData);
+		let proAllowValue = getAllowBetProbability('B');
+		if (probability >= proAllowValue) {
 			let maxBetAmount = getPlanLotteryMaxBetAmount();
 			let betRet = await tryDragonBet(preDrawIssue, planB, turnOneCost, maxBetAmount);
+		} else {
+			tipsMsg = '⚠️' + tipsMsg;
+			tipsMsg += `\n胜率:${probability},不大于预设值${proAllowValue},请自主下单`;
 		}
 	}
 
@@ -671,10 +716,14 @@ async function checkPlanABuyNotify(pksPlanItemData, pksPlanListData) {
 	}
 
 	if (isPlanLotteryAutoBet()) {
-		let probability = analyseBetProbability('A', pksPlanItemData, pksPlanListData);
-		if(probability >= 70){
+		let probability = await analyseBetProbability('A', pksPlanItemData, pksPlanListData);
+		let proAllowValue = getAllowBetProbability('A');
+		if (probability >= proAllowValue) {
 			let maxBetAmount = getPlanLotteryMaxBetAmount();
 			let betRet = await tryDragonBet(preDrawIssue, planA, turnOneCost, maxBetAmount);
+		} else {
+			tipsMsg = '⚠️' + tipsMsg;
+			tipsMsg += `\n胜率:${probability},不大于预设值${proAllowValue},请自主下单`;
 		}
 	}
 
@@ -690,7 +739,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;
@@ -800,6 +849,83 @@ async function getPksPlanItem(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;
@@ -826,11 +952,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)) {
@@ -889,151 +1015,151 @@ 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) {
@@ -1046,7 +1172,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;
@@ -1104,9 +1230,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 {

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików