mirror of
https://github.com/babalae/bettergi-scripts-list.git
synced 2026-03-16 03:33:25 +08:00
* feat(ActivitySwitchNotice): 添加地图任务识别功能 - 新增 mapMission 工具模块用于OCR地图任务识别 - 在初始化工具列表中加入 mapMission 模块 - 修改 main 函数增加异常处理和开关控制逻辑 - 优化代码格式和缩进一致性 - 添加地图任务OCR识别区域配置参数 * feat(ActivitySwitchNotice): 添加地图任务识别功能并优化配置管理 - 实现地图任务识别功能,支持伴月纪闻任务和每日委托奖励识别 - 新增initSettings函数用于统一管理配置文件读取和初始化 - 在settings.json中添加地图任务相关的多选框配置选项 - 更新manifest.json版本至0.0.8并添加最低BGI版本要求 - 重构ocrMapMission函数以支持多任务名称匹配 - 添加openMap和mapMission工具函数用于地图操作和任务识别 - 优化通知系统,移除不必要的参数并完善错误处理 - 调整设置界面布局,添加分隔符提升用户体验 * feat(map): 添加地图任务识别功能 - 实现多复选框配置映射表获取功能 - 添加根据复选框名称获取对应值的方法 - 重构OCR地图任务识别函数,优化参数和错误处理 - 集成UID识别并在通知中显示 - 更新地图任务识别流程和结果显示格式 - 添加地图任务识别数量统计日志 - 在README中更新版本历史记录 * feat(map): 添加地图任务识别功能 - 实现多复选框配置映射表获取功能 - 添加根据复选框名称获取对应值的方法 - 重构OCR地图任务识别函数,优化参数和错误处理 - 集成UID识别并在通知中显示 - 更新地图任务识别流程和结果显示格式 - 添加地图任务识别数量统计日志 - 在README中更新版本历史记录 * feat(ActivitySwitchNotice): 添加新的活动任务选项并设置默认值 - 添加探索派遣奖励选项 - 添加豪斗旅纪奖励选项 - 设置伴月纪闻任务为默认选项之一 - 设置探索派遣奖励为默认选项之一 - 设置每日委托奖励为默认选项之一 - 更新配置结构以支持多选默认值
活动期限/周本通知器
项目概述
这是一个用于《原神》游戏的自动化脚本工具,主要功能是自动检测游戏内活动的剩余时间,并在活动即将结束时/每周指定日期自动提醒征讨领域减半剩余次数发送通知提醒玩家。
功能特性
- ✅ 自动返回游戏主界面并打开活动页面
- ✅ OCR识别活动列表和剩余时间
- ✅ 自动滚动浏览所有活动页面
- ✅ 智能解析剩余时间(支持"22天14小时"等格式)
- ✅ 可配置的通知阈值(默认8760小时内结束的活动)
- ✅ 支持指定特定活动进行监控
- ✅ 支持活动黑名单过滤功能(0.0.5版本,新增支持为黑名单活动设置特定条件,只有满足条件时才过滤,注:特定条件为空默认没有条件)
- ✅ 防重复检测机制
- ✅ 异常处理和错误恢复
- ✅ 自动提醒征讨领域减半剩余次数(默认
周日提醒可配置) - ✅ 支持独立通知功能(
0.0.4版本新增 因BGI不支持WebSocket,需搭配bettergi-scripts-tools+开启JS HTTP 权限使用)前往bettergi-scripts-tools部署
核心思维导图
整体架构流程图
graph TD
A[主程序入口 main.js] --> B[初始化 init]
B --> C[加载工具模块]
C --> D[uid.js, ws.js, notice.js, campaignArea.js, activity.js]
D --> E[读取 manifest.json]
E --> F[检查是否返回主界面]
F --> G[toMainUi]
G --> H[执行主功能 main]
H --> I[每日委托检查]
I --> J[征讨领域检查]
J --> K[活动页面扫描]
K --> L[返回主界面]
L --> M[程序结束]
活动扫描核心流程
graph TD
A[activityMain函数] --> B[初始化配置]
B --> C[打开活动页面 F5]
C --> D[滚动到页面顶部]
D --> E[开始逐页扫描]
E --> F[OCR识别活动列表]
F --> G{是否有活动?}
G -->|否| H[结束扫描]
G -->|是| I[遍历当前页活动]
I --> J[白名单过滤]
J --> K{是否在白名单?}
K -->|是| L[继续处理]
K -->|否| M[根据关系模式判断]
M --> N{relationship=true?}
N -->|是| O[跳过]
N -->|否| L[继续处理]
L --> P[黑名单过滤]
P --> Q{是否在黑名单?}
Q -->|是| R[条件检测]
Q -->|否| S[点击活动]
R --> T{条件满足?}
T -->|是| U[跳过]
T -->|否| S[点击活动]
S --> V[OCR识别剩余时间]
V --> W[解析时间转小时]
W --> X[应用阈值过滤]
X --> Y[存储活动信息]
Y --> Z[向下滚动一页]
Z --> E
H --> AA[过滤符合条件活动]
AA --> BB[按剩余时间排序]
BB --> CC[发送通知]
CC --> DD[流程结束]
征讨领域提醒流程
graph TD
A[campaignAreaMain函数] --> B[获取当前星期]
B --> C{是否为提醒日?}
C -->|否| D[结束函数]
C -->|是| E[打开冒险之书 F1]
E --> F[点击秘境坐标]
F --> G[点击征讨领域坐标]
G --> H[OCR识别周次数]
H --> I{剩余次数>0?}
I -->|否| J[结束函数]
I -->|是| K[发送通知]
K --> L[流程结束]
通知发送机制
graph TD
A[sendNotice函数] --> B[检查通知类型配置]
B --> C[获取通知模式]
C --> D{BGI通知?}
D -->|是| E[notification.send]
C --> F{独立通知?}
F -->|是| G[wsUtil.sendText]
C --> H{两者都发送?}
H -->|是| E
H -->|是| G
E --> I[发送完成]
G --> I
I --> J[流程结束]
配置解析流程
graph TD
A[配置初始化] --> B[parseWhiteActivity]
A --> C[parseBlackActivity]
B --> D[白名单列表解析]
C --> E[黑名单条件解析]
D --> F[建立whiteActivityNameList]
E --> G[建立blackActivityMap]
F --> H[设置relationship逻辑]
G --> H
H --> I[配置完成]
核心组件依赖关系
graph LR
subgraph "工具模块"
A[activity.js - 活动处理]
B[notice.js - 通知发送]
C[campaignArea.js - 征讨领域]
D[ws.js - WebSocket通信]
E[uid.js - UID识别]
end
subgraph "主控模块"
F[main.js - 主入口]
G[settings.json - 配置]
end
F --> A
F --> B
F --> C
A --> B
A --> D
A --> E
C --> B
C --> E
G -.-> A
G -.-> B
G -.-> C
G -.-> D
逻辑流程
sequenceDiagram
autonumber
participant Config as 配置初始化
participant Parser as 解析器
participant ActivityMgr as 活动管理
participant OCRSvc as OCR 服务
participant Filter as 过滤决策
participant Notification as 通知服务
Config->>Parser: 读取 settings.whiteActivityNameList
Parser->>Parser: parseWhiteActivity(text)
Parser-->>Config: 返回 whiteActivityNameList
Config->>Parser: 读取 settings.blackActivity
Parser->>Parser: parseBlackActivity(text, excludeList)
Parser-->>Config: 返回 blackActivityMap
Note over ActivityMgr: 遍历所有候选活动
loop 每个候选活动
Note over ActivityMgr: 检查白名单匹配
alt 白名单不为空
ActivityMgr->>ActivityMgr: 检查活动名是否包含白名单关键词
alt 包含关键词
ActivityMgr-->>ActivityMgr: 标记为白名单活动
else 不包含关键词
alt relationship为false(或关系)
ActivityMgr-->>ActivityMgr: 继续处理
else relationship为true(与关系)
ActivityMgr-->>ActivityMgr: 跳过该活动
end
end
end
Note over ActivityMgr: 检查黑名单匹配
alt 黑名单不为空
ActivityMgr->>Filter: 是否匹配黑名单?
Filter->>Parser: getMapByKey(blackActivityMap, 活动名, reverseMatch=true)
Parser-->>Filter: 返回条件列表
Filter->>OCRSvc: 用 OCR 校验条件(如剩余时间、文本等)
OCRSvc-->>Filter: 返回条件满足情况
alt 任一条件满足
Filter-->>ActivityMgr: 跳过该活动
else 所有条件均不满足
Filter-->>ActivityMgr: 保留该活动
end
else 匹配但无条件
Filter-->>ActivityMgr: 直接跳过该活动
else 未匹配黑名单
Filter-->>ActivityMgr: 保留该活动
end
end
Note over ActivityMgr: 活动筛选完成后
ActivityMgr->>ActivityMgr: 根据whiteActivityNameList和relationship进行二次筛选
alt relationship为true(与关系)
ActivityMgr->>ActivityMgr: 同时满足剩余时间阈值和白名单条件
else relationship为false(或关系)
ActivityMgr->>ActivityMgr: 满足剩余时间阈值或白名单任一条件
end
ActivityMgr->>ActivityMgr: 检查剩余时间阈值
ActivityMgr->>Notification: 发送符合条件的活动通知
Notification-->> ActivityMgr: 通知发送完成
用户使用指南
快速开始
1. 安装与配置
- 确保游戏分辨率为 1920×1080(推荐分辨率)
- 将脚本导入到 BetterGI 脚本管理器中
- 在脚本设置界面进行个性化配置
2. 基础设置
在 settings.json 中可以配置以下参数:
| 设置项 | 说明 | 默认值 | 开放 |
|---|---|---|---|
toMainUi |
执行前是否自动返回游戏主界面 | true | v |
noticeType |
通知模式(默认BGI通知-使用独立通知需要开启JS HTTP权限) | BGI通知 | v |
relationship |
剩余时间与白名单启用和关系(默认或关系) |
false | v |
whiteActivityNameList |
白名单活动名称(用|分隔) | 空(监控所有活动) | v |
blackActivity |
黑名单活动名称(用 | 分隔)- 支持条件语法:活动名-条件1,条件2 | 空(无黑名单活动) |
notifyHoursThreshold |
通知时间阈值(小时) | 8760(365天) | v |
activityKey |
打开活动页面的快捷键 | F5 | v |
toTopCount |
滑动到顶最大尝试次数 | 10 | x |
scrollPageCount |
滑动次数/页 | 4 | x |
campaignAreaKey |
打开征讨领域页面的快捷键 | F1 | v |
campaignAreaReminderDay |
周本提醒日(0-6,0=周日,1=周一,2=周二,3=周三,4=周四,5=周五,6=周六) | 0 | v |
ws_proxy_url |
WebSocket代理URL(独立通知配置) | http://127.0.0.1:8081/ws-proxy/message/send | v |
ws_url |
WebSocket客户端 URL(独立通知配置) | ws://127.0.0.1:8080/ | v |
ws_token |
WebSocket客户端 token(独立通知配置) | 空 | v |
action |
发送类型(私聊/群聊) (独立通知配置) | 私聊 | v |
send_id |
发送ID(群号或QQ号,对应发送类型) (独立通知配置) | 空 | v |
at_list |
@某人列表使用,隔开(QQ号) (独立通知配置) | 空 | v |
使用流程
自动模式(推荐)
- 启动脚本后,程序会自动:
- 检测当前是否在游戏主界面
- 如未在主界面,自动返回主界面
- 按设定的快捷键打开活动页面
- 开始扫描所有活动
手动模式
- 关闭
toMainUi选项 - 确保游戏处于主界面状态
- 启动脚本开始扫描
功能详解
活动筛选
- 全部活动监控:
whiteActivityNameList保持空值,监控所有有剩余时间的活动 - 指定活动监控:填写活动关键词,如
海灯节\|盛典,只监控包含这些关键词的活动 - 黑名单过滤:blackActivity 可以设置不想接收提醒的活动名称,多个活动用|分隔
- 条件黑名单过滤:支持条件语法 活动名-条件1,条件2,只有当活动满足指定条件时才过滤
使用示例
普通黑名单: "活动A|活动B"
条件黑名单: "活动A-已完成|活动B-条件1,条件2"
混合使用: "活动A|活动C-已完成,已领取"
时间通知机制
- 默认监控所有活动(
notifyHoursThreshold=8760小时) - 可设置阈值,如设置为24,则只通知剩余时间≤24小时的活动
- 即将结束(24小时内)的活动会在通知中标记
<即将结束>
逻辑关系配置
relationship为false(默认):满足"剩余时间阈值"或"白名单活动"任一条件即发送通知relationship为true:必须同时满足"剩余时间阈值"和"白名单活动"两个条件才发送通知
智能防重复
- 自动识别已扫描过的活动页面
- 防止因页面滚动不准确造成的重复识别
- 自动判断是否已滚动到页面底部
独立通知配置(0.0.4版本新增)
配置项说明
-
noticeType:BGI通知: 使用 BetterGI 内置通知独立通知: 通过 WebSocket 发送通知独立通知和BGI通知: 同时使用两种方式
-
WebSocket 配置:
ws_proxy_url: WebSocket 代理 URL,默认为http://127.0.0.1:8081/ws-proxy/message/sendws_url: WebSocket 客户端 URL,默认为ws://127.0.0.1:8080/ws_token: WebSocket 客户端认证令牌(可选)
-
发送配置:
action: 发送类型,可选私聊或群聊send_id: 根据action类型填写群号或 QQ 号at_list: @ 某人列表,使用逗号分隔多个 QQ 号
使用要求
- 开启权限: 需要开启 JS HTTP 权限才能使用独立通知功能
- 配置服务: 需要搭建相应的 WebSocket 服务和代理服务器
- 网络连接: 确保能够连接到配置的 WebSocket 服务器
配置示例
{
"noticeType": "独立通知",
"ws_proxy_url": "http://127.0.0.1:8081/bgi/ws-proxy/message/send",
"ws_url": "ws://127.0.0.1:8080/",
"action": "群聊",
"send_id": "123456789",
"at_list": "987654321,111222333"
}
部署 bettergi-scripts-tools
1.windows exe 直接运行
前往 release 下载 带windows的zip包解压运行.exe文件即可
2.java
前往 release 下载 jar包
java -jar xxxx.jar
3.部署docker
docker pull ghcr.io/kirito520asuna/bettergi-scripts-tools:latest
docker run -d -p 8081:8081 -v /path/to/application-prod.yml:/app/application-prod.yml --name bettergi-scripts-tools ghcr.io/kirito520asuna/bettergi-scripts-tools:latest
注意事项
使用环境要求
- ✅ 游戏分辨率为 1920×1080(最佳兼容性)
- ✅ 游戏处于前台运行状态
- ✅ 活动页面可通过设置的快捷键正常打开
运行期间注意事项
- 🚫 运行期间请勿手动操作鼠标
- 🚫 避免切换窗口或最小化游戏
- ⚠️ 如遇异常可重新启动脚本
高级配置
自定义快捷键
如活动页面不是F5打开,可在 activityKey 中修改为对应按键。
如冒险之书页面不是F1打开,可在 campaignAreaKey 中修改为对应按键。
时间阈值设置
根据个人需求设置 notifyHoursThreshold:
- 24:只关注24小时内结束的活动
- 168:关注一周内结束的活动
- 720:关注一个月内结束的活动
独立通知配置
如果需要使用独立通知功能(如发送到QQ群聊),需要:
- 开启JS HTTP权限
- 配置WebSocket相关参数
- 设置发送类型和ID
输出示例
通知消息格式如下:
原神活动剩余时间提醒:
> 海灯节庆典 剩余时间:3天14小时<还剩 86 小时>
> 风花节活动 剩余时间:1天5小时<还剩 29 小时><即将结束>
文件结构
ActivitySwitchNotice/
├── utils/
│ ├── activity.js # 核心活动处理逻辑
│ ├── campaignArea.js # 征讨领域提醒功能
│ ├── notice.js # 通知发送功能
│ └── ws.js # WebSocket通知功能
├── main.js # 主入口文件
├── manifest.json # 插件配置文件
├── settings.json # 用户设置界面定义
└── README.md # 说明文档
核心模块
activity.js - 活动处理核心
主要包含以下功能函数:
scrollPage()- 页面滚动基础函数scrollPagesByActivity()- 按页滚动活动列表scrollPagesByActivityToTop()- 滚动到活动列表顶部parseRemainingTimeToHours()- 解析剩余时间文本为小时数OcrKey()- OCR识别剩余时间activityMain()- 主流程控制函数
notice.js - 通知模块
sendNotice()- 发送活动提醒通知,按剩余时间排序sendText()- 发送普通通知
campaignArea.js - 征讨领域模块
ocrWeeklyCount()- OCR识别征讨领域周次数getDayOfWeek()- 获取当前星期信息campaignAreaMain()- 征讨领域提醒主函数
ws.js - WebSocket通知模块
send()- 发送WebSocket消息sendText()- 发送文本消息
配置选项
在 settings.json 中可配置以下参数:
| 配置项 | 类型 | 说明 |
|---|---|---|
toMainUi |
Boolean | 是否先返回主界面再执行 |
noticeType |
String | 通知模式(BGI通知/独立通知/两者都发送) |
relationship |
Boolean | 剩余时间与白名单启用和关系(默认或关系) |
whiteActivityNameList |
String | 白名单活动名称(用|分隔) |
blackActivity |
String | 黑名单活动名称(用|分隔)- 支持条件语法:活动名-条件1,条件2 |
notifyHoursThreshold |
Number | 通知阈值(小时) |
activityKey |
String | 打开活动页面的快捷键 |
toTopCount |
Number | 滑动到顶最大尝试次数 |
scrollPageCount |
Number | 滑动次数/页 |
campaignAreaKey |
String | 打开冒险之书页面的快捷键 |
campaignAreaReminderDay |
Number | 周本提醒日(0-6,0=周日,1=周一,2=周二,3=周三,4=周四,5=周五,6=周六) |
ws_proxy_url |
String | WebSocket代理URL(独立通知配置) |
ws_url |
String | WebSocket客户端 URL(独立通知配置) |
ws_token |
String | WebSocket客户端 token(独立通知配置) |
action |
String | 发送类型(私聊/群聊)(独立通知配置) |
send_id |
String | 发送ID(群号或QQ号,对应发送类型) (独立通知配置) |
at_list |
String | @某人列表使用,隔开(QQ号) (独立通知配置) |
工作原理
- 自动返回游戏主界面
- 检查是否为设置的提醒日(默认周日),如果是则执行征讨领域提醒功能
- 按配置快捷键打开活动页面
- 滚动到活动列表顶部
- 逐页扫描所有活动
- OCR识别每个活动的剩余时间
- 解析时间为小时数并过滤(包括黑名单过滤)
- 发送符合条件的活动提醒
注意事项
- 请确保游戏分辨率为1920×1080以获得最佳效果
- 脚本运行期间请勿操作鼠标
- 某些特殊活动可能无法正确识别剩余时间
- 建议在游戏空闲时运行此脚本
版本历史
0.0.8 (2026-01-22)
0.0.7 (2026-01-19)
- 新增每日委托提醒
0.0.6 (2026-01-06)
0.0.5 (2026-01-04)
- 性能优化:优化滚动到顶部算法,减少页面滚动次数,提升初始化效率
- 功能增强:新增条件黑名单过滤机制,支持基于活动状态的动态过滤策略
- 代码重构:新增
parseBlackActivity函数,实现黑名单配置的结构化解析 - 架构改进:重构黑名单匹配逻辑,引入条件匹配引擎,支持多条件复合判断
- 数据结构优化:引入
blackActivityMap配置项,使用 Map 数据结构提升查找性能 - 逻辑优化:增强活动过滤算法,集成条件匹配验证机制
- 初始化流程:重构配置加载流程,新增 init 函数统一处理配置项初始化
- 文档完善:更新配置项文档,补充条件黑名单语法说明
0.0.4 (2026-01-01)
- 新增 独立通知配置功能,支持通过 WebSocket 发送通知
- 新增
ws.js模块,实现 WebSocket 通知功能 - 新增
noticeType配置选项,用于选择通知模式 - 新增
ws_proxy_url、ws_url、ws_token配置选项 - 新增
action、send_id、at_list配置选项用于发送设置
0.0.3 (2025-12-29)
- 修复 修复了活动过滤逻辑问题,将
activityNameList更改为whiteActivityNameList以保持一致 - 新增 黑名单与白名单的互斥过滤机制,黑名单中剔除白名单
- 新增 在配置中增加了
relationship参数,用于控制剩余时间与白名单活动的逻辑关系 - 新增 支持剩余时间和白名单的"与"关系和"或"关系配置
- 新增 标记界面显示
已完成的活动
0.0.2 (2025-12-22)
- 新增 征讨领域周次数提醒功能
- 新增 campaignArea.js 模块,包含征讨领域相关功能
- 新增
campaignAreaKey配置选项,用于自定义冒险之书页面快捷键 - 新增
campaignAreaReminderDay配置选项,用于配置提醒日 - 改进 增强滚动到顶部功能的稳定性
- 新增 活动黑名单过滤功能,支持通过
blackActivityNameList配置项排除不关心的活动 - 新增 特殊活动时间格式支持,针对"砺行修远"等活动提供周数显示
- 新增 额外OCR识别支持,可识别特定活动的附加信息(如"本周进度")
- 改进 活动过滤逻辑,增强黑名单匹配准确性
- 改进 通知显示格式,增加活动描述信息展示
- 修复 若干已知问题,提升脚本稳定性
0.0.1 (2025-12-21)
- 新增 活动期限检测与通知功能
- 新增 OCR识别活动列表和剩余时间
- 新增 自动滚动浏览所有活动页面
- 新增 智能解析剩余时间(支持"22天14小时"等格式)
- 新增 可配置的通知阈值功能
- 新增 指定特定活动监控功能
- 新增 防重复检测机制
- 新增 异常处理和错误恢复机制
其它
作者:云端客
脚本反馈邮箱:doutianmianxia@qq.com


