Files
bettergi-scripts-list/repo/js/ActivitySwitchNotice
云端客 37ff6a6e5b 【0.0.5】活动期限/周本通知器 (#2618)
* feat(ActivitySwitchNotice): 支持解析包含分钟的时间文本

- 添加对分钟单位的解析支持,使用正则表达式匹配"分钟"
- 将天数、小时数、分钟数都改为浮点数解析以支持小数
- 添加数值非负验证,确保解析结果不为负数
- 将分钟转换为小时进行统一计算
- 对结果进行四舍五入取整
- 修复OCR识别结果不完整的问题,自动补全"小时"和"分钟"单位

* feat(activity): 添加活动黑名单条件过滤功能

- 新增 parseWhiteActivity 和 parseBlackActivity 函数,支持解析黑白名单格式
- 实现黑名单条件匹配机制,支持活动名-条件1,条件2的语法格式
- 添加 getMapByKey 函数支持反向匹配功能
- 更新配置初始化流程,添加 init 函数处理黑名单配置
- 改进活动过滤逻辑,支持条件匹配检查
- 更新 README.md 文档说明新的黑名单条件语法
- 修改设置项名称从 blackActivityNameList 到 blackActivity
- 优化配置项标签说明,添加条件语法使用说明
- 添加版本历史记录 0.0.5 版本更新内容

* refactor: 重构黑名单过滤机制,新增条件匹配功能

* feat(ActivitySwitchNotice): 添加manifest.json读取和版本日志功能

- 添加manifest.json文件读取功能
- 将初始化日志从info级别调整为debug级别
- 在启动时输出版本信息日志
- 初始化manifest变量以存储应用清单数据

* chore(docs): 更新版本发布日期

- 修正版本 0.0.5 的发布日期从 2026-01-03 为 2026-01-04

* chore(ActivitySwitchNotice): 更新版本号并清理manifest配置

- 将版本号从 0.0.4 更新到 0.0.5
- 移除了 http_allowed_urls 中多余的逗号,修复了JSON格式
- 保持了原有的依赖配置和URL访问权限设置

* fix(ActivitySwitchNotice): 修复OCR键函数调用参数缺失问题

- 修复OcrKey函数调用时缺少activityName参数的问题
- 确保黑名单条件检查时传递正确的活动名称参数
- 解决因参数缺失可能导致的条件匹配错误

* docs(ActivitySwitchNotice): 更新README文档添加逻辑流程图

- 添加了详细的逻辑流程说明
- 使用mermaid图表展示组件间交互流程
- 补充了配置初始化到活动过滤的完整流程
- 说明了黑名单匹配和OCR校验的具体逻辑
- 更新了用户使用指南章节结构

* docs(ActivitySwitchNotice): 更新活动过滤器流程图文档

- 修正了活动过滤器流程图中的条件判断逻辑描述
- 更新了黑名单匹配条件的处理流程说明
2026-01-04 11:04:59 +08:00
..
2025-12-21 16:22:52 +08:00

活动期限/周本通知器

项目概述

这是一个用于《原神》游戏的自动化脚本工具,主要功能是自动检测游戏内活动的剩余时间,并在活动即将结束时/每周指定日期自动提醒征讨领域减半剩余次数发送通知提醒玩家。


功能特性

  • 自动返回游戏主界面并打开活动页面
  • OCR识别活动列表和剩余时间
  • 自动滚动浏览所有活动页面
  • 智能解析剩余时间(支持"22天14小时"等格式)
  • 可配置的通知阈值默认8760小时内结束的活动
  • 支持指定特定活动进行监控
  • 支持活动黑名单过滤功能0.0.5版本,新增支持为黑名单活动设置特定条件,只有满足条件时才过滤,注:特定条件为空默认没有条件)
  • 防重复检测机制
  • 异常处理和错误恢复
  • 自动提醒征讨领域减半剩余次数(默认周日提醒可配置)
  • 支持独立通知功能(0.0.4版本新增 因BGI不支持WebSocket,需搭配WsProxy+开启JS HTTP 权限使用)前往WsProxy部署

逻辑流程

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 通知时间阈值(小时) 8760365天 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

使用流程

自动模式(推荐)

  1. 启动脚本后,程序会自动:
    • 检测当前是否在游戏主界面
    • 如未在主界面,自动返回主界面
    • 按设定的快捷键打开活动页面
    • 开始扫描所有活动

手动模式

  1. 关闭 toMainUi 选项
  2. 确保游戏处于主界面状态
  3. 启动脚本开始扫描

功能详解

活动筛选

  • 全部活动监控whiteActivityNameList 保持空值,监控所有有剩余时间的活动
  • 指定活动监控:填写活动关键词,如 海灯节\|盛典,只监控包含这些关键词的活动
  • 黑名单过滤blackActivity 可以设置不想接收提醒的活动名称,多个活动用|分隔
  • 条件黑名单过滤:支持条件语法 活动名-条件1,条件2只有当活动满足指定条件时才过滤
使用示例
普通黑名单: "活动A|活动B"
条件黑名单: "活动A-已完成|活动B-条件1,条件2"
混合使用: "活动A|活动C-已完成,已领取"

