diff --git a/repo/js/AutoPickLitter/main copy.js b/repo/js/AutoPickLitter/main copy.js deleted file mode 100644 index 80c4cb735..000000000 --- a/repo/js/AutoPickLitter/main copy.js +++ /dev/null @@ -1,1123 +0,0 @@ -// 初始化相关变量 -let gameRegion; // 游戏截图区域 -const dialogZone = { x: { min: 900, max: 1700 }, y: { min: 420, max: 880 } }; // 对话识别区域 -let record = {}; // record 记录内容 -let recordsNum = 0; // 写入内容次数 -let sticksTime = false; // 判定是否可以上香 -//六龙蛋位置 -const coordinates = [ - [551, 153], - [881, 341], - [1087, 161], - [1342, 357], - [472, 572], - [572, 721] -]; - -// 通用方法区域 -//切换队伍 -async function switchPartyIfNeeded() { - if (!settings.partyName) { - await genshin.returnMainUi(); - return; - }; - try { - log.info("正在尝试切换至" + settings.partyName); - if (!await genshin.switchParty(settings.partyName)) { - log.info("切换队伍失败,前往七天神像重试"); - await genshin.tpToStatueOfTheSeven(); - await genshin.switchParty(settings.partyName); - } - } catch { - log.error("队伍切换失败,可能处于联机模式或其他不可切换状态"); - notification.error(`队伍切换失败,可能处于联机模式或其他不可切换状态`); - await genshin.returnMainUi(); - }; -}; - -// 文字识别/点击,并返回结果 -async function performOcr(keyWords, xRange, yRange, judge, timeout = 500) { - let startTime = new Date(); - let retryCount = 0; - while (Date.now() - startTime < timeout) { - gameRegion = captureGameRegion(); - try { - if (judge) { - // 识别相关区域内容,返回结果 - let ocrResult = gameRegion.find(RecognitionObject.ocr( - xRange.min, yRange.min, - xRange.max - xRange.min, yRange.max - yRange.min - )); - gameRegion.dispose(); - if (ocrResult) { - return { success: true, text: ocrResult.text}; - }; - } else { - // 比对相关内容并点击 - let resList = gameRegion.findMulti(RecognitionObject.ocr( - xRange.min, yRange.min, - xRange.max - xRange.min, yRange.max - yRange.min - )); - gameRegion.dispose(); - for (let res of resList) { - let correctedText = res.text; - if (correctedText.includes(keyWords)) { - let centerX = Math.round(res.x + res.width / 2); - let centerY = Math.round(res.y + res.height / 2); - keyDown("VK_MENU"); - await sleep(700); - moveMouseTo(centerX, centerY); - leftButtonClick(); - await sleep(800); - keyUp("VK_MENU"); - await sleep(1000); - leftButtonClick(); - return { success: true, text: correctedText}; - }; - }; - }; - } catch (error) { - retryCount++; // 增加重试计数 - log.warn(`OCR 识别失败,正在进行第 ${retryCount} 次重试...`); - } - await sleep(50); - }; - // log.warn(`经过多次尝试,仍然无法识别`); - return { success: false}; -}; - -// 图像识别/点击,并返回结果 -async function findImgIcon(imagePath, xRange, yRange, judge, threshold = 0.8, timeout = 500) { - let startTime = new Date(); - let retryCount = 0; - let template = file.ReadImageMatSync(imagePath); - let recognitionObject = RecognitionObject.TemplateMatch(template, xRange.min, yRange.min, - xRange.max - xRange.min, yRange.max - yRange.min); - recognitionObject.Threshold = threshold; - // recognitionObject.Use3Channels = true; - recognitionObject.InitTemplate(); - while (Date.now() - startTime < timeout) { - gameRegion = captureGameRegion(); - let result = gameRegion.find(recognitionObject); - gameRegion.dispose(); - try { - if (judge) { - if (result.isExist()) { - let centerX = Math.round(result.x + result.width / 2); - let centerY = Math.round(result.y + result.height / 2); - keyDown("VK_MENU"); - await sleep(500); - moveMouseTo(centerX, centerY); - leftButtonClick(); - await sleep(800); - keyUp("VK_MENU"); - await sleep(1000); - leftButtonClick(); - return { success: true, coordinates:[centerX, centerY]}; - }; - } else { - if (result.isExist()) { - return { success: true, coordinates:[0, 0]}; - }; - }; - } catch (error) { - retryCount++; // 增加重试计数 - log.warn(`模板匹配失败,正在进行第 ${retryCount} 次重试...`); - }; - await sleep(50); - }; - // log.warn(`经过多次尝试,仍然无法识别`); - return { success: false}; -}; - -// 滚动页面 -// totalDistance: 需要滚动的总距离 -// stepDistance: 每次滚动的距离 -// delayMs: 两次滚动之间的延迟 -async function scrollPage(totalDistance, stepDistance = 10, delayMs = 5) { - // 移动鼠标到(999, 750)并按下左键 - moveMouseTo(999, 750); - await sleep(50); - leftButtonDown(); - - // 估算需要滚动的步数 - const steps = Math.ceil(totalDistance / stepDistance); - // 依次滚动 - for (let j = 0; j < steps; j++) { - // 计算本次滚动剩余的距离 - const remainingDistance = totalDistance - j * stepDistance; - // 如果剩余距离小于 stepDistance,则滚动剩余的距离 - // 否则滚动 stepDistance - const moveDistance = remainingDistance < stepDistance ? remainingDistance : stepDistance; - // 滚动 - moveMouseBy(0, -moveDistance); - // 等待 delayMs ms - await sleep(delayMs); - } - // 等待700ms - await sleep(700); - // 释放左键 - leftButtonUp(); - // 等待100ms - await sleep(100); -} - -//fakeLog 函数,使用方法:将本函数放在主函数前,调用时请务必使用await,否则可能出现v8白框报错 -//在js开头处伪造该js结束运行的日志信息,如 await fakeLog("js脚本", true, true, 0); -//在js结尾处伪造该js开始运行的日志信息,如 await fakeLog("js脚本", true, false, 2333); -//duration项目仅在伪造结束信息时有效,且无实际作用,可以任意填写,当你需要在日志中输出特定值时才需要,单位为毫秒 -//在调用地图追踪前伪造该地图追踪开始运行的日志信息,如 await fakeLog(`地图追踪.json`, false, true, 0); -//在调用地图追踪后伪造该地图追踪结束运行的日志信息,如 await fakeLog(`地图追踪.json`, false, false, 0); -//如此便可以在js运行过程中伪造地图追踪的日志信息,可以在日志分析等中查看 -async function fakeLog(name, isJs, isStart, duration) { - await sleep(10); - const currentTime = Date.now(); - // 参数检查 - if (typeof name !== 'string') { - log.error("参数 'name' 必须是字符串类型!"); - return; - }; - if (typeof isJs !== 'boolean') { - log.error("参数 'isJs' 必须是布尔型!"); - return; - }; - if (typeof isStart !== 'boolean') { - log.error("参数 'isStart' 必须是布尔型!"); - return; - }; - if (typeof currentTime !== 'number' || !Number.isInteger(currentTime)) { - log.error("参数 'currentTime' 必须是整数!"); - return; - }; - if (typeof duration !== 'number' || !Number.isInteger(duration)) { - log.error("参数 'duration' 必须是整数!"); - return; - }; - - // 将 currentTime 转换为 Date 对象并格式化为 HH:mm:ss.sss - const date = new Date(currentTime); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - const seconds = String(date.getSeconds()).padStart(2, '0'); - const milliseconds = String(date.getMilliseconds()).padStart(3, '0'); - const formattedTime = `${hours}:${minutes}:${seconds}.${milliseconds}`; - - // 将 duration 转换为分钟和秒,并保留三位小数 - const durationInSeconds = duration / 1000; // 转换为秒 - const durationMinutes = Math.floor(durationInSeconds / 60); - const durationSeconds = (durationInSeconds % 60).toFixed(3); // 保留三位小数 - - // 使用四个独立的 if 语句处理四种情况 - if (isJs && isStart) { - // 处理 isJs = true 且 isStart = true 的情况 - const logMessage = `正在伪造js开始的日志记录\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `------------------------------\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `→ 开始执行JS脚本: "${name}"`; - log.debug(logMessage); - }; - if (isJs && !isStart) { - // 处理 isJs = true 且 isStart = false 的情况 - const logMessage = `正在伪造js结束的日志记录\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `→ 脚本执行结束: "${name}", 耗时: ${durationMinutes}分${durationSeconds}秒\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `------------------------------`; - log.debug(logMessage); - }; - if (!isJs && isStart) { - // 处理 isJs = false 且 isStart = true 的情况 - const logMessage = `正在伪造地图追踪开始的日志记录\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `------------------------------\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `→ 开始执行地图追踪任务: "${name}"`; - log.debug(logMessage); - }; - if (!isJs && !isStart) { - // 处理 isJs = false 且 isStart = false 的情况 - const logMessage = `正在伪造地图追踪结束的日志记录\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `→ 脚本执行结束: "${name}", 耗时: ${durationMinutes}分${durationSeconds}秒\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `------------------------------`; - log.debug(logMessage); - }; -}; - -// 读写信息 -async function recordForFile(judge) { - /* ---------- 文件名合法性校验 ---------- */ - const illegalCharacters = /[\\/:*?"<>|]/; - const reservedNames = [ - "CON", "PRN", "AUX", "NUL", - "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", - "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9" - ]; - - let accountName = settings.accountName || "默认账户"; - - if (accountName === "" || - accountName.startsWith(" ") || - accountName.endsWith(" ") || - illegalCharacters.test(accountName) || - reservedNames.includes(accountName.toUpperCase()) || - accountName.length > 255 - ) { - log.error(`账户名 "${accountName}" 不合法,将使用默认值`); - accountName = "默认账户"; - await sleep(5000); - } else { - log.info(`账户名 "${accountName}" 合法`); - }; - - if (judge) { - /* ---------- 读取记录文件 ---------- */ - const recordFolderPath = "records/"; - let recordFilePath = `records/${accountName}.txt`; - - const filesInSubFolder = file.ReadPathSync(recordFolderPath); - let fileExists = false; - for (const filePath of filesInSubFolder) { - if (filePath === `records\\${accountName}.txt`) { - fileExists = true; - break; - }; - }; - - /* ---------- 初始化记录对象 ---------- */ - record = { - lastRunDate: "1970/01/01", - lastActivateTime: new Date("1970-01-01T20:00:00.000Z"), - lastDragonEggsNum: "【山之血:0,太阳的轰鸣:0圣龙君临:0,菲耶蒂娜:0,献给小酒杯:0,飞澜鲨鲨:0】", - records: new Array(51).fill(""), - version: "" - }; - - let recordIndex = 0; - - if (fileExists) { - log.info(`记录文件 ${recordFilePath} 存在`); - } else { - log.warn(`无记录文件,将使用默认数据`); - return; - }; - - let content = await file.readText(recordFilePath); - let lines = content.split("\n"); - - /* ---------- 逐行解析 ---------- */ - for (const rawLine of lines) { - const line = rawLine.trim(); - if (!line) continue; - - /* 运行完成日期 */ - if (line.startsWith("上次运行日期:")) { - record.lastRunDate = line.slice("上次运行日期:".length).trim(); - }; - - /* 上次上香时间 */ - let timeStr = null; - if (line.startsWith("上次上香时间:")) { - timeStr = line.slice("上次上香时间:".length).trim(); - }; - if (timeStr) { - const d = new Date(timeStr); - if (!isNaN(d.getTime())) { - record.lastActivateTime = d; // 保持 Date 对象 - }; - }; - - /* 背包龙蛋数目 */ - if (line.startsWith("背包龙蛋数目:")) { - record.lastDragonEggsNum = line.slice("背包龙蛋数目:".length).trim(); - }; - - /* 相关信息保存 */ - if (line.startsWith(">>>>>>>>>> ") && recordIndex < record.records.length) { - record.records[recordIndex++] = line; - } else if (line.startsWith("抽签的结果: ") && recordIndex < record.records.length) { - record.records[recordIndex++] = line; - } else if (line.startsWith("获得的食物: ") && recordIndex < record.records.length) { - record.records[recordIndex++] = line; - } else if (line.startsWith("幸运签内容: ") && recordIndex < record.records.length) { - record.records[recordIndex++] = line; - } else if (line.startsWith("获得的龙蛋: ") && recordIndex < record.records.length) { - record.records[recordIndex++] = line; - } else if (line.startsWith("转盘的运势: ") && recordIndex < record.records.length) { - record.records[recordIndex++] = line; - }; - - }; - - log.info(`上次运行日期: ${record.lastRunDate}`); - log.info(`上次上香开始时间: ${record.lastActivateTime.toLocaleString()}`); - - /* ---------- 读取 manifest 版本 ---------- */ - try { - const manifest = JSON.parse(await file.readText("manifest.json")); - record.version = manifest.version; - log.info(`当前版本为${record.version}`); - } catch (err) { - log.error("读取或解析 manifest.json 失败:", err); - }; - - /* ---------- 判断上香时间 ---------- */ - if (settings.sticks) { - const now = Date.now(); // 当前毫秒时间戳 - const aimActivateTime = new Date(record.lastActivateTime.getTime() + 24 * 60 * 60 * 1000).getTime(); - /* ---------- 计算下次可上香时间 ---------- */ - if (aimActivateTime - now > 0) { - log.info(`上香时间还未到!!!`); - sticksTime = false; - } else { - log.info(`上香时间已到,请准备上香!`); - sticksTime = true; - }; - }; - } else { - let recordFilePath = `records/${accountName}.txt`; - let lines = [ - `上次运行日期: ${record.lastRunDate}`, - `上次上香时间: ${record.lastActivateTime.toISOString()}`, - `背包龙蛋数目: ${record.lastDragonEggsNum}`, - ...record.records.filter(Boolean) - ]; - - let content = lines.join('\n'); - - try { - await file.writeText(recordFilePath, content, false); - log.info(`记录已写入 ${recordFilePath}`); - } catch (e) { - log.error(`写入 ${recordFilePath} 失败:`, e); - }; - }; -}; - -// 检查背包龙蛋数目 -async function chcekDragonEggs() { - await genshin.returnMainUi(); - //打开背包 - await keyPress("B"); - await sleep(1500); - await click(1250,50); - let DragonEggs = [0, 0, 0, 0, 0, 0]; - let judgeEgg = 0; - // 判定是不是只有一页 - let sliderTop = await findImgIcon("assets/RecognitionObject/SliderTop.png", { min: 1277, max: 1300 }, { min: 120, max: 160 }, false); - if (!sliderTop.success) { - for (let index = 0; index < 6; index++) { - let DragonEgg = await findImgIcon(`assets/RecognitionObject/DragonEgg${index}.png`, { min: 99, max: 1295 }, { min: 104, max: 967 }, true, 0.95); - if (DragonEgg.success) { - let ocrEggNum = await performOcr("", - { min: DragonEgg.coordinates[0]-46, max: DragonEgg.coordinates[0]+34 }, { min: DragonEgg.coordinates[1]+56, max: DragonEgg.coordinates[1]+83 }, true); - log.info(`第一次识别到的数字:${ocrEggNum.text}`); - if (ocrEggNum.text == "") { - await sleep(500); - ocrEggNum = await performOcr("", - { min: DragonEgg.coordinates[0]-46, max: DragonEgg.coordinates[0]+34 }, { min: DragonEgg.coordinates[1]+56, max: DragonEgg.coordinates[1]+83 }, true); - log.info(`第二次识别到的数字:${ocrEggNum.text}`); - }; - DragonEggs[index] = Number(ocrEggNum.text); - }else{ - DragonEggs[index] = 0; - }; - - }; - }else{ - for (let scroll = 0; scroll <= 10; scroll++) { - for (let index = 0; index < 6; index++) { - let DragonEgg = await findImgIcon(`assets/RecognitionObject/DragonEgg${index}.png`, { min: 99, max: 1295 }, { min: 104, max: 967 }, true, 0.95); - if (DragonEgg.success) { - let ocrEggNum = await performOcr("", - { min: DragonEgg.coordinates[0]-46, max: DragonEgg.coordinates[0]+34 }, { min: DragonEgg.coordinates[1]+56, max: DragonEgg.coordinates[1]+83 }, true); - log.info(`第一次识别到的数字:${ocrEggNum.text}`); - if (ocrEggNum.text == "") { - await sleep(500); - ocrEggNum = await performOcr("", - { min: DragonEgg.coordinates[0]-46, max: DragonEgg.coordinates[0]+34 }, { min: DragonEgg.coordinates[1]+56, max: DragonEgg.coordinates[1]+83 }, true); - log.info(`第二次识别到的数字:${ocrEggNum.text}`); - }; - if (ocrEggNum.text == "") { - ocrEggNum.text = 1; - }; - DragonEggs[index] = ocrEggNum.text; - }else{ - DragonEggs[index] = 0; - }; - }; - if (judgeEgg == 1) { - break; - }; - if (DragonEggs.every(item => item == 0)) { - // 都为空就滑动背包 滑动大点 - await sleep(1000); - await scrollPage(680, 10, 5); - await sleep(1000); - continue; - } else if (DragonEggs.some(item => item != 0) && judgeEgg == 0) { - // 露出最后一排数字 - // await scrollPage(50, 5, 5); - // 不为空就滑动背包 滑动小点 - await sleep(1000); - await scrollPage(200, 10, 5); - await sleep(1000); - judgeEgg = 1; - }; - - // 判断是否到底 - let sliderBottom = await findImgIcon("assets/RecognitionObject/SliderBottom.png", { min: 1284, max: 1293 }, { min: 916, max: 942 }, false); - if (sliderBottom.success) { - log.info("已到达最后一页!"); - break; - }; - }; - }; - - log.info(`背包龙蛋数目: 【山之血:${DragonEggs[0]},太阳的轰鸣:${DragonEggs[1]},圣龙君临:${DragonEggs[2]},菲耶蒂娜:${DragonEggs[3]},献给小酒杯:${DragonEggs[4]},飞澜鲨鲨:${DragonEggs[5]}】`); - if (settings.notify) { - notification.Send(`背包龙蛋数目: 【山之血:${DragonEggs[0]},太阳的轰鸣:${DragonEggs[1]},圣龙君临:${DragonEggs[2]},菲耶蒂娜:${DragonEggs[3]},献给小酒杯:${DragonEggs[4]},飞澜鲨鲨:${DragonEggs[5]}】`); - }; - // 更新记录 - record.lastDragonEggsNum = `【山之血:${DragonEggs[0]},太阳的轰鸣:${DragonEggs[1]},圣龙君临:${DragonEggs[2]},菲耶蒂娜:${DragonEggs[3]},献给小酒杯:${DragonEggs[4]},飞澜鲨鲨:${DragonEggs[5]}】`; - await recordForFile(false); - return DragonEggs; -}; - -//添加信息 -function writeContentToFile(content, judge) { - //文件名合法校验 - let finalAccountName = settings.accountName || "默认账户"; - try { - const illegalCharacters = /[\\/:*?"<>|]/; - const reservedNames = [ - "CON", "PRN", "AUX", "NUL", - "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", - "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9" - ]; - - if (finalAccountName === "" || - finalAccountName.startsWith(" ") || - finalAccountName.endsWith(" ") || - illegalCharacters.test(finalAccountName) || - reservedNames.includes(finalAccountName.toUpperCase()) || - finalAccountName.length > 255 - ) { - log.error(`账户名 "${finalAccountName}" 不合法,将使用默认值`); - finalAccountName = "默认账户"; - } - } catch (error) { - // 只在文件完全不存在时创建,避免覆盖 - file.writeTextSync(finalAccountName, content, false); - log.info(`创建新文件: ${finalAccountName}`); - } - - - let filePath = `records/${finalAccountName}.txt`; - //读取现有内容 - let existingContent = ""; - try { - existingContent = file.readTextSync(filePath); - } catch (e) { - } - - if (judge) { - runDate = `>>>>>>>${new Date().getFullYear()}年${String(new Date().getMonth() + 1).padStart(2, '0')}月${String(new Date().getDate()).padStart(2, '0')}日`; - const finalContent1 = runDate + "\n" + existingContent; - //按行分割,保留最近365条完整记录(按原始换行分割,不过滤) - const lines = finalContent1.split("\n"); - const keepLines = lines.length > 365 * 5 ? lines.slice(0, 365 * 5) : lines; // 假设每条记录最多5行 - const result1 = file.writeTextSync(filePath, keepLines.join("\n"), false); - - if (result1) { - log.info(`写入成功: ${filePath}`); - } else { - log.error(`写入失败: ${filePath}`); - } - - } else { - - //拼接 - const finalContent = content + existingContent; - //按行分割,保留最近365条完整记录(按原始换行分割,不过滤) - const lines = finalContent.split("\n"); - const keepLines = lines.length > 365 * 5 ? lines.slice(0, 365 * 5) : lines; // 假设每条记录最多5行 - const result = file.writeTextSync(filePath, keepLines.join("\n"), false); - - if (result) { - log.info(`写入成功: ${filePath}`); - } else { - log.error(`写入失败: ${filePath}`); - } - } -}; - -// 执行区 -(async function() { - await fakeLog("AutoPickLitter脚本", true, true, 0); - - // 判定你是不是新人 - if(!settings.water && !settings.sticks && !settings.lots && !settings.conchs && !settings.meal && !settings.eggs && !settings.turntable && !settings.todayLuck){ - log.error(`亲,这面请您点击【打开脚本目录】找到AutoPickLitter文件并打开然后去阅读README!!!`); - log.error(`亲,这面请您点击【打开脚本目录】找到AutoPickLitter文件并打开然后去阅读README!!!`); - log.error(`亲,这面请您点击【打开脚本目录】找到AutoPickLitter文件并打开然后去阅读README!!!`); - await fakeLog("AutoPickLitter脚本", true, false, 2333); - return 0; - }; - - // 判定文件名的合法性,以及初始化相关文件 - await recordForFile(true); - // 更新日期信息 - record.lastRunDate = new Date(Date.now() - 4 * 60 * 60 * 1000) - .toLocaleDateString('zh-CN', { timeZone: 'Asia/Shanghai', year: 'numeric', month: '2-digit', day: '2-digit' }) - .replace(/\//g, '/'); - - await recordForFile(false); - // 蒙德清泉镇圣水 - if (settings.water) { - await fakeLog("蒙德清泉镇圣水", false, true, 0); - await genshin.returnMainUi(); - await pathingScript.runFile("assets/霍普金斯.json"); - await genshin.returnMainUi(); - await genshin.returnMainUi(); - await pathingScript.runFile("assets/蒙德清泉镇路线.json"); - //识别对话位置,并点击 - let ocrResults = await performOcr("神奇的", dialogZone.x, dialogZone.y, false); - if (ocrResults.length != 0) { - await performOcr("如何才", dialogZone.x, dialogZone.y, false); - let ocrOver = await performOcr("已",{ min: 1482, max: 1630 }, { min: 912, max: 957 }, false); - if (ocrOver.success) { - log.info("已售罄!!!"); - } else { - let ocrMora = await performOcr("", { min: 1600, max: 1780 }, { min: 30, max: 60 }, true); - if (ocrMora == "") { - await sleep(500); - ocrMora = await performOcr("", { min: 1600, max: 1780 }, { min: 30, max: 60 }, true); - }; - if (BigInt(ocrMora.text) >= 300) { - await sleep(800); - await click(1636,1019); - await sleep(1000); - await click(1168,785); - await sleep(1000); - } else { - log.info("不是哥们,你怎么比我还穷!!!"); - }; - }; - }; - await genshin.returnMainUi(); - await fakeLog("蒙德清泉镇圣水", false, false, 0); - }; - - // 璃月璃沙娇上香 - if (sticksTime) { - await fakeLog("璃月璃沙娇上香", false, true, 0); - await genshin.returnMainUi(); - // 更新上香时间 - record.lastActivateTime = new Date(); - await recordForFile(false); - await pathingScript.runFile("assets/璃月璃沙娇路线.json"); - await sleep(1000); - // 识别区域 - let ocrResults = await performOcr("王平安", dialogZone.x, dialogZone.y, false); - if (ocrResults.success) { - await sleep(700); - await genshin.chooseTalkOption("能给我几支香吗"); - await sleep(700); - leftButtonClick(); - await sleep(700); - leftButtonClick(); - await sleep(2000); - let ocrResults1 = await performOcr("敬香", dialogZone.x, dialogZone.y, false); - if(ocrResults1.success){ - await click(1168,785); - await sleep(700); - } else { - log.error("未识别到对话,可能角色移速太快加上有开盾打断识别了"); - await genshin.returnMainUi(); - }; - } else { - log.error(`识别图像时发生异常: ${error.message}`); - }; - await genshin.returnMainUi(); - await fakeLog("璃月璃沙娇上香", false, false, 0); - }; - - // 稻妻鸣神大社抽签 - if (settings.lots) { - await fakeLog("稻妻鸣神大社抽签", false, true, 0) - await genshin.returnMainUi(); - await pathingScript.runFile("assets/稻妻鸣神大社路线.json"); - await sleep(1000); - // 识别对话位置,并点击 - let ocrResults = await performOcr("御神签箱", dialogZone.x, dialogZone.y, false); - if (ocrResults.success) { - await sleep(700); - leftButtonClick(); - await sleep(2000); - let ocrResults1 = await performOcr("求签吧", dialogZone.x, dialogZone.y, false); - if (ocrResults1.success) { - await sleep(2000); - leftButtonClick(); - await sleep(4000); - leftButtonClick(); - await sleep(3500); - }; - let ocrResults2 = await performOcr("玄冬林", dialogZone.x, dialogZone.y, false); - let results = ""; - if (ocrResults2.success) { - await sleep(1000); - leftButtonClick(); - await sleep(700); - let ocrResults3 = await performOcr("我要", dialogZone.x, dialogZone.y, false); - if (ocrResults3.success) { - await sleep(700); - leftButtonClick(); - await sleep(1500); - // 交互道具,直接选择位置点击 - await click(111,184); - await sleep(1000); - await click(1250,817); - await sleep(1000); - await click(1603,1013); - await sleep(1500); - await genshin.returnMainUi(); - // 打开背包找签 - await keyPress("B"); - await sleep(1000); - await click(1150,50); - await sleep(700); - for(let scroll = 0; scroll <= 22; scroll++){ - // 识别御神签 - let yuShenQian = await findImgIcon("assets/RecognitionObject/YuShenQianHalf.png", { min: 99, max: 1295 }, { min: 104, max: 967 }, true); - if (yuShenQian.success) { - break; - }; - if ( scroll != 0) { - // 判断是否到底 - let sliderBottom = await findImgIcon("assets/RecognitionObject/SliderBottom.png", { min: 1284, max: 1293 }, { min: 916, max: 942 }, false); - if (sliderBottom.success) { - log.info("已到达最后一页!"); - break; - }; - }; - //滑动背包 - await scrollPage(680, 10, 5); - await sleep(100); - }; - await sleep(2000); - await click(1670,1025); - await sleep(3000); - // 通过图片识别 - // 大凶or凶 - let bigBad = await findImgIcon("assets/RecognitionObject/BigBad.png", { min: 630, max: 830 }, { min: 100, max: 160 }, false); - let bad = await findImgIcon("assets/RecognitionObject/Bad.png", { min: 630, max: 830 }, { min: 100, max: 160 }, false); - // 大吉、中吉、吉、末吉 - let bigLuck = await findImgIcon("assets/RecognitionObject/BigLuck.png", { min: 630, max: 830 }, { min: 100, max: 160 }, false); - let midLuck = await findImgIcon("assets/RecognitionObject/MidLuck.png", { min: 630, max: 830 }, { min: 100, max: 160 }, false); - let endLuck = await findImgIcon("assets/RecognitionObject/EndLuck.png", { min: 630, max: 830 }, { min: 100, max: 160 }, false); - let luck = await findImgIcon("assets/RecognitionObject/Luck.png", { min: 630, max: 830 }, { min: 100, max: 160 }, false); - await genshin.returnMainUi(); - if (bigBad.success) { - log.info("抽签的结果:大凶"); - results = "大凶"; - await pathingScript.runFile("assets/挂签路线.json"); - await performOcr("御签挂", { min: 900, max: 1700 }, { min: 380, max: 880 }, false); - await genshin.chooseTalkOption("挂起来吧"); - await sleep(700); - await click(111,184); - await sleep(1000); - await click(1250,817); - await sleep(1000); - await click(1603,1013); - await sleep(1500); - await genshin.returnMainUi(); - log.info("事事顺利"); - } else if (bad.success) { - log.info("抽签的结果:凶"); - results = "凶"; - await pathingScript.runFile("assets/挂签路线.json"); - await performOcr("御签挂", { min: 900, max: 1700 }, { min: 380, max: 880 }, false); - await sleep(700); - await genshin.chooseTalkOption("挂起来吧"); - await click(111,184); - await sleep(1000); - await click(1250,817); - await sleep(1000); - await click(1603,1013); - await sleep(1500); - await genshin.returnMainUi(); - log.info("事事顺利"); - } else if (bigLuck.success) { - log.info("抽签的结果:大吉"); - results = "大吉"; - } else if (midLuck.success) { - log.info("抽签的结果:中吉"); - results = "中吉"; - } else if (endLuck.success) { - log.info("抽签的结果:末吉"); - results = "末吉"; - } else if (luck.success) { - log.info("抽签的结果:吉"); - results = "吉"; - } else { - log.warn("嘘,快踢作者屁股,修bug!!!"); - }; - } else { - await sleep(700); - await genshin.chooseTalkOption("再见"); - await sleep(700); - leftButtonClick(); - await sleep(1500); - log.info("对话出现再见,默认解签完毕以及查看签操作!!!"); - }; - - for (let i = record.records.length - 1; i > 0; i--) { - record.records[i] = record.records[i - 1]; - } - record.records[0] = `抽签的结果: ${results}`; - if (settings.notify) { - notification.Send(`抽签的结果: ${results}`); - } - await recordForFile(false);//修改记录文件 - }; - } else { - log.error(`识别图像时发生异常: ${error.message}`); - // await genshin.returnMainUi(); - }; - await genshin.returnMainUi(); - await fakeLog("稻妻鸣神大社抽签", false, true, 0) - }; - - // 稻妻踏鞴砂海螺 - if (settings.conchs) { - await fakeLog("稻妻踏鞴砂海螺", false, true, 0) - await genshin.returnMainUi(); - await pathingScript.runFile("assets/稻妻踏鞴砂路线.json"); - await sleep(1000); - if (settings.doYouOpen) { - await pathingScript.runFile("assets/阿敬.json"); - let figure = parseInt(settings.pickupTreasure); - let ocrResults = await performOcr("阿敬", dialogZone.x, dialogZone.y, false); - if (ocrResults.success) { - await sleep(1000); - let ocrResults1 = await performOcr("想要", dialogZone.x, dialogZone.y, false); - if (ocrResults1.success) { - await sleep(700); - leftButtonClick(); - await sleep(1500); - //交互道具,直接选择位置点击 - await click(111,184); - await sleep(1000); - await click(1250,817); - await sleep(1000); - await click(1603,1013); - await sleep(1500); - await genshin.returnMainUi(); - if (figure != 0) { - await pathingScript.runFile(`assets/宝箱${figure}.json`); - log.info(`你即将开启${figure}号宝箱`); - } else { - figure = Math.floor(Math.random() * 3) + 1; - log.info(`你即将开启${figure}号宝箱`); - await pathingScript.runFile(`assets/宝箱${figure}.json`); - }; - } else { - log.info("你开过了?look my eyes,回答我!!!"); - await genshin.chooseTalkOption("再见"); - await sleep(700); - leftButtonClick(); - await sleep(1500); - }; - } else { - log.error(`识别图像时发生异常: ${error.message}`); - }; - }; - await genshin.returnMainUi(); - await fakeLog("稻妻踏鞴砂海螺", false, false, 0) - }; - - //枫丹梅洛彼得堡福利餐 - if(settings.meal){ - await fakeLog("枫丹梅洛彼得堡福利餐", false, true, 0) - await genshin.returnMainUi(); - await pathingScript.runFile("assets/枫丹梅洛彼得堡路线.json"); - await sleep(1000); - let ocrResults = await performOcr("布兰", dialogZone.x, dialogZone.y, false); - if (ocrResults.success) { - let ocrResults1 = await performOcr("没什么", dialogZone.x, dialogZone.y, false); - if(ocrResults1.success){ - log.info("对话出现没什么,默认领取和使用过!!!"); - } else{ - // await genshin.chooseTalkOption("给我一份福利餐"); - await performOcr("给我一份福利餐", dialogZone.x, dialogZone.y, false); - await sleep(1000); - leftButtonClick(); - await sleep(1000); - leftButtonClick(); - await sleep(1500); - //打开背包找签 - log.info("打开背包"); - await keyPress("B"); - await sleep(1500); - await click(1250,50); - for(let scroll = 0; scroll <= 10; scroll++){ - let welffareMeal = await findImgIcon("assets/RecognitionObject/WelffareMealHalf.png", { min: 99, max: 1295 }, { min: 104, max: 967 }, false); - if (welffareMeal.success) { - break; - } - //滑动背包 - await sleep(1000); - await scrollPage(680, 10, 5); - await sleep(1000); - - if ( scroll != 0) { - // 判断是否到底 - let sliderBottom = await findImgIcon("assets/RecognitionObject/SliderBottom.png", { min: 1284, max: 1293 }, { min: 916, max: 942 }, false); - if (sliderBottom.success) { - log.info("已到达最后一页!"); - break; - }; - }; - }; - //这里是点击使用 - await sleep(1000); - await click(1670,1025); - await sleep(3000); - //识别获得的食物名称 - let ocrText = await performOcr("", { min: 813, max: 985 }, { min: 585, max: 619 }, true); - if (ocrText.text == "") { - await sleep(500); - ocrText = await performOcr("", { min: 813, max: 985 }, { min: 585, max: 619 }, true); - }; - log.info(`获得:${ocrText.text}`); - for (let i = record.records.length - 1; i > 0; i--) { - record.records[i] = record.records[i - 1]; - } - record.records[0] = `获得的食物: ${ocrText.text}`; - if (settings.notify) { - notification.Send(`获得的食物: ${ocrText.text}`); - }; - await recordForFile(false);// 修改记录文件 - - //点击幸运签,并识别内容 - await sleep(1000); - await click(1000,520); - await sleep(3000); - let ocrText1 = await performOcr("", { min: 716, max: 1200 }, { min: 631, max: 710 }, true); - if (ocrText.text == "") { - await sleep(500); - ocrText1 = await performOcr("", { min: 716, max: 1200 }, { min: 631, max: 710 }, true); - }; - let text = ocrText1.text.replace(/\r\n|\n|\r/g, ""); - - log.info(`幸运签内容:${text}`); - - for (let i = record.records.length - 1; i > 0; i--) { - record.records[i] = record.records[i - 1]; - } - record.records[0] = `幸运签内容: ${text}`; - if (settings.notify) { - notification.Send(`幸运签内容: ${text}`); - } - await recordForFile(false);// 修改记录文件 - - }; - - } else { - log.error(`识别图像时发生异常: ${error.message}`); - }; - await genshin.returnMainUi(); - await fakeLog("枫丹梅洛彼得堡福利餐", false, false, 0) - }; - - // 纳塔悠悠集市龙蛋 - if(settings.eggs){ - let nowDragonEggsNum = record.lastDragonEggsNum; - if (record.lastDragonEggsNum == "【山之血:0,太阳的轰鸣:0,圣龙君临:0,菲耶蒂娜:0,献给小酒杯:0,飞澜鲨鲨:0】" || settings.updateEggs) { - nowDragonEggsNum = await chcekDragonEggs(); - }; - let nowDragonEggs = nowDragonEggsNum.match(/\d+/g).map(Number); - await fakeLog("纳塔悠悠集市龙蛋", false, true, 0) - await genshin.returnMainUi(); - await pathingScript.runFile("assets/纳塔悠悠集市路线.json"); - let ocrResults = await performOcr("察尔瓦", dialogZone.x, dialogZone.y, false); - if (ocrResults.success) { - await sleep(700); - leftButtonClick(); - await sleep(2000); - let ocrResults1 = await performOcr("让我挑一枚", dialogZone.x, dialogZone.y, false); - if (ocrResults1.success) { - await sleep(5000); - let figure = 0; - if (settings.selectDragonEggModel == "随机模式") { - const crypto = require('crypto'); - figure = crypto.randomInt(0, 6); - // figure = Math.floor(Math.random() * 6); - } else if (settings.selectDragonEggModel == "指定模式") { - switch (settings.pickupDragonEgg) { - case "闪闪礼蛋·山之血": - figure = 0; - break; - case "闪闪礼蛋·太阳的轰鸣": - figure = 1; - break; - case "闪闪礼蛋·圣龙君临": - figure = 2; - break; - case "闪闪礼蛋·菲耶蒂娜": - figure = 3; - break; - case "闪闪礼蛋·献给小酒杯": - figure = 4; - break; - case "闪闪礼蛋·飞澜鲨鲨": - figure = 5; - break; - default: - log.warn("嘘,快踢作者屁股,修bug!!!"); - break; - }; - }else { - - }; - - // 日志输出会去点击那个龙蛋 - switch (figure) { - case 0: - log.info("获得的龙蛋:闪闪礼蛋·山之血"); - break; - case 1: - log.info("获得的龙蛋:闪闪礼蛋·太阳的轰鸣"); - break; - case 2: - log.info("获得的龙蛋:闪闪礼蛋·圣龙君临"); - break; - case 3: - log.info("获得的龙蛋:闪闪礼蛋·菲耶蒂娜"); - break; - case 4: - log.info("获得的龙蛋:闪闪礼蛋·献给小酒杯"); - break; - case 5: - log.info("获得的龙蛋:闪闪礼蛋·飞澜鲨鲨"); - break; - default: - log.warn("嘘,快踢作者屁股,修bug!!!"); - break; - }; - - moveMouseTo(coordinates[figure - 1][0],coordinates[figure - 1][1]); - nowDragonEggs[figure]++; - if (settings.notify) { - notification.Send(`背包龙蛋数目: 【山之血:${nowDragonEggs[0]},太阳的轰鸣:${nowDragonEggs[1]},圣龙君临:${nowDragonEggs[2]},菲耶蒂娜:${nowDragonEggs[3]},献给小酒杯:${nowDragonEggs[4]},飞澜鲨鲨:${nowDragonEggs[5]}】`); - }; - // 更新记录 - record.lastDragonEggsNum = `【山之血:${nowDragonEggs[0]},太阳的轰鸣:${nowDragonEggs[1]},圣龙君临:${nowDragonEggs[2]},菲耶蒂娜:${nowDragonEggs[3]},献给小酒杯:${nowDragonEggs[4]},飞澜鲨鲨:${nowDragonEggs[5]}】`; - await recordForFile(false); - - moveMouseTo(coordinates[figure - 1][0],coordinates[figure - 1][1]); - - await sleep(100); - leftButtonClick(); - await sleep(3000); - } else { - log.info("你今天已经领取过了"); - }; - } else { - log.error(`识别图像时发生异常: ${error.message}`); - }; - - await genshin.returnMainUi(); - await fakeLog("纳塔悠悠集市龙蛋", false, false, 0) - }; - - //挪德卡莱那夏镇好运转盘 - if (settings.turntable) { - await fakeLog("挪德卡莱那夏镇好运转盘", false, true, 0) - await genshin.returnMainUi(); - await pathingScript.runFile("assets/挪德卡莱那夏镇好运转盘路线.json"); - await sleep(1000); - let ocrResults = await performOcr("好运速转", dialogZone.x, dialogZone.y, false); - if (ocrResults.success) { - await sleep(3000); - leftButtonClick(); - await sleep(1000); - let ocrResults1 = await performOcr("拨动转盘", dialogZone.x, dialogZone.y, false); - if (ocrResults1.success) { - await sleep(6000); - let ocrText = await performOcr("", { min: 555, max: 1365 }, { min: 902, max: 1000 }, true); - if (ocrText.text == "") { - await sleep(500); - ocrText = await performOcr("", { min: 555, max: 1365 }, { min: 902, max: 1000 }, true); - }; - log.info(`转盘运势:${ocrText.text}`); - // writeContentToFile(`转盘的运势:${recognizedText}\n`, false); - let text = ocrText.text.replace(/\r\n|\n|\r/g, ""); - - - for (let i = record.records.length - 1; i > 0; i--) { - record.records[i] = record.records[i - 1]; - } - record.records[0] = `转盘的运势: ${text}`; - if (settings.notify) { - notification.Send(`转盘的运势: ${text}`); - } - await recordForFile(false);// 修改记录文件 - - await sleep(2000); - leftButtonClick(); - await sleep(700); - } else { - log.error(`识别图像时发生异常: ${error.message}`); - }; - } else { - log.error(`识别图像时发生异常: ${error.message}`); - }; - await genshin.returnMainUi(); - await fakeLog("挪德卡莱那夏镇好运转盘", false, false, 0) - }; - - // 挪德卡莱那夏镇今日收获 - if (settings.todayLuck) { - await fakeLog("挪德卡莱那夏镇美味的今日收获", false, true, 0) - await genshin.returnMainUi(); - await pathingScript.runFile("assets/挪德卡莱那夏镇美味的今日收获路线.json"); - await sleep(1000); - let ocrResults = await performOcr("莉莉希", dialogZone.x, dialogZone.y, false); - if (ocrResults.success) { - await sleep(700); - leftButtonClick(); - let ocrResults1 = await performOcr("可以领", dialogZone.x, dialogZone.y, false); - if (ocrResults1.success) { - await sleep(700); - leftButtonClick(); - await sleep(1500); - } else { - log.warn("情况一,你根本没仔细看提示"); - log.warn("情况二,你把它残忍放进背包了"); - await sleep(1000); - await genshin.chooseTalkOption("其实"); - await sleep(1000); - await sleep(700); - leftButtonClick(); - await sleep(1500); - }; - } else { - log.error(`识别图像时发生异常: ${error.message}`); - }; - await genshin.returnMainUi(); - await fakeLog("挪德卡莱那夏镇美味的今日收获", false, false, 0) - }; - - for (let i = record.records.length - 1; i > 0; i--) { - record.records[i] = record.records[i - 1]; - } - record.records[0] = `>>>>>>>>>> ${new Date().getFullYear()}年${String(new Date().getMonth() + 1).padStart(2, '0')}月${String(new Date().getDate()).padStart(2, '0')}日`; - await recordForFile(false);// 修改记录文件 - - await fakeLog("AutoPickLitter脚本", true, false, 2333); - -})(); \ No newline at end of file diff --git a/repo/js/调用一条龙/README.md b/repo/js/调用一条龙/README.md new file mode 100644 index 000000000..aea4bd56c --- /dev/null +++ b/repo/js/调用一条龙/README.md @@ -0,0 +1,48 @@ +# OBS录制 + +## 介绍 +#### 该脚本是搭配auto-bgi软件使用,进行开启一条龙 +#### 不了解的可以去BetterGI的QQ频道搜索【auto-bgi】 +#### 也可以电脑点击【[ABGI](https://gitee.com/wangjian0327/auto-bgi/blob/ginVue/README.md)】,进行学习,了解 + +------ + + ## 注意 + #### 使用`调用一条龙`脚本时,`ABGI`最低版本为【3.1】 + +------ + +## 使用方法 + +#### 在`调度器`中新建`配置组`,`配置组`添加`调用一条龙`右键脚本名字,找到【修改通用配置】将里面的【JS HTTP权限】下的`禁用`选择`启用`,在【修改JS脚本自定义设置】,选or填相关内容 +#### 图文教程拿`OBS录制`做示例 +------ + +#### 图文教程步骤一: +image + +#### 图文教程步骤二: +image + +#### 图文教程步骤三: +image + +#### 图文教程步骤四: +image + +#### 图文教程步骤五 +image + +#### 图文教程步骤六 +image + +------ + +## 版本 +#### 0.0.1 +有啥不懂的,八九十群,可以艾特【古又】 + + + + + diff --git a/repo/js/调用一条龙/assets/img/步骤一.png b/repo/js/调用一条龙/assets/img/步骤一.png new file mode 100644 index 000000000..822ce2ad3 Binary files /dev/null and b/repo/js/调用一条龙/assets/img/步骤一.png differ diff --git a/repo/js/调用一条龙/assets/img/步骤三.png b/repo/js/调用一条龙/assets/img/步骤三.png new file mode 100644 index 000000000..cb92da770 Binary files /dev/null and b/repo/js/调用一条龙/assets/img/步骤三.png differ diff --git a/repo/js/调用一条龙/assets/img/步骤二.png b/repo/js/调用一条龙/assets/img/步骤二.png new file mode 100644 index 000000000..7572d150a Binary files /dev/null and b/repo/js/调用一条龙/assets/img/步骤二.png differ diff --git a/repo/js/调用一条龙/assets/img/步骤五.png b/repo/js/调用一条龙/assets/img/步骤五.png new file mode 100644 index 000000000..56ff47289 Binary files /dev/null and b/repo/js/调用一条龙/assets/img/步骤五.png differ diff --git a/repo/js/调用一条龙/assets/img/步骤六.png b/repo/js/调用一条龙/assets/img/步骤六.png new file mode 100644 index 000000000..2b2fbdc1b Binary files /dev/null and b/repo/js/调用一条龙/assets/img/步骤六.png differ diff --git a/repo/js/调用一条龙/assets/img/步骤四.png b/repo/js/调用一条龙/assets/img/步骤四.png new file mode 100644 index 000000000..ac9b202fa Binary files /dev/null and b/repo/js/调用一条龙/assets/img/步骤四.png differ diff --git a/repo/js/调用一条龙/main.js b/repo/js/调用一条龙/main.js new file mode 100644 index 000000000..aceac91be --- /dev/null +++ b/repo/js/调用一条龙/main.js @@ -0,0 +1,14 @@ + +(async function () { + + + try { + // 判断你是否运行ABGI + const exitABGI = await http.request('GET', `http://localhost:8082/api/index`, null, null); + log.debug(`ABGI状态: ${JSON.stringify(exitABGI.body)}`); + } catch (error) { + log.error("ABGI未运行"); + return; + }; + const listResp = await http.request('POST',"http://localhost:8082/api/oneLong/startOneLong",`${settings.oneDragonName}`,null); +})(); \ No newline at end of file diff --git a/repo/js/调用一条龙/manifest.json b/repo/js/调用一条龙/manifest.json new file mode 100644 index 000000000..2151b664d --- /dev/null +++ b/repo/js/调用一条龙/manifest.json @@ -0,0 +1,26 @@ +{ + "manifest_version": 1, + "name": "启动一条龙", + "version": "0.0.1", + "tags": [ + "abgi" + ], + "description": "调用ABGI接口,启动一条龙", + "saved_files": [ + ], + "authors": [ + { + "name": "隔壁老王", + "links": "https://github.com/wjdsg0327" + }, + { + "name": "古又", + "links": "https://github.com/guyou45" + } + ], + "http_allowed_urls": [ + "http://localhost:8082/api/*" + ], + "settings_ui": "settings.json", + "main": "main.js" +} \ No newline at end of file diff --git a/repo/js/调用一条龙/settings.json b/repo/js/调用一条龙/settings.json new file mode 100644 index 000000000..d3f44527b --- /dev/null +++ b/repo/js/调用一条龙/settings.json @@ -0,0 +1,8 @@ +[ + { + "name": "oneDragonName", + "type": "input-text", + "label": "输入要启动的一条龙(默认:默认配置)", + "default": "默认配置" + } +] \ No newline at end of file