优化爱可菲厨艺机关README
This commit is contained in:
51
repo/js/EscofierKitchenContraption/README.md
Normal file
51
repo/js/EscofierKitchenContraption/README.md
Normal file
@@ -0,0 +1,51 @@
|
||||
# 爱可菲厨艺机关
|
||||
|
||||
## 项目简介
|
||||
本脚本用于自动操作爱可菲厨艺机关,通过芭芭拉的攻击动作为机关充能,实现自动获取料理的功能。脚本支持周期性执行,可根据需要设置为每周一执行或每天执行。
|
||||
|
||||
## 作者信息
|
||||
- **作者**:LCB-茶包
|
||||
- **联系方式**:QQ 119996800
|
||||
|
||||
## 使用说明
|
||||
|
||||
### 必要配置
|
||||
1. **队伍设置**(必填):使用前请在配置中设置要切换的队伍,否则脚本会自动结束任务
|
||||
2. **队伍编排**:请确保切换的队伍中:
|
||||
- 3号位:爱可菲
|
||||
- 4号位:芭芭拉
|
||||
|
||||
### 执行模式
|
||||
- **周一执行**(推荐):选择"是",脚本会自动判断是否为星期一从而执行
|
||||
- 爱可菲厨艺机关每周限制10个料理,周一更新CD
|
||||
- 直接加入调度器即可自动运行
|
||||
- **每天执行**:选择"每天执行"为每次都执行
|
||||
- **禁用模式**:选择"否"为禁用脚本
|
||||
|
||||
### 功能特性
|
||||
- **自动检测**:脚本会自动判断是否获得10个料理后自动退出
|
||||
- **时间控制**:一般60秒完成,最大超时默认100秒(可自定义配置)
|
||||
- **多账号支持**:支持UID禁用模式,可设置不执行的UID
|
||||
- 格式:用 `/` 分隔多个UID,如 `12345/99999`
|
||||
- 适用于多个账号但部分账号没有爱可菲的情况
|
||||
|
||||
## 技术原理
|
||||
脚本通过芭芭拉的攻击动作为爱可菲厨艺机关充能,实现自动化料理制作过程。
|
||||
|
||||
## 注意事项
|
||||
- 脚本可能存在误差,建议在测试环境中先行验证
|
||||
- 执行时间受网络环境和设备性能影响
|
||||
|
||||
## 反馈与支持
|
||||
如遇到错误或问题,请联系:
|
||||
- QQ:119996800
|
||||
|
||||
## 更新日志
|
||||
|
||||
### v1.3 (2025-05-12)
|
||||
- 更改UID识别方法(适配原神UI改变)
|
||||
- 修改超时默认时间
|
||||
|
||||
### v1.2 (2025-05-10)
|
||||
- 首次发布版本
|
||||
|
||||
@@ -1,183 +1,183 @@
|
||||
(async function () {
|
||||
|
||||
//初始化配置======================================================================================
|
||||
var actiontime = settings.actiontime != undefined && ~~settings.actiontime > 0 ? ~~settings.actiontime : 150;
|
||||
var TEAM
|
||||
var AKF = settings.AKF !== undefined ? (
|
||||
settings.AKF === "是" ? 1 :
|
||||
settings.AKF === "否" ? 0 :
|
||||
settings.AKF === "每天执行" ? 2
|
||||
: 0 ) : 0; // 如果settings.AKF完全未定义,也赋予AKF为0
|
||||
|
||||
/**
|
||||
* 文字OCR识别封装函数(测试中,未封装完成,后续会优化逻辑)
|
||||
* @param text 要识别的文字,默认为"空参数"
|
||||
* @param timeout 超时时间,单位为秒,默认为10秒
|
||||
* @param afterBehavior 点击模式,0表示不点击,1表示点击识别到文字的位置,2表示输出模式,默认为0
|
||||
* @param debugmodel 调试代码,0表示输入判断模式,1表示输出位置信息,2表示输出判断模式,默认为0
|
||||
* @param x OCR识别区域的起始X坐标,默认为0
|
||||
* @param y OCR识别区域的起始Y坐标,默认为0
|
||||
* @param w OCR识别区域的宽度,默认为1920
|
||||
* @param h OCR识别区域的高度,默认为1080
|
||||
* @returns 包含识别结果的对象,包括识别的文字、坐标和是否找到的结果
|
||||
*/
|
||||
async function textOCR(text="空参数",timeout=10,afterBehavior=0,debugmodel=0,x=0,y=0,w=1920,h=1080) {
|
||||
const startTime = new Date();
|
||||
var Outcheak = 0
|
||||
for (var ii = 0; ii < 10; ii++)
|
||||
{
|
||||
// 获取一张截图
|
||||
var captureRegion = captureGameRegion();
|
||||
var res1
|
||||
var res2
|
||||
var conuntcottimecot=1;
|
||||
var conuntcottimecomp=1;
|
||||
// 对整个区域进行 OCR
|
||||
var resList = captureRegion.findMulti(RecognitionObject.ocr(x,y,w,h));
|
||||
//log.info("OCR 全区域识别结果数量 {len}", resList.count);
|
||||
if (resList.count !== 0) {
|
||||
for (let i = 0; i < resList.count; i++)
|
||||
{ // 遍历的是 C# 的 List 对象,所以要用 count,而不是 length
|
||||
let res = resList[i];
|
||||
res1=res.text
|
||||
conuntcottimecomp++;
|
||||
if (res.text.includes(text) && debugmodel ==3 ) {return result = { text: res.text, x: res.x, y: res.y, found: true };}
|
||||
if (res.text.includes(text) && debugmodel !==2 ) {
|
||||
conuntcottimecot ++;
|
||||
log.info(`“${res1}”找到`);
|
||||
if (debugmodel===1 & x===0 & y===0){log.info("全图代码位置:({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10);}else{log.info("文本OCR完成'{text}'", res.text);}
|
||||
if (afterBehavior===1){log.info("点击模式:开");await sleep(1000);click(res.x, res.y);}else{if (debugmodel===1 & x===0 & y===0){log.info("点击模式:关")}}
|
||||
if (afterBehavior===2){log.info("F模式:开");await sleep(100);keyPress("F");}else{if (debugmodel===1 & x===0 & y===0){log.info("F模式:关");}}
|
||||
if (conuntcottimecot>=conuntcottimecomp/2){return result = { text: res.text, x: res.x, y: res.y, found: true };}else{return result = { found: false};}
|
||||
}
|
||||
if (debugmodel ===2 ){
|
||||
if (res1 === res2){conuntcottimecot ++;res2=res1;}
|
||||
//log.info("输出模式:全图代码位置:({x},{y},{h},{w},{string})", res.x-10, res.y-10, res.width+10, res.Height+10, res.text);
|
||||
if (Outcheak===1){ if (conuntcottimecot>=conuntcottimecomp/2){return result = { text: res.text, x: res.x, y: res.y, found: true };}else{return result = { found: false};}}
|
||||
}}}
|
||||
const NowTime = new Date();
|
||||
if ((NowTime - startTime)>timeout*1000){if (debugmodel===2){ if (resList.count === 0){return result = {found: false};} else{Outcheak=1;ii=2;} } else {Outcheak=0;if (debugmodel===1 & x===0 & y===0){log.info(`${timeout}秒超时退出,"${text}"未找到`)};return result = {found: false };}}
|
||||
else{ii=2;if (debugmodel===1 & x===0 & y===0){log.info(`"${text}"识别中……`); } }
|
||||
await sleep(100);
|
||||
}
|
||||
}
|
||||
|
||||
/**======================================================================================
|
||||
* 执行质变仪的部署动作,未找到质变仪时返回false结束,找到质变仪时返回true
|
||||
*/
|
||||
async function deployTransformer(){
|
||||
|
||||
await genshin.SwitchParty(TEAM); //切换到指定队伍,必须进行配置,4号位放芭芭拉
|
||||
await sleep(1000);
|
||||
await keyPress("3");
|
||||
await sleep(1200);
|
||||
await keyDown("e");
|
||||
await sleep(1000);
|
||||
await keyUp("e");
|
||||
await sleep(1000);
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
/**======================================================================================
|
||||
* 执行芭芭拉攻击指令,并等待质变仪完成提示出现。 若超时则强制结束流程。
|
||||
*/
|
||||
async function executeAttack(){
|
||||
await sleep(1000);
|
||||
await keyPress("4");
|
||||
await sleep(1200);
|
||||
await middleButtonClick();
|
||||
await sleep(1000);
|
||||
|
||||
log.info(`攻击动作开始,${actiontime}秒后超时退出!一般120秒左右完成!`)
|
||||
var startTime = new Date();
|
||||
await sleep(500);
|
||||
var NowTime = new Date();
|
||||
//芭芭拉攻击指令,等待质变仪完成提示出现,若超时则强制结束流程。
|
||||
var getshu = 0;
|
||||
var lastIncrementTime = 0; // 上次增加getshu的时间
|
||||
const intervalTime = 3000; // 3秒的时间间隔,单位为毫秒
|
||||
while ((NowTime - startTime)<actiontime*1000){
|
||||
const result = await textOCR("获得", 0.2, 0, 3, 159, 494, 75, 44);
|
||||
if (result.found) {
|
||||
const currentTime = new Date().getTime();
|
||||
if (currentTime - lastIncrementTime >= intervalTime) {
|
||||
getshu++;
|
||||
lastIncrementTime = currentTime;
|
||||
log.warn(`获得料理数量: ${getshu}`);
|
||||
if (getshu >= 10) {
|
||||
log.warn("获得料理数量已达10,结束流程!");
|
||||
await genshin.returnMainUi(); // 提前退出循环
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
leftButtonClick();
|
||||
await sleep(50);
|
||||
NowTime = new Date();
|
||||
}
|
||||
|
||||
await genshin.returnMainUi();
|
||||
throw new Error(`${actiontime}秒攻击动作超时,结束流程!`);
|
||||
}
|
||||
|
||||
let nowuidString = settings.nowuid ? settings.nowuid : "";
|
||||
|
||||
// UID获取存在概率不成功,慎用!请更换背景纯色的名片提高OCR成功率
|
||||
let uidNumbers = nowuidString.match(/\d+/g);
|
||||
if (nowuidString) {
|
||||
log.debug(`DEBUG:${uidNumbers}`);//调试LOG
|
||||
await genshin.returnMainUi();
|
||||
await keyPress("VK_ESCAPE");
|
||||
await sleep(500);
|
||||
if (uidNumbers && uidNumbers.length > 0) {
|
||||
// 使用 for...of 循环遍历 uidNumbers 数组
|
||||
for (let number of uidNumbers) {
|
||||
var UIDnow = number;
|
||||
log.debug(`DEBUG:${UIDnow}`);
|
||||
let UIDD = await textOCR(UIDnow, 1, 0, 0, 112,177, 190, 39);
|
||||
if (UIDD.found) {
|
||||
await genshin.returnMainUi();
|
||||
throw new Error(`UID "${UIDnow}" 已被禁用,停止刷取!`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}else{log.warn("未配置禁用UID,继续进行!");}
|
||||
//main/======================================================================================
|
||||
await genshin.returnMainUi();
|
||||
//检查用户是否配置队伍============================================
|
||||
if (settings.TEAMname === undefined) {
|
||||
throw new Error("必填!请在配置页面填写队伍名称,3号为爱可菲,4号位芭芭拉!"); // 没选就报错后停止
|
||||
}else{TEAM = settings.TEAMname}
|
||||
|
||||
//爱可菲厨艺机关
|
||||
try {
|
||||
var AKFevry = 0;
|
||||
if (AKF == 2){AKF = 1;AKFevry = 1;}
|
||||
if (AKF == 1){
|
||||
const today = new Date();
|
||||
// 判断是否为周一(getDay()返回0-6,1代表周一)
|
||||
if (today.getDay() == 1 || AKFevry == 1) {
|
||||
log.info("执行爱可菲烹饪任务");
|
||||
if ((await deployTransformer())) {//部署厨艺机关
|
||||
log.info("厨艺机关部署成功!");
|
||||
}
|
||||
if ((await executeAttack())) {//芭芭拉攻击指令流程
|
||||
log.info("爱可菲烹饪任务执行完成,结束!!");
|
||||
}
|
||||
}else{
|
||||
log.info("不执行爱可菲烹饪任务");
|
||||
}
|
||||
}else{
|
||||
log.info("爱可菲烹饪任务禁用");
|
||||
}
|
||||
} catch (error) {
|
||||
log.error(`执行过程中发生错误:${error.message}`);
|
||||
} finally {
|
||||
await genshin.returnMainUi();
|
||||
}
|
||||
//main/**======================================================================================
|
||||
|
||||
})();
|
||||
|
||||
|
||||
(async function () {
|
||||
|
||||
//初始化配置======================================================================================
|
||||
var actiontime = settings.actiontime != undefined && ~~settings.actiontime > 0 ? ~~settings.actiontime : 150;
|
||||
var TEAM
|
||||
var AKF = settings.AKF !== undefined ? (
|
||||
settings.AKF === "是" ? 1 :
|
||||
settings.AKF === "否" ? 0 :
|
||||
settings.AKF === "每天执行" ? 2
|
||||
: 0 ) : 0; // 如果settings.AKF完全未定义,也赋予AKF为0
|
||||
|
||||
/**
|
||||
* 文字OCR识别封装函数(测试中,未封装完成,后续会优化逻辑)
|
||||
* @param text 要识别的文字,默认为"空参数"
|
||||
* @param timeout 超时时间,单位为秒,默认为10秒
|
||||
* @param afterBehavior 点击模式,0表示不点击,1表示点击识别到文字的位置,2表示输出模式,默认为0
|
||||
* @param debugmodel 调试代码,0表示输入判断模式,1表示输出位置信息,2表示输出判断模式,默认为0
|
||||
* @param x OCR识别区域的起始X坐标,默认为0
|
||||
* @param y OCR识别区域的起始Y坐标,默认为0
|
||||
* @param w OCR识别区域的宽度,默认为1920
|
||||
* @param h OCR识别区域的高度,默认为1080
|
||||
* @returns 包含识别结果的对象,包括识别的文字、坐标和是否找到的结果
|
||||
*/
|
||||
async function textOCR(text="空参数",timeout=10,afterBehavior=0,debugmodel=0,x=0,y=0,w=1920,h=1080) {
|
||||
const startTime = new Date();
|
||||
var Outcheak = 0
|
||||
for (var ii = 0; ii < 10; ii++)
|
||||
{
|
||||
// 获取一张截图
|
||||
var captureRegion = captureGameRegion();
|
||||
var res1
|
||||
var res2
|
||||
var conuntcottimecot=1;
|
||||
var conuntcottimecomp=1;
|
||||
// 对整个区域进行 OCR
|
||||
var resList = captureRegion.findMulti(RecognitionObject.ocr(x,y,w,h));
|
||||
//log.info("OCR 全区域识别结果数量 {len}", resList.count);
|
||||
if (resList.count !== 0) {
|
||||
for (let i = 0; i < resList.count; i++)
|
||||
{ // 遍历的是 C# 的 List 对象,所以要用 count,而不是 length
|
||||
let res = resList[i];
|
||||
res1=res.text
|
||||
conuntcottimecomp++;
|
||||
if (res.text.includes(text) && debugmodel ==3 ) {return result = { text: res.text, x: res.x, y: res.y, found: true };}
|
||||
if (res.text.includes(text) && debugmodel !==2 ) {
|
||||
conuntcottimecot ++;
|
||||
log.info(`“${res1}”找到`);
|
||||
if (debugmodel===1 & x===0 & y===0){log.info("全图代码位置:({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10);}else{log.info("文本OCR完成'{text}'", res.text);}
|
||||
if (afterBehavior===1){log.info("点击模式:开");await sleep(1000);click(res.x, res.y);}else{if (debugmodel===1 & x===0 & y===0){log.info("点击模式:关")}}
|
||||
if (afterBehavior===2){log.info("F模式:开");await sleep(100);keyPress("F");}else{if (debugmodel===1 & x===0 & y===0){log.info("F模式:关");}}
|
||||
if (conuntcottimecot>=conuntcottimecomp/2){return result = { text: res.text, x: res.x, y: res.y, found: true };}else{return result = { found: false};}
|
||||
}
|
||||
if (debugmodel ===2 ){
|
||||
if (res1 === res2){conuntcottimecot ++;res2=res1;}
|
||||
//log.info("输出模式:全图代码位置:({x},{y},{h},{w},{string})", res.x-10, res.y-10, res.width+10, res.Height+10, res.text);
|
||||
if (Outcheak===1){ if (conuntcottimecot>=conuntcottimecomp/2){return result = { text: res.text, x: res.x, y: res.y, found: true };}else{return result = { found: false};}}
|
||||
}}}
|
||||
const NowTime = new Date();
|
||||
if ((NowTime - startTime)>timeout*1000){if (debugmodel===2){ if (resList.count === 0){return result = {found: false};} else{Outcheak=1;ii=2;} } else {Outcheak=0;if (debugmodel===1 & x===0 & y===0){log.info(`${timeout}秒超时退出,"${text}"未找到`)};return result = {found: false };}}
|
||||
else{ii=2;if (debugmodel===1 & x===0 & y===0){log.info(`"${text}"识别中……`); } }
|
||||
await sleep(100);
|
||||
}
|
||||
}
|
||||
|
||||
/**======================================================================================
|
||||
* 执行质变仪的部署动作,未找到质变仪时返回false结束,找到质变仪时返回true
|
||||
*/
|
||||
async function deployTransformer(){
|
||||
|
||||
await genshin.SwitchParty(TEAM); //切换到指定队伍,必须进行配置,4号位放芭芭拉
|
||||
await sleep(1000);
|
||||
await keyPress("3");
|
||||
await sleep(1200);
|
||||
await keyDown("e");
|
||||
await sleep(1000);
|
||||
await keyUp("e");
|
||||
await sleep(1000);
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
/**======================================================================================
|
||||
* 执行芭芭拉攻击指令,并等待质变仪完成提示出现。 若超时则强制结束流程。
|
||||
*/
|
||||
async function executeAttack(){
|
||||
await sleep(1000);
|
||||
await keyPress("4");
|
||||
await sleep(1200);
|
||||
await middleButtonClick();
|
||||
await sleep(1000);
|
||||
|
||||
log.info(`攻击动作开始,${actiontime}秒后超时退出!一般120秒左右完成!`)
|
||||
var startTime = new Date();
|
||||
await sleep(500);
|
||||
var NowTime = new Date();
|
||||
//芭芭拉攻击指令,等待质变仪完成提示出现,若超时则强制结束流程。
|
||||
var getshu = 0;
|
||||
var lastIncrementTime = 0; // 上次增加getshu的时间
|
||||
const intervalTime = 3000; // 3秒的时间间隔,单位为毫秒
|
||||
while ((NowTime - startTime)<actiontime*1000){
|
||||
const result = await textOCR("获得", 0.2, 0, 3, 159, 494, 75, 44);
|
||||
if (result.found) {
|
||||
const currentTime = new Date().getTime();
|
||||
if (currentTime - lastIncrementTime >= intervalTime) {
|
||||
getshu++;
|
||||
lastIncrementTime = currentTime;
|
||||
log.warn(`获得料理数量: ${getshu}`);
|
||||
if (getshu >= 10) {
|
||||
log.warn("获得料理数量已达10,结束流程!");
|
||||
await genshin.returnMainUi(); // 提前退出循环
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
leftButtonClick();
|
||||
await sleep(50);
|
||||
NowTime = new Date();
|
||||
}
|
||||
|
||||
await genshin.returnMainUi();
|
||||
throw new Error(`${actiontime}秒攻击动作超时,结束流程!`);
|
||||
}
|
||||
|
||||
let nowuidString = settings.nowuid ? settings.nowuid : "";
|
||||
|
||||
// UID获取存在概率不成功,慎用!请更换背景纯色的名片提高OCR成功率
|
||||
let uidNumbers = nowuidString.match(/\d+/g);
|
||||
if (nowuidString) {
|
||||
log.debug(`DEBUG:${uidNumbers}`);//调试LOG
|
||||
await genshin.returnMainUi();
|
||||
await keyPress("VK_ESCAPE");
|
||||
await sleep(500);
|
||||
if (uidNumbers && uidNumbers.length > 0) {
|
||||
// 使用 for...of 循环遍历 uidNumbers 数组
|
||||
for (let number of uidNumbers) {
|
||||
var UIDnow = number;
|
||||
log.debug(`DEBUG:${UIDnow}`);
|
||||
let UIDD = await textOCR(UIDnow, 1, 0, 0, 112,177, 190, 39);
|
||||
if (UIDD.found) {
|
||||
await genshin.returnMainUi();
|
||||
throw new Error(`UID "${UIDnow}" 已被禁用,停止刷取!`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}else{log.warn("未配置禁用UID,继续进行!");}
|
||||
//main/======================================================================================
|
||||
await genshin.returnMainUi();
|
||||
//检查用户是否配置队伍============================================
|
||||
if (settings.TEAMname === undefined) {
|
||||
throw new Error("必填!请在配置页面填写队伍名称,3号为爱可菲,4号位芭芭拉!"); // 没选就报错后停止
|
||||
}else{TEAM = settings.TEAMname}
|
||||
|
||||
//爱可菲厨艺机关
|
||||
try {
|
||||
var AKFevry = 0;
|
||||
if (AKF == 2){AKF = 1;AKFevry = 1;}
|
||||
if (AKF == 1){
|
||||
const today = new Date();
|
||||
// 判断是否为周一(getDay()返回0-6,1代表周一)
|
||||
if (today.getDay() == 1 || AKFevry == 1) {
|
||||
log.info("执行爱可菲烹饪任务");
|
||||
if ((await deployTransformer())) {//部署厨艺机关
|
||||
log.info("厨艺机关部署成功!");
|
||||
}
|
||||
if ((await executeAttack())) {//芭芭拉攻击指令流程
|
||||
log.info("爱可菲烹饪任务执行完成,结束!!");
|
||||
}
|
||||
}else{
|
||||
log.info("不执行爱可菲烹饪任务");
|
||||
}
|
||||
}else{
|
||||
log.info("爱可菲烹饪任务禁用");
|
||||
}
|
||||
} catch (error) {
|
||||
log.error(`执行过程中发生错误:${error.message}`);
|
||||
} finally {
|
||||
await genshin.returnMainUi();
|
||||
}
|
||||
//main/**======================================================================================
|
||||
|
||||
})();
|
||||
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"manifest_version": 1,
|
||||
"name": "爱可菲自动化",
|
||||
"version": "1.3",
|
||||
"bgi_version": "0.44.0",
|
||||
"description": "爱可菲厨艺机关自动化,请注意说明文件,如有BUG请联系作者QQ:119996800",
|
||||
"tags": ["爱可菲厨艺机关"],
|
||||
"authors": [
|
||||
{
|
||||
"name": "LCB-茶包"
|
||||
}
|
||||
],
|
||||
"settings_ui": "settings.json",
|
||||
"main": "main.js"
|
||||
{
|
||||
"manifest_version": 1,
|
||||
"name": "爱可菲自动化",
|
||||
"version": "1.3",
|
||||
"bgi_version": "0.44.0",
|
||||
"description": "爱可菲厨艺机关自动化,请注意说明文件,如有BUG请联系作者QQ:119996800",
|
||||
"tags": ["爱可菲"],
|
||||
"authors": [
|
||||
{
|
||||
"name": "LCB-茶包"
|
||||
}
|
||||
],
|
||||
"settings_ui": "settings.json",
|
||||
"main": "main.js"
|
||||
}
|
||||
@@ -1,30 +1,30 @@
|
||||
[
|
||||
{
|
||||
"name": "TEAMname",
|
||||
"type": "input-text",
|
||||
"label": "必填!!队伍名称,3号为爱可菲,4号位芭芭拉!"
|
||||
},
|
||||
{
|
||||
"name": "AKF",
|
||||
"type": "select",
|
||||
"label": "选题,默认每天执行,可选是:周一执行,否为不执行",
|
||||
|
||||
"options": [
|
||||
"是",
|
||||
"否",
|
||||
"每天执行"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "actiontime",
|
||||
"type": "input-text",
|
||||
"label": "选填,爱可菲厨艺机关超时默认150秒",
|
||||
"default": "150"
|
||||
},
|
||||
{
|
||||
"name": "nowuid",
|
||||
"type": "input-text",
|
||||
"label": "慎用,禁止特定执行脚本,用 / 隔开,如12345/99999"
|
||||
}
|
||||
|
||||
[
|
||||
{
|
||||
"name": "TEAMname",
|
||||
"type": "input-text",
|
||||
"label": "必填!!队伍名称,3号为爱可菲,4号位芭芭拉!"
|
||||
},
|
||||
{
|
||||
"name": "AKF",
|
||||
"type": "select",
|
||||
"label": "选题,默认每天执行,可选是:周一执行,否为不执行",
|
||||
|
||||
"options": [
|
||||
"是",
|
||||
"否",
|
||||
"每天执行"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "actiontime",
|
||||
"type": "input-text",
|
||||
"label": "选填,爱可菲厨艺机关超时默认150秒",
|
||||
"default": "150"
|
||||
},
|
||||
{
|
||||
"name": "nowuid",
|
||||
"type": "input-text",
|
||||
"label": "慎用,禁止特定执行脚本,用 / 隔开,如12345/99999"
|
||||
}
|
||||
|
||||
]
|
||||
@@ -1,114 +0,0 @@
|
||||
// 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 main() {
|
||||
// 定义变量
|
||||
const name1 = "伪造日志测试";
|
||||
const name2 = "伪造地图追踪.json";
|
||||
|
||||
// 调用 fakeLog 函数,输出 JavaScript 的结尾日志,耗时 1.234 秒
|
||||
const duration1 = 1234; // 1.234 秒
|
||||
await fakeLog(name1, true, false, duration1);
|
||||
|
||||
// 输出地图追踪开始的日志
|
||||
const duration2 = 0; // 地图追踪开始时,耗时为 0
|
||||
await fakeLog(name2, false, true, duration2);
|
||||
|
||||
// 等待5秒
|
||||
await sleep(5000);
|
||||
log.info('模拟地图追踪运行完成')
|
||||
|
||||
// 调用 fakeLog 函数,输出地图追踪结束的日志,耗时 5.000 秒
|
||||
const duration3 = 5000; // 5.000 秒
|
||||
await fakeLog(name2, false, false, duration3);
|
||||
|
||||
// 调用 fakeLog 函数,输出 JavaScript 开始的日志
|
||||
const duration4 = 0; // JS 开始时,耗时为 0
|
||||
await fakeLog(name1, true, true, duration4);
|
||||
}
|
||||
|
||||
// 调用主函数
|
||||
main();
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"manifest_version": 1,
|
||||
"name": "伪造日志测试",
|
||||
"version": "1.0",
|
||||
"bgi_version": "0.44.0",
|
||||
"description": "",
|
||||
"authors": [
|
||||
{
|
||||
"name": "mno"
|
||||
}
|
||||
],
|
||||
"settings_ui": "settings.json",
|
||||
"main": "main.js"
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
[
|
||||
{
|
||||
"name": "operationType",
|
||||
"type": "select",
|
||||
"label": "操作模式(默认:生成路径组文件)",
|
||||
"options": [
|
||||
"生成路径组文件",
|
||||
"执行路径组文件1",
|
||||
"执行路径组文件2",
|
||||
"执行路径组文件3",
|
||||
"输出地图追踪文件"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "excludeTagsForPathGroup1",
|
||||
"type": "input-text",
|
||||
"label": "路径组1要排除的标签(传奇,水免,次数盾或高危)"
|
||||
},
|
||||
{
|
||||
"name": "selectTagsForPathGroup2",
|
||||
"type": "input-text",
|
||||
"label": "路径组2要选择的标签(传奇,水免,次数盾或高危)"
|
||||
},
|
||||
{
|
||||
"name": "selectTagsForPathGroup3",
|
||||
"type": "input-text",
|
||||
"label": "路径组3要选择的标签(传奇,水免,次数盾或高危)"
|
||||
},
|
||||
{
|
||||
"name": "disableAutoPickup",
|
||||
"type": "checkbox",
|
||||
"label": "是否禁用自动拾取(默认不禁用)"
|
||||
},
|
||||
{
|
||||
"name": "disableRouteCdCheck",
|
||||
"type": "checkbox",
|
||||
"label": "是否禁用路线CD检测(默认不禁用)"
|
||||
},
|
||||
{
|
||||
"name": "requiredMonsterCount",
|
||||
"type": "input-text",
|
||||
"label": "目标怪物数量(默认405,必须为0以上整数)"
|
||||
},
|
||||
{
|
||||
"name": "minSecPerMonster",
|
||||
"type": "input-text",
|
||||
"label": "最低秒均(秒均=摩拉/时间,默认0.1)"
|
||||
},
|
||||
{
|
||||
"name": "excludeTagsForAll",
|
||||
"type": "input-text",
|
||||
"label": "全局排除关键词(使用中文分号分隔)"
|
||||
},
|
||||
{
|
||||
"name": "accountName",
|
||||
"type": "input-text",
|
||||
"label": "账户名,用于区分不同的账户"
|
||||
}
|
||||
]
|
||||
@@ -1,21 +0,0 @@
|
||||
一、使用前请在配置中设置要切换的队伍(必填),否则会自动结束任务。
|
||||
|
||||
二、脚本用芭芭拉的攻击动作充能爱可菲厨艺机关,请确保切换的队伍3号位爱可菲,4号位为芭芭拉。
|
||||
|
||||
三、选择“否”为禁用,建议选择周一执行(选择:是),直接加入的调度器就可以,脚本会自动判断是否为星期一从而执行(爱可菲厨艺机关每周10个,周一更新CD)。
|
||||
选择“每天执行”为每次都执行。
|
||||
|
||||
四、脚本会自动判断是否获得10个料理后自动退出,可能有误差,一般60秒完成,最大超时默认100秒,可自己配置。
|
||||
|
||||
五、鉴于有人多个号,不一定每个号都有爱可菲,加入UID禁用模式,把不想执行的UID填入即可,用 / 隔开,如12345/99999。
|
||||
|
||||
六、后言
|
||||
1、测试阶段,如有错误,请QQ:119996800联系反馈。
|
||||
|
||||
七、更新说明
|
||||
v.1.2 20250510 发布
|
||||
|
||||
v.1.3 20250512
|
||||
1、更改UID识别方法。(适配原神UI改变)
|
||||
2、修改超时默认时间。
|
||||
|
||||
Reference in New Issue
Block a user