Files
云端客 ecc2de529a feat(ActivitySwitchNotice): 添加新活动通知功能 (#2831)
* feat(ActivitySwitchNotice): 添加新活动通知功能

- 新增配置文件路径定义用于存储活动数据
- 在activityMain函数中添加newActivityNotice参数控制新活动通知
- 读取历史活动配置文件并转换为Set进行对比
- 创建activityNameSet记录当前页面活动名称
- 修复OCR键值获取中的参数传递格式问题
- 实现新活动检测逻辑并与历史数据进行比较
- 添加新活动通知发送功能包括UID识别
- 更新版本号从0.0.8到0.1.0并在README中记录变更
- 在设置界面添加新活动通知的启用开关选项

* feat(ActivitySwitchNotice): 更新活动主函数调用以支持新活动通知设置

- 修改 activityMain 函数调用,传入 settings.newActivityNotice 参数
- 实现新活动通知功能的配置支持

* feat(ActivitySwitchNotice): 优化活动通知逻辑并修复数据处理问题

- 在遍历活动列表时同步更新 activityNameSet 集合
- 注释掉冗余的数组合并操作避免重复数据处理
- 重构新增活动检测逻辑提高代码可读性
- 优化通知发送后的配置文件更新时机确保数据一致性
- 改进错误处理机制并添加调试日志
- 修复当无新增活动时不执行通知发送的逻辑分支

* feat(ActivitySwitchNotice): 实现基于UID的个性化活动数据管理

- 添加UID识别功能,通过uidUtil.ocrUID()获取用户唯一标识
- 修改活动数据结构,将全局活动集合改为按UID分类存储
- 实现用户特定活动过滤,只处理当前UID相关的活动数据
- 更新活动配置文件写入逻辑,支持多用户数据分离存储
- 优化新增活动检测机制,基于用户历史活动进行精确匹配
- 重构活动数据序列化处理,确保数据格式兼容性和持久化
2026-02-02 07:27:12 +08:00
..
2025-12-21 16:22:52 +08:00

活动期限/周本通知器

项目概述

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


功能特性

  • 自动返回游戏主界面并打开活动页面
  • 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 通知时间阈值(小时) 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/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群聊需要

  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.1.0 (2026-02-01)

  • 新增 新活动通知(存储活动名称列表-历史对比)

0.0.8 (2026-01-22)

  • 新增 地图识别任务提醒 如:

    0.0.8-00 0.0.8

0.0.7 (2026-01-19)

  • 新增每日委托提醒

0.0.6 (2026-01-06)

  • 功能优化新增识别uid通知提醒 实例: 0.0.6

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