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录制`做示例
+------
+
+#### 图文教程步骤一:
+
+
+#### 图文教程步骤二:
+
+
+#### 图文教程步骤三:
+
+
+#### 图文教程步骤四:
+
+
+#### 图文教程步骤五
+
+
+#### 图文教程步骤六
+
+
+------
+
+## 版本
+#### 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