Uid识别批量改本体API (#3254)

* refactor(ActivitySwitchNotice): 替换OCR UID识别为游戏内UID获取

- 移除uid.js文件中的OCR UID识别功能及相关代码
- 在activity.js中将ocrUID()调用替换为genshin.uid()并添加toMainUi()调用
- 在campaignArea.js中将ocrUID()调用替换为genshin.uid()并添加toMainUi()调用
- 在mapMission.js中将ocrUID()调用替换为genshin.uid()并添加toMainUi()调用
- 在ws.js中将ocrUID()调用替换为genshin.uid()并添加toMainUi()调用
- 在HolyRelics.js中添加genshin.uid()获取并在日志中显示UID信息
- 更新manifest.json版本号从0.1.5到0.1.6
- 更新bgi_version从0.55.0到0.61.0

* refactor(FullyAutoAndSemiAutoTools): 重构UID识别模块并更新依赖版本

- 将uid.js重命名为tool.js并导出相关函数
- 移除旧的OCR UID识别逻辑,改用genshin.uid()方法
- 更新manifest.json中的版本号从0.0.1到0.0.2
- 升级bgi_version从0.54.3到0.61.0
- 修改main.js中的导入语句和UID获取方式
- 在initRecord函数中先调用toMainUi()确保在主界面
- 更新README.md中的文件结构说明

* refactor(SwitchAccountMultipleMode): 重构工具函数模块并更新依赖版本

- 将 uid.js 重命名为 tool.js 并导出所有工具函数
- 移除全局 uidUtil 对象,改为直接导出函数
- 更新 manifest.json 中的版本号至 2.1 和 bgi_version 至 0.61.0
- 修复 UID 比较逻辑,替换 ocrUID 调用为 genshin.uid()
- 清理未使用的 eval 语句和 ocrUID 函数
This commit is contained in:
云端客
2026-05-30 23:20:52 +08:00
committed by GitHub
parent d0f6154123
commit 9c8e5753c2
15 changed files with 96 additions and 316 deletions

View File

@@ -1,10 +1,10 @@
{
"name": "活动期限/周本通知器",
"version": "0.1.5",
"version": "0.1.6",
"description": "",
"settings_ui": "settings.json",
"main": "main.js",
"bgi_version": "0.55.0",
"bgi_version": "0.61.0",
"authors": [
{
"name": "云端客",

View File

@@ -52,7 +52,9 @@ export async function checkHolyRelicsKey(threshold = 400) {
log.debug(`diff:${diff}`) // 记录剩余空间数量
if (diff <= threshold) { // 如果剩余空间小于等于阈值
log.info(`背包圣遗物数量:${count}/${total},相差${diff}个,<=${threshold}个,提醒清理`) // 记录需要清理的信息
await toMainUi()
let uid = await genshin.uid()
log.info(`UID:${uid}\n背包圣遗物数量:${count}/${total},相差${diff}个,<=${threshold}个,提醒清理`) // 记录需要清理的信息
// 发送提醒消息
await sendText(`背包圣遗物 剩余空间不足(设置阈值):${threshold},剩余:${diff},请前往清理!`, "背包圣遗物剩余空间检查") // 发送提醒文本
}

View File

@@ -1,5 +1,4 @@
import {sendNotice,sendText} from "./notice";
import {ocrUID} from "./uid";
const config_name = "config"
const json_path = {
activity: `${config_name}/activity.json`
@@ -466,9 +465,11 @@ async function init() {
*/
export async function activityMain(newActivityNotice = true) {
await init();
await toMainUi()
let uid = await genshin.uid()
const ms = 1000;
await sleep(ms);
let uid = await ocrUID()
let activityData=[]
let activitySetLast = new Set()
try {

View File

@@ -1,6 +1,5 @@
import {findTextAndClick,getDayOfWeek} from "./tool";
import {sendText} from "./notice";
import {ocrUID} from "./uid";
function settingsParseInt(str, defaultValue) {
try {
return str ? parseInt('' + str) : defaultValue;
@@ -147,7 +146,8 @@ export async function campaignAreaMain(openKey = true) {
// 如果有剩余次数,则记录日志并发送通知
if (weekJson.count > 0) {
let uid = await ocrUID()
await toMainUi()
let uid = await genshin.uid()
log.info(`本周剩余消耗减半次数:${weekJson.count}`)
await sendText(`>|本周剩余消耗减半次数:${weekJson.count}`, `UID:${uid}\n秘境征讨`)
}
@@ -183,7 +183,8 @@ export async function dailyCommissionMain(openKey = true) {
if (re.daily.total > re.daily.use
|| re.physical.total > re.physical.use
) {
let uid = await ocrUID()
await toMainUi()
let uid = await genshin.uid()
await sendText(`>|每日委托奖励:${re.daily.use}/${re.daily.total}\n>|原粹树脂消耗:${re.physical.use}/${re.physical.total}`, `UID:${uid}\n每日委托`)
}
}

View File

@@ -1,5 +1,4 @@
import {sendText} from "./notice";
import {ocrUID} from "./uid";
const ocrRegionConfig = {
mapMission: {x: 6, y: 8, width: 395, height: 977},//地图任务识别区域坐标和尺寸
}
@@ -89,7 +88,9 @@ export async function mapMission(list = [], toOpenMap = true) {
log.warn(`未识别到地图任务`)
return
}
const uid = await ocrUID()
await toMainUi()
let uid = await genshin.uid()
let text = ""
keyJsonList.forEach(item => text += "|< " + item.text + " >\n")
await sendText(text, `UID:${uid}\n地图任务`)

View File

@@ -1,114 +0,0 @@
/*
const commonPath = 'assets/'
const commonMap = new Map([
['main_ui', {
path: `${commonPath}`,
name: 'paimon_menu',
type: '.png',
}],
])
const genshinJson = {
width: 1920,//genshin.width,
height: 1080,//genshin.height,
}
/!**
* 根据键值获取JSON路径
* @param {string} key - 要查找的键值
* @returns {any} 返回与键值对应的JSON路径值
*!/
function getJsonPath(key) {
return commonMap.get(key); // 通过commonMap的get方法获取指定键对应的值
}
*/
import {toMainUi,isInMainUI} from "./tool"
export function saveOnlyNumber(str) {
str = str ? str : '';
// 使用正则表达式匹配字符串中的所有数字
// \d+ 匹配一个或多个数字
// .join('') 将匹配到的数字数组连接成一个字符串
// parseInt 将连接后的字符串转换为整数
return parseInt(str.match(/\d+/g).join(''));
}
export async function ocrUID() {
let uid_json = {
x: 1683,
y: 1051,
width: 234,
height: 28,
}
let recognitionObjectOcr = RecognitionObject.Ocr(uid_json.x, uid_json.y, uid_json.width, uid_json.height);
let region3 = captureGameRegion()
try {
let res = region3.find(recognitionObjectOcr);
log.debug(`[OCR识别UID]识别结果: ${res.text}, 原始坐标: x=${res.x}, y=${res.y},width:${res.width},height:${res.height}`);
//只保留数字
let uid
try {
uid = saveOnlyNumber(res.text)
} catch (e) {
log.warn(`识别uid异常{ket}`, e.message)
uid = 0
}
log.debug(`[OCR识别UID]识别结果: {uid}`, uid);
return uid
} finally {
region3.Dispose()
}
}
export async function compareUid(UID = settings.uid) {
let uid = await ocrUID()
let setUid = 0
try {
setUid = saveOnlyNumber(UID)
} catch (e) {
// log.warn(`UID未设置`)
}
let compare = uid === setUid
if (compare) {
log.debug(`[OCR识别UID]识别结果: {uid} 与设置UID相同`, uid);
}
return compare
}
export async function checkUid() {
let reJson = {
inMainUI: false,
isUid: false
}
if (isInMainUI()) {
reJson.isUid = await compareUid()
}
return reJson
}
export async function check() {
let check = false
if (settings.uid) {
try {
await toMainUi();
} catch (e) {
log.warn("多次尝试返回主界面失败")
}
let checkJson = await checkUid()
if ((!checkJson.inMainUI) && (!checkJson.isUid)) {
//尝试直接识别
checkJson.isUid = await compareUid()
}
check = checkJson.isUid
}
return check
}
// export {
// // toMainUi,
// // isInMainUI,
// checkUid,
// ocrUID,
// check,
// compareUid,
// }

View File

@@ -1,4 +1,3 @@
import {ocrUID} from "./uid";
const actionType = Object.freeze({
send_private_msg: 'send_private_msg',//私聊
@@ -78,7 +77,8 @@ async function buildInitConfigSettings() {
*/
async function init() {
await buildInitConfigSettings()
const uid = await ocrUID()
await toMainUi()
let uid = await genshin.uid()
local.token = await getToken()
local.uid = uid
if (settings.wsNoticeType === "自定义通知") {

View File

@@ -71,7 +71,7 @@ FullyAutoAndSemiAutoTools/
├── utils/
│ ├── SwitchTeam.js # 队伍切换核心
│ ├── cron.js # Cron 解析工具
│ └── uid.js # UID 识别模块
│ └── tool.js # UID 识别模块
├── pathing/ # ★ 所有路径文件目录(需符号链接)
├── SymLink.bat # 一键创建 pathing 链接
├── main.js # 主程序入口(已重构路径扫描)

View File

@@ -1,3 +1,5 @@
import {toMainUi} from "./utils/tool";
let manifest_json = "manifest.json";
let manifest = undefined
let configSettings = undefined
@@ -1391,8 +1393,9 @@ function getTimeDifference(startTime, endTime) {
* 同时会检查记录列表中是否存在相同UID的最新记录并进行更新
*/
async function initRecord() {
await toMainUi()
// 设置记录的唯一标识符通过OCR技术获取
Record.uid = await uidUtil.ocrUID()
Record.uid = await genshin.uid()
// 设置记录的时间戳为当前时间
Record.timestamp = Date.now()
// 获取并设置调整后的日期数据

View File

@@ -1,8 +1,8 @@
{
"manifest_version": 1,
"name": "全自动或半自动工具箱",
"version": "0.0.1",
"bgi_version": "0.54.3",
"version": "0.0.2",
"bgi_version": "0.61.0",
"key": "PGCSBY37NJA",
"description": "",
"saved_files": [],

View File

@@ -0,0 +1,58 @@
const commonPath = 'Assets/RecognitionObject/'
const commonMap = new Map([
['main_ui', {
path: `${commonPath}`,
name: 'paimon_menu',
type: '.png',
}],
])
const genshinJson = {
width: 1920,//genshin.width,
height: 1080,//genshin.height,
}
/**
* 根据键值获取JSON路径
* @param {string} key - 要查找的键值
* @returns {any} 返回与键值对应的JSON路径值
*/
export function getJsonPath(key) {
return commonMap.get(key); // 通过commonMap的get方法获取指定键对应的值
}
// 判断是否在主界面的函数
export const isInMainUI = () => {
// let name = '主界面'
let main_ui = getJsonPath('main_ui');
// 定义识别对象
let paimonMenuRo = RecognitionObject.TemplateMatch(
file.ReadImageMatSync(`${main_ui.path}${main_ui.name}${main_ui.type}`),
0,
0,
genshinJson.width / 3.0,
genshinJson.width / 5.0
);
let captureRegion = captureGameRegion();
let res = captureRegion.find(paimonMenuRo);
captureRegion.Dispose()
return !res.isEmpty();
};
export async function toMainUi() {
let ms = 1000
let index = 1
await sleep(ms);
while (!isInMainUI()) {
await sleep(ms);
await genshin.returnMainUi(); // 如果未启用,则返回游戏主界面
await sleep(ms);
if (index > 3) {
throw new Error(`多次尝试返回主界面失败`);
}
index += 1
}
}

View File

@@ -1,142 +0,0 @@
const commonPath = 'Assets/RecognitionObject/'
const commonMap = new Map([
['main_ui', {
path: `${commonPath}`,
name: 'paimon_menu',
type: '.png',
}],
])
const genshinJson = {
width: 1920,//genshin.width,
height: 1080,//genshin.height,
}
/**
* 根据键值获取JSON路径
* @param {string} key - 要查找的键值
* @returns {any} 返回与键值对应的JSON路径值
*/
function getJsonPath(key) {
return commonMap.get(key); // 通过commonMap的get方法获取指定键对应的值
}
function saveOnlyNumber(str) {
str = str ? str : '';
// 使用正则表达式匹配字符串中的所有数字
// \d+ 匹配一个或多个数字
// .join('') 将匹配到的数字数组连接成一个字符串
// parseInt 将连接后的字符串转换为整数
return parseInt(str.match(/\d+/g).join(''));
}
async function ocrUID() {
let uid_json = {
x: 1683,
y: 1051,
width: 234,
height: 28,
}
let recognitionObjectOcr = RecognitionObject.Ocr(uid_json.x, uid_json.y, uid_json.width, uid_json.height);
let region3 = captureGameRegion()
let res = region3.find(recognitionObjectOcr);
log.debug(`[OCR识别UID]识别结果: ${res.text}, 原始坐标: x=${res.x}, y=${res.y},width:${res.width},height:${res.height}`);
//只保留数字
let uid
try {
uid = saveOnlyNumber(res.text)
} catch (e) {
log.warn(`UID未设置`)
uid = 0
} finally {
region3.dispose()
}
log.debug(`[OCR识别UID]识别结果: {uid}`, uid);
return uid
}
// 判断是否在主界面的函数
const isInMainUI = () => {
// let name = '主界面'
let main_ui = getJsonPath('main_ui');
// 定义识别对象
let paimonMenuRo = RecognitionObject.TemplateMatch(
file.ReadImageMatSync(`${main_ui.path}${main_ui.name}${main_ui.type}`),
0,
0,
genshinJson.width / 3.0,
genshinJson.width / 5.0
);
let captureRegion = captureGameRegion();
let res = captureRegion.find(paimonMenuRo);
captureRegion.Dispose()
return !res.isEmpty();
};
async function toMainUi() {
let ms = 1000
let index = 1
await sleep(ms);
while (!isInMainUI()) {
await sleep(ms);
await genshin.returnMainUi(); // 如果未启用,则返回游戏主界面
await sleep(ms);
if (index > 3) {
throw new Error(`多次尝试返回主界面失败`);
}
index += 1
}
}
async function compareUid(UID = settings.uid) {
let uid = await ocrUID()
let setUid = 0
try {
setUid = saveOnlyNumber(UID)
} catch (e) {
// log.warn(`UID未设置`)
}
let compare = uid === setUid
if (compare) {
log.info(`[OCR识别UID]识别结果: {uid} 与设置UID相同`, uid);
}
return compare
}
async function checkUid() {
let reJson = {
inMainUI: false,
isUid: false
}
if (isInMainUI()) {
reJson.isUid = await compareUid()
}
return reJson
}
async function check() {
let check = false
if (settings.uid) {
try {
await toMainUi();
} catch (e) {
log.warn("多次尝试返回主界面失败")
}
let checkJson = await checkUid()
if ((!checkJson.inMainUI) && (!checkJson.isUid)) {
//尝试直接识别
checkJson.isUid = await compareUid()
}
check = checkJson.isUid
}
return check
}
this.uidUtil = {
toMainUi,
isInMainUI,
checkUid,
ocrUID,
check,
compareUid,
}

View File

@@ -1,5 +1,7 @@
// ======================================================
// 切换账号OCR模式
import {check} from "./utils/tool";
const author = "彩虹QQ人";
// 图像识别资源
const pm_out = {
@@ -78,7 +80,7 @@ const login_verification = {
// 判断temporaryAccount是否为空如果为空则赋值
const Account = settings.temporaryAccount || "否";
eval(file.readTextSync('utils/uid.js'))
// 点击区域中心
async function clickCenter(x, y, width, height) {
@@ -566,7 +568,7 @@ async function waitForOcrMatch(target, rect = null, threshold = null, timeout =
// ======================================================
// Main flow
if (await uidUtil.check()) {
if (await check()) {
log.info("当前UID与设置UID相同无需切换账号。");
return
}

View File

@@ -1,8 +1,8 @@
{
"manifest_version": 1,
"name": "切换账号多模式",
"version": "2.1",
"bgi_version": "0.57.0",
"version": "2.1.1",
"bgi_version": "0.61.0",
"description": "多种模式的切换账号有下拉列表、填写账号密码OCR操作或键鼠操作目前支持B服/国际服但不完整\n免责申明所有的账号密码均保存在本地请使用者妥善保管账号密码请勿外泄账号密码。若因使用此脚本导致的账号泄露、封禁问题与脚本作者无关。",
"tags": [
"切换账号",

View File

@@ -16,11 +16,11 @@ const genshinJson = {
* @param {string} key - 要查找的键值
* @returns {any} 返回与键值对应的JSON路径值
*/
function getJsonPath(key) {
export function getJsonPath(key) {
return commonMap.get(key); // 通过commonMap的get方法获取指定键对应的值
}
function saveOnlyNumber(str) {
export function saveOnlyNumber(str) {
str = str ? str : '';
// 使用正则表达式匹配字符串中的所有数字
// \d+ 匹配一个或多个数字
@@ -29,32 +29,8 @@ function saveOnlyNumber(str) {
return parseInt(str.match(/\d+/g).join(''));
}
async function ocrUID() {
let uid_json = {
x: 1683,
y: 1051,
width: 234,
height: 28,
}
let recognitionObjectOcr = RecognitionObject.Ocr(uid_json.x, uid_json.y, uid_json.width, uid_json.height);
let region3 = captureGameRegion()
let res = region3.find(recognitionObjectOcr);
log.info(`[OCR识别UID]识别结果: ${res.text}, 原始坐标: x=${res.x}, y=${res.y},width:${res.width},height:${res.height}`);
//只保留数字
let uid
try {
uid = saveOnlyNumber(res.text)
} catch (e) {
log.warn(`UID未设置`)
uid = 0
}
log.info(`[OCR识别UID]识别结果: {uid}`, uid);
region3.dispose()
return uid
}
// 判断是否在主界面的函数
const isInMainUI = () => {
export const isInMainUI = () => {
// let name = '主界面'
let main_ui = getJsonPath('main_ui');
// 定义识别对象
@@ -71,7 +47,7 @@ const isInMainUI = () => {
return !res.isEmpty();
};
async function toMainUi() {
export async function toMainUi() {
let ms = 1000
let index = 1
await sleep(ms);
@@ -87,8 +63,8 @@ async function toMainUi() {
}
async function compareUid(UID = settings.uid) {
let uid = await ocrUID()
export async function compareUid(UID = settings.uid) {
let uid = await genshin.uid()
let setUid = 0
try {
setUid = saveOnlyNumber(UID)
@@ -102,7 +78,7 @@ async function compareUid(UID = settings.uid) {
return compare
}
async function checkUid() {
export async function checkUid() {
let reJson = {
inMainUI: false,
isUid: false
@@ -113,7 +89,7 @@ async function checkUid() {
return reJson
}
async function check() {
export async function check() {
let check = false
if (settings.uid) {
try {
@@ -131,11 +107,3 @@ async function check() {
return check
}
this.uidUtil = {
toMainUi,
isInMainUI,
checkUid,
ocrUID,
check,
compareUid,
}