Просмотр исходного кода

Merge branch 'master' of http://git.jojo21.top/shawenguan/Quantumult-X

shawenguan 1 год назад
Родитель
Сommit
2b88c339f0
3 измененных файлов с 321 добавлено и 167 удалено
  1. 8 2
      BoxJsSub/168.json
  2. 3 3
      Scripts/168/diiiHelper.js
  3. 310 162
      Scripts/168/pksPlanHelper.js

+ 8 - 2
BoxJsSub/168.json

@@ -16,8 +16,7 @@
                 "https://git.jojo21.top/shawenguan/Quantumult-X/raw/master/Icons/168.png",
                 "https://git.jojo21.top/shawenguan/Quantumult-X/raw/master/Icons/168.png"
             ],
-            "scripts": [
-            ],
+            "scripts": [],
             "keys": [
                 "168_PksPlanAPIHost",
                 "168_PksPlanLotteryCode",
@@ -107,6 +106,13 @@
                     "desc": "自动下注最大限额"
                 },
                 {
+                    "id": "168_PksPlanAllowBetProbability",
+                    "name": "自动下注预估中奖率最低值(0~100)",
+                    "val": 70,
+                    "type": "number",
+                    "desc": "自动下注预估中奖率最低值"
+                },
+                {
                     "id": "168_PksPlanLotteryDrongonMaxTurn",
                     "name": "屠龙n期数(10期以上)",
                     "val": 11,

Разница между файлами не показана из-за своего большого размера
+ 3 - 3
Scripts/168/diiiHelper.js


+ 310 - 162
Scripts/168/pksPlanHelper.js

@@ -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 {

Некоторые файлы не были показаны из-за большого количества измененных файлов