diff --git a/repo/js/AutoCode/README.md b/repo/js/AutoCode/README.md new file mode 100644 index 00000000..97627796 --- /dev/null +++ b/repo/js/AutoCode/README.md @@ -0,0 +1,3 @@ +兑换码+截止时间存储地址codes.txt +格式 兑换码,xxxx.xx.xx xx:xx:xx +仅支持国服 \ No newline at end of file diff --git a/repo/js/AutoCode/assets/account.png b/repo/js/AutoCode/assets/account.png new file mode 100644 index 00000000..03feb8f0 Binary files /dev/null and b/repo/js/AutoCode/assets/account.png differ diff --git a/repo/js/AutoCode/assets/clear.png b/repo/js/AutoCode/assets/clear.png new file mode 100644 index 00000000..f5b20194 Binary files /dev/null and b/repo/js/AutoCode/assets/clear.png differ diff --git a/repo/js/AutoCode/assets/confirm.png b/repo/js/AutoCode/assets/confirm.png new file mode 100644 index 00000000..19a187e6 Binary files /dev/null and b/repo/js/AutoCode/assets/confirm.png differ diff --git a/repo/js/AutoCode/assets/expired.png b/repo/js/AutoCode/assets/expired.png new file mode 100644 index 00000000..0849cd74 Binary files /dev/null and b/repo/js/AutoCode/assets/expired.png differ diff --git a/repo/js/AutoCode/assets/go_to_redeem.png b/repo/js/AutoCode/assets/go_to_redeem.png new file mode 100644 index 00000000..cd7cd2e9 Binary files /dev/null and b/repo/js/AutoCode/assets/go_to_redeem.png differ diff --git a/repo/js/AutoCode/assets/input_code.png b/repo/js/AutoCode/assets/input_code.png new file mode 100644 index 00000000..c3a0c27f Binary files /dev/null and b/repo/js/AutoCode/assets/input_code.png differ diff --git a/repo/js/AutoCode/assets/invalid.png b/repo/js/AutoCode/assets/invalid.png new file mode 100644 index 00000000..1eb6ec18 Binary files /dev/null and b/repo/js/AutoCode/assets/invalid.png differ diff --git a/repo/js/AutoCode/assets/not_open.png b/repo/js/AutoCode/assets/not_open.png new file mode 100644 index 00000000..a93b01a2 Binary files /dev/null and b/repo/js/AutoCode/assets/not_open.png differ diff --git a/repo/js/AutoCode/assets/redeem.png b/repo/js/AutoCode/assets/redeem.png new file mode 100644 index 00000000..4bb5afa3 Binary files /dev/null and b/repo/js/AutoCode/assets/redeem.png differ diff --git a/repo/js/AutoCode/assets/settings.png b/repo/js/AutoCode/assets/settings.png new file mode 100644 index 00000000..9284a141 Binary files /dev/null and b/repo/js/AutoCode/assets/settings.png differ diff --git a/repo/js/AutoCode/assets/used.png b/repo/js/AutoCode/assets/used.png new file mode 100644 index 00000000..822c0315 Binary files /dev/null and b/repo/js/AutoCode/assets/used.png differ diff --git a/repo/js/AutoCode/codes.txt b/repo/js/AutoCode/codes.txt new file mode 100644 index 00000000..52028ed6 --- /dev/null +++ b/repo/js/AutoCode/codes.txt @@ -0,0 +1,3 @@ +SHEZHIQIBIAN,2025.6.7 12:00:00 +SHIKONG,2025.6.7 12:00:00 +SIKEKE0618,2025.6.7 12:00:00 \ No newline at end of file diff --git a/repo/js/AutoCode/main.js b/repo/js/AutoCode/main.js new file mode 100644 index 00000000..43a32dd9 --- /dev/null +++ b/repo/js/AutoCode/main.js @@ -0,0 +1,117 @@ +(async function () { + setGameMetrics(1920, 1080, 1); + // 1. 返回主界面,等待1秒 + await genshin.returnMainUi(); + await sleep(1000); + + // 2. 通过keyPress点按esc键(VK_ESCAPE),等待2秒。ocr识别设置图片并点击,等待2秒。识别账户图片并点击,等待0.5秒,识别前往兑换图片并点击,等待0.5秒 + keyPress("ESCAPE"); + await sleep(2000); + + const settingsRo = RecognitionObject.TemplateMatch(file.readImageMatSync("assets/settings.png")); + const settingsRes = captureGameRegion().find(settingsRo); + if (settingsRes.isExist()) { + settingsRes.click(); + } + await sleep(2000); + + const accountRo = RecognitionObject.TemplateMatch(file.readImageMatSync("assets/account.png")); + const accountRes = captureGameRegion().find(accountRo); + if (accountRes.isExist()) { + accountRes.click(); + } + await sleep(500); + + const goToRedeemRo = RecognitionObject.TemplateMatch(file.readImageMatSync("assets/go_to_redeem.png")); + const goToRedeemRes = captureGameRegion().find(goToRedeemRo); + if (goToRedeemRes.isExist()) { + goToRedeemRes.click(); + } + await sleep(500); + + // 3. 新建一个txt用于存储兑换码及截止时间,之间换行区分,格式为【兑换码,截止时间】 + try { + const content = file.readTextSync("codes.txt"); + const codes = content.split('\n'); + + for (let i = 0; i < codes.length; i++) { + const codeInfo = codes[i].split(','); + const code = codeInfo[0]; + const deadline = codeInfo[1]; + + // a. 获取当前时间【xxxx.xx.xx xx:xx:xx】(年月日时分秒),与截止时间进行对比 + const now = new Date(); + const currentTime = now.getFullYear() + '.' + String(now.getMonth() + 1).padStart(2, '0') + '.' + String(now.getDate()).padStart(2, '0') + ' ' + String(now.getHours()).padStart(2, '0') + ':' + String(now.getMinutes()).padStart(2, '0') + ':' + String(now.getSeconds()).padStart(2, '0'); + + if (currentTime > deadline) { + log.info(`兑换码【${code}】已超过截止时间,跳过`); + continue; + } + + // b. 识别输入兑换码图片并点击 + const inputCodeRo = RecognitionObject.TemplateMatch(file.readImageMatSync("assets/input_code.png")); + const inputCodeRes = captureGameRegion().find(inputCodeRo); + if (inputCodeRes.isExist()) { + inputCodeRes.click(); + } + await sleep(300); + + // c. 通过虚拟键代码依次keyPress键入兑换码的每一个字符 + await inputText(code); + await sleep(500); + + // d. 输入完毕后,识别兑换图片并点击,等待1.5秒 + const redeemRo = RecognitionObject.TemplateMatch(file.readImageMatSync("assets/redeem.png")); + const redeemRes = captureGameRegion().find(redeemRo); + if (redeemRes.isExist()) { + redeemRes.click(); + } + await sleep(1500); + + // e. 识别无效图片、已使用图片、过期图片、确认图片、未开启图片 + const invalidRo = RecognitionObject.TemplateMatch(file.readImageMatSync("assets/invalid.png")); + const invalidRes = captureGameRegion().find(invalidRo); + if (invalidRes.isExist()) { + log.info(`兑换码【${code}】无效`); + } + + const usedRo = RecognitionObject.TemplateMatch(file.readImageMatSync("assets/used.png")); + const usedRes = captureGameRegion().find(usedRo); + if (usedRes.isExist()) { + log.info(`兑换码【${code}】已使用`); + } + + const expiredRo = RecognitionObject.TemplateMatch(file.readImageMatSync("assets/expired.png")); + const expiredRes = captureGameRegion().find(expiredRo); + if (expiredRes.isExist()) { + log.info(`兑换码【${code}】已过期`); + } + + const notopenRo = RecognitionObject.TemplateMatch(file.readImageMatSync("assets/not_open.png")); + const notopenRes = captureGameRegion().find(notopenRo); + if (notopenRes.isExist()) { + log.info(`兑换码【${code}】未开启`); + } + + const confirmRo = RecognitionObject.TemplateMatch(file.readImageMatSync("assets/confirm.png")); + const confirmRes = captureGameRegion().find(confirmRo); + if (confirmRes.isExist()) { + log.info(`兑换码【${code}】成功兑换`); + confirmRes.click(); + } + + // f. 识别清除图片并点击,若未识别到则不做处理 + const clearRo = RecognitionObject.TemplateMatch(file.readImageMatSync("assets/clear.png")); + const clearRes = captureGameRegion().find(clearRo); + if (clearRes.isExist()) { + clearRes.click(); + } + await sleep(4000); + } + } catch (error) { + log.error(`读取兑换码文件失败: ${error}`); + } + + // 4. 所有兑换码兑换完成后返回主界面 + await genshin.returnMainUi(); +})(); \ No newline at end of file diff --git a/repo/js/AutoCode/manifest.json b/repo/js/AutoCode/manifest.json new file mode 100644 index 00000000..4d1a3423 --- /dev/null +++ b/repo/js/AutoCode/manifest.json @@ -0,0 +1,14 @@ +{ + "manifest_version": 1, + "name": "自动使用兑换码", + "version": "1.0", + "bgi_version": "0.45.0", + "description": "仅支持国服", + "authors": [ + { + "name": "Tool_tingsu", + "link": "" + } + ], + "main": "main.js" +} \ No newline at end of file