时间通知机制

  • 默认监控所有活动(notifyHoursThreshold=8760小时
  • 可设置阈值如设置为24则只通知剩余时间≤24小时的活动
  • 即将结束(24小时内)的活动会在通知中标记 <即将结束>

逻辑关系配置

  • relationshipfalse(默认):满足"剩余时间阈值"或"白名单活动"任一条件即发送通知
  • relationshiptrue:必须同时满足"剩余时间阈值"和"白名单活动"两个条件才发送通知

智能防重复

  • 自动识别已扫描过的活动页面
  • 防止因页面滚动不准确造成的重复识别
  • 自动判断是否已滚动到页面底部

独立通知配置0.0.4版本新增)

配置项说明

  • noticeType:

    • BGI通知: 使用 BetterGI 内置通知
    • 独立通知: 通过 WebSocket 发送通知
    • 独立通知和BGI通知: 同时使用两种方式
  • WebSocket 配置:

    • ws_proxy_url: WebSocket 代理 URL默认为 http://127.0.0.1:8081/ws-proxy/message/send
    • ws_url: WebSocket 客户端 URL默认为 ws://127.0.0.1:8080/
    • ws_token: WebSocket 客户端认证令牌(可选)
  • 发送配置:

    • action: 发送类型,可选 私聊群聊
    • send_id: 根据 action 类型填写群号或 QQ 号
    • at_list: @ 某人列表,使用逗号分隔多个 QQ 号

使用要求

  1. 开启权限: 需要开启 JS HTTP 权限才能使用独立通知功能
  2. 配置服务: 需要搭建相应的 WebSocket 服务和代理服务器
  3. 网络连接: 确保能够连接到配置的 WebSocket 服务器

配置示例

{
  "noticeType": "独立通知",
  "ws_proxy_url": "http://127.0.0.1:8081/ws-proxy/message/send",
  "ws_url": "ws://127.0.0.1:8080/",
  "action": "群聊",
  "send_id": "123456789",
  "at_list": "987654321,111222333"
}

部署 WsProxy

1.windows exe 直接运行

前往 release 下载 带windows的zip包解压运行.exe文件即可

2.java

前往 release 下载 jar包

java -jar xxxx.jar

3.部署docker

docker pull ghcr.io/kirito520asuna/wsproxy:latest
docker run -d -p 8081:8081 -v /path/to/application-prod.yml:/app/application-prod.yml --name wsproxy ghcr.io/kirito520asuna/wsproxy:latest

注意事项

使用环境要求

  • 游戏分辨率为 1920×1080最佳兼容性
  • 游戏处于前台运行状态
  • 活动页面可通过设置的快捷键正常打开

运行期间注意事项

  • 🚫 运行期间请勿手动操作鼠标
  • 🚫 避免切换窗口或最小化游戏
  • ⚠️ 如遇异常可重新启动脚本

高级配置

自定义快捷键

如活动页面不是F5打开可在 activityKey 中修改为对应按键。
如冒险之书页面不是F1打开可在 campaignAreaKey 中修改为对应按键。

时间阈值设置

根据个人需求设置 notifyHoursThreshold

  • 24只关注24小时内结束的活动
  • 168关注一周内结束的活动
  • 720关注一个月内结束的活动

独立通知配置

如果需要使用独立通知功能如发送到QQ群聊需要

  1. 开启JS HTTP权限
  2. 配置WebSocket相关参数
  3. 设置发送类型和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号 (独立通知配置)

工作原理

  1. 自动返回游戏主界面
  2. 检查是否为设置的提醒日(默认周日),如果是则执行征讨领域提醒功能
  3. 按配置快捷键打开活动页面
  4. 滚动到活动列表顶部
  5. 逐页扫描所有活动
  6. OCR识别每个活动的剩余时间
  7. 解析时间为小时数并过滤(包括黑名单过滤)
  8. 发送符合条件的活动提醒

注意事项

  • 请确保游戏分辨率为1920×1080以获得最佳效果
  • 脚本运行期间请勿操作鼠标
  • 某些特殊活动可能无法正确识别剩余时间
  • 建议在游戏空闲时运行此脚本

版本历史

0.0.5 (2026-01-04)

  • 性能优化:优化滚动到顶部算法,减少页面滚动次数,提升初始化效率
  • 功能增强:新增条件黑名单过滤机制,支持基于活动状态的动态过滤策略
  • 代码重构:新增 parseBlackActivity 函数,实现黑名单配置的结构化解析
  • 架构改进:重构黑名单匹配逻辑,引入条件匹配引擎,支持多条件复合判断
  • 数据结构优化:引入 blackActivityMap 配置项,使用 Map 数据结构提升查找性能
  • 逻辑优化:增强活动过滤算法,集成条件匹配验证机制
  • 初始化流程:重构配置加载流程,新增 init 函数统一处理配置项初始化
  • 文档完善:更新配置项文档,补充条件黑名单语法说明

0.0.4 (2026-01-01)

  • 新增 独立通知配置功能,支持通过 WebSocket 发送通知
  • 新增 ws.js 模块,实现 WebSocket 通知功能
  • 新增 noticeType 配置选项,用于选择通知模式
  • 新增 ws_proxy_urlws_urlws_token 配置选项
  • 新增 actionsend_idat_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