koishi-plugin-fully-customized-function-mywl
v1.0.2
Published
[插件由AI生成]全自定义功能自动化:可视化工作流节点编排(OneBot v11 接口 / Koishi 状态与自定义命令 / 数据库读写 / 文件操作 / 条件判断含正则 / 循环 / 变量 / 网络请求 GET·POST / JSON·XML / 随机数 / 时间 / 字符串 / 数组),支持 LLOneBot/NapCat 框架适配、调试日志、日志容量限制与一键清空,WebUI 拖拽管理
Maintainers
Readme
全自定义功能插件 (koishi-plugin-fully-customized-function-mywl)
[插件由 AI 生成] 可视化工作流自动化插件:将 OneBot v11 全部内置接口、Koishi 运行状态与自定义命令、代码工具 / 数据库 / 文件操作 / 网络请求(GET / POST)组织为自由画布上的工作流节点,在 Koishi 控制台 WebUI 中拖拽摆放节点、连线决定执行顺序,保存后按条件自动执行,并带完整执行日志面板。
功能特性
- WebUI 入口:仅管理员(通过 auth 插件登录、权限 ≥ 3)可在控制台左侧看到并访问「全自定义功能」入口
- 节点库(45 个 OneBot 接口节点 + 系统节点 + 工具节点):发送/撤回消息、踢人、禁言、全体禁言、设群名片/群名/头衔、群公告精华、好友点赞、入群/好友请求处理、群信息/成员查询、群文件、OCR、运行状态等;系统节点覆盖 Koishi 状态 / 机器人状态(返回 JSON)、JSON / XML / 随机数 / 时间日期 / 字符串 / 数组 代码工具、网络请求 GET / POST、数据库读写、文件与文件夹操作、注册/触发自定义命令、AI 对话请求
- 数据库操作:对已注册数据表执行 查询 / 插入 / 更新 / 删除,支持条件 JSON 与查询条数限制(如本插件的
mywl_ftask、mywl_flog) - 文件操作:写入(覆盖/追加)/ 读取 / 删除文件,创建 / 删除文件夹,列出目录;路径限制在插件数据目录 / Koishi 数据目录 / 临时目录内,禁止
..越界 - Koishi 命令:注册 Koishi 命令并配置回调子流程;也可在有消息会话的事件任务或命令回调中从已注册命令列表选择并直接触发
- AI 对话与 OCR 兜底:调用兼容 OpenAI Chat Completions 的 AI 服务;图片 OCR 在 OneBot 接口失败时可选用视觉模型兜底,并将识别结果交给后续 AI 校对、总结、翻译或分类
- 自由画布工作流编辑器:
- 二维自由画布:节点可摆放在任意位置,拖动节点调整布局;空白处拖动平移画布、滚轮缩放(25%–300%),网格背景与视口位置随工作流一并保存
- 添加节点:从左侧节点库 拖拽 到画布任意位置释放,或 点击 节点自动添加到当前可见区域(自动接在上一个还有空闲出口的节点之后),并立即弹出该节点的配置窗口
- 节点配置弹窗:单击任意节点即弹出该节点的配置窗口,内含连线概览、节点参数、返回字段、备注与坐标微调;按
Esc、点遮罩或「完成」关闭 - 连线决定执行顺序:每个节点底部有出口端口,从端口拖拽到目标节点即可连线;连线带箭头与端点圆点,出口标签贴在曲线起点附近,多条曲线重叠时自动错开;鼠标悬停到连线上会出现 × 按钮(点击断开),右键也可断开;也可在配置弹窗中用下拉框直接选择目标节点
- 多出口节点:条件判断有「成立时 / 不成立时」两个出口;循环节点有「循环体入口」与「循环结束后」两个出口(把循环体末尾连回循环节点即成环)
- 自动防环:连线时会检测是否会形成无循环节点的死环并阻止;经过循环节点(次数 / 条件循环)的回边是合法循环,不会被拦截;预览路径可查看实际执行顺序
- 多选与批量操作:
Ctrl/⌘ + 单击多选节点,可批量启用/停用、左对齐、删除;节点可复制、停用(执行时跳过)、设为起始节点 - 网格对齐:一键把所有节点吸附到 24px 规则网格,并把重叠节点依次推开,保持相对位置不变
- 导入 / 导出:工作流可导出为 JSON 文件备份,或导入替换当前画布内容
- 条件判断增强:条件节点的「被比较值」自动取自上游的取值节点(OneBot 接口 / 工具节点 / 设置变量)写入的变量,支持「取值字段(JSON 路径)」按点路径提取子值比较,并展示该接口全部 JSON 返回字段说明
- 触发方式:手动触发、定时触发(cron 表达式)、固定间隔触发、事件触发(群消息 / 私聊消息 / 有人入群 / 有人退群 / 群消息撤回)
- 执行引擎:以「节点 + 出口连线」组成的有向图执行,支持条件分支、循环(次数 / 条件)、跳出与跳过本次循环、延时等待、变量读写、代码工具运行;全异步,不阻塞主线程;同一任务防重入,可手动停止
- 调试日志开关:默认静默(仅显式「日志输出」与错误信息);开启后逐步输出 进入/退出节点、参数值、中间结果、判断结果、错误信息
- OneBot 框架适配:配置可指定 LLOneBot / NapCat 或自动识别,兼容框架间参数与 action 命名差异
- 执行日志:每条运行记录状态(运行中/成功/失败/已停止)、耗时、逐节点执行明细,可筛选、展开,并提供不可恢复的 一键清空日志 按钮
- 日志容量控制:日志同时受保留天数、最大保留条数 和 最大占用空间(MB) 双重限制;面板中实时显示当前占用进度条与上限,可直接在 WebUI 修改两项上限或手动触发一次超额清理;超出容量时优先自动删除最旧的已完成记录,运行中的记录不会被自动删除
- 数据持久化:工作流与日志均存于 Koishi 数据库;旧的树形任务数据在首次读取时自动迁移为图结构;工作流列表内存缓存 + 前端刷新请求合并,WebUI 响应更快
安装
# 将本插件目录放入 Koishi 工作区后,在插件市场或通过 package.json 依赖安装
npm install koishi-plugin-fully-customized-function-mywl在 Koishi 控制台启用插件,并在左侧导航选择「全自定义功能」进入编排面板。
前端资源(dist)由 Koishi 工作区的
koishi dev/build自动构建,无需单独构建。
快速上手
- 打开「工作流编排」页,点击 新建工作流
- 填写工作流名称,选择触发方式(如:定时
*/10 * * * *每 10 分钟) - 从左侧节点库 拖拽 节点到画布上,或直接 点击 节点快速添加(新节点会出现在当前可见区域并自动接在上一个节点之后),例如:
发送群消息→ 群号填888888,内容填整点自动报时:{now}
- 新增或单击节点会 弹出该节点的配置窗口,在里面填写参数、可点「填入示例」快速试用,按「完成」或
Esc关闭 - 拖动节点调整位置;从节点底部的 端口 拖拽到下一个节点即可建立连线、决定执行顺序
- 条件判断有「成立时 / 不成立时」两个出口,可分别连到不同节点
- 循环节点把「循环体入口」连到循环体第一个节点,再把循环体末尾连回循环节点本身即形成循环,循环结束后的节点连到「循环结束后」出口
- 节点位置杂乱了可点工具栏 网格对齐 一键吸附到规则网格
- 点击 保存(校验通过后生效,编辑后也会自动保存),再点 立即执行 试运行
- 切换「执行日志」页查看每次运行的详细结果,可在「容量设置」中调整日志上限,或使用「一键清空日志」删除全部历史记录
节点说明
OneBot v11 内置接口节点
| 分类 | 节点 | | --- | --- | | 消息操作 | 发送私聊消息、发送群消息、自动发送消息、发送图片、发送音频、发送文件、发送视频、发送卡片、发送自定义消息数据、撤回消息、获取消息、获取合并转发、发送合并转发、群签到 | | 群聊操作 | 群组踢人、群组禁言、群匿名禁言、全体禁言、设置群管理员、群匿名设置、设置群名片、设置群名、设置专属头衔、退出群聊、设置群头像、设置精华消息、移出精华消息 | | 好友与请求 | 好友点赞、处理好友请求、处理加群请求 | | 信息查询 | 获取登录号信息、获取陌生人信息、获取好友列表、获取群信息、获取群列表、获取群成员信息、获取群成员列表、获取群荣誉、获取群消息历史、获取Cookies、获取CSRF Token、获取凭据 | | 文件媒体 | 获取语音、获取图片、图片OCR、群文件系统信息、群根目录文件、群子目录文件、上传群文件、能否发图、能否发语音 | | 系统维护 | 获取运行状态、获取版本信息、清理缓存 |
每个 OneBot 节点均可设置「结果保存变量」,调用结果以 JSON 文本写入该变量(默认 lastResult),供后续节点引用。
接口调用自动选择可用的 OneBot 机器人(优先
bot.onebot(action, params),回退bot.internal),适配 NapCat / LLBot / 标准 OneBot v11 实现;具体框架可在插件配置「OneBot 框架适配」中指定或保持自动识别。
条件判断的「取值字段(JSON 路径)」
条件判断节点会沿连线向上游查找最近的「取值节点」(OneBot 查询类 / Koishi 信息类 / 代码工具 / 设置变量),取其写入变量的结果参与比较,比较前可用「取值字段」按路径提取子值:
- 路径用
.分层,数组用下标:member_list.0.user_id、current_talkative.nickname - 可用键名在节点参数区「本节点 JSON 返回可用字段」中逐项列出(包含类型 / 含义 / 来源)
- 路径不存在 / 值为空时按空字符串处理(
isEmpty成立、== ''成立,不报错) - 取出的值统一转字符串参与比较(数字可宽松相等,
1与'1'相等) - 「对比值」可直接粘贴 JSON 文本做整体文本相等比较
- 比较运算符支持 正则匹配(regex)/ 正则不匹配(notRegex):对比值填正则表达式(如
^\d{4,}$),非法表达式视为不匹配
系统节点
| 节点 | 说明 |
| --- | --- |
| 条件判断 | 按比较规则判定,从「成立时 / 不成立时」两个出口中选择一个继续 |
| 次数循环(for) | 按指定次数反复执行「循环体入口」出口指向的节点链(循环体末尾连回本节点),可指定循环变量(默认 i,从 1 开始);结束后从「循环结束后」出口继续 |
| 条件循环(while) | 条件成立时反复执行循环体,带最大次数保护(防死循环);结束后从「循环结束后」出口继续 |
| 跳出循环 | 跳出当前所在循环 |
| 跳过本次循环 | 跳过本次循环剩余节点,进入下一次 |
| 延时等待 | 暂停指定毫秒后再继续 |
| 设置变量 | 存入变量供后续引用;取值方式可选 文本(模板拼接) 或 表达式(计算结果) |
| 读取变量 | 将变量内容输出到执行日志(调试与留痕) |
| 日志输出 | 向执行日志写入一条记录(info/warn/error) |
| 注释 | 流程说明,不执行任何操作 |
Koishi 信息节点
| 节点 | 说明与 JSON 返回 |
| --- | --- |
| Koishi 状态 | 协程版本、Node 版本、运行时长、插件数、机器人数量、内存占用(MB)、CPU 使用率、任务累计执行次数;返回 JSON 键:koishiVersion / nodeVersion / uptimeSec / uptimeText / pluginCount / botCount / memoryMB / cpuPercent / totalTaskRuns |
| 机器人状态 | 已接入机器人列表;返回数组,元素键:platform / selfId / status / online / name |
两个节点均返回 JSON,运行时在节点参数区直接展示全部字段名、类型与含义,结果可通过「结果保存变量」存为 JSON 文本后引用,或在「条件判断」中用「取值字段」按路径提取(如
bot_list.0.platform)。
代码工具节点
| 节点 | 功能 | 参数 |
| --- | --- | --- |
| JSON 解析/序列化 | JSON.parse 解析 / JSON.stringify 序列化,可选美化 | 操作、输入、美化 |
| XML 解析/格式化 | 简易栈式解析为 JSON 树(标签/属性/文本/子节点)或美化缩进 | 操作、XML 内容 |
| 随机数生成 | 整数 / 浮点 / 随机字符串 / UUID(基于 crypto) | 类型、min/max、长度、字符集 |
| 时间日期 | 格式化输出 / Unix 时间戳 / 按秒偏移(含时区换算) | 操作、格式、偏移秒 |
| 字符串处理 | MD5 / SHA1 / SHA256 哈希、Base64 编解码、URL 编解码、大小写、去空格 | 操作、输入文本 |
| 数组操作 | 排序 / 去重 / 反转 / 长度 / 去假值 / 深拷贝示例 | 操作、JSON 数组 |
| 网络请求 GET | 原生 fetch GET 请求,支持 URL、请求头 JSON、查询参数 JSON;仅允许 http/https,响应体限制 4 MiB | URL、请求头、查询参数、结果保存变量 |
| 网络请求 POST | 原生 fetch POST 请求,支持 JSON、文本、表单请求体;仅允许 http/https,响应体限制 4 MiB | URL、请求头、请求体、请求体类型、结果保存变量 |
| 深拷贝 | JSON.parse(JSON.stringify()) 完整深拷贝示例,输出与原数组等价的新 JSON | 操作=deepCopy、JSON 数组 |
代码工具与网络请求节点均带「✨ 填入示例」按钮一键填充示例参数;网络请求仅接受
http/https协议,响应体超过 4 MiB 会终止读取。成功响应按Content-Type为 JSON 时解析为 JSON,否则保存为文本;结果可通过「结果保存变量」存入变量复用,并可在条件规则中用 JSON 路径取值。
数据库 / 文件操作 / Koishi 扩展节点
| 节点 | 功能 | 参数 |
| --- | --- | --- |
| 数据库操作 | 对已注册数据表执行 查询(get)/ 插入(create)/ 更新(set)/ 删除(remove),条件与数据均为 JSON 文本 | 操作、表名、数据 JSON、条件 JSON、查询条数、结果保存变量 |
| 写入文件 | 将文本写入文件(覆盖 / 追加),自动创建父目录 | 基础目录、路径、写入方式、内容、结果保存变量 |
| 读取文件 | 以 UTF-8 读取文本文件(上限 4 MiB) | 基础目录、路径、结果保存变量 |
| 删除文件 | 删除指定文件,不存在时可忽略 | 基础目录、路径、不存在时忽略、结果保存变量 |
| 创建文件夹 | 递归创建多级文件夹,已存在不报错 | 基础目录、路径、结果保存变量 |
| 删除文件夹 | 递归删除文件夹及其全部内容,不存在时忽略 | 基础目录、路径、结果保存变量 |
| 列出目录 | 列出直接子项([{name,type}] 文件/文件夹) | 基础目录、路径、结果保存变量 |
| 触发已有命令 | 从当前 Koishi 已注册命令列表选择并直接调用;也可手工输入动态命令名;仅限消息事件任务或自定义命令回调使用 | 已有命令、手动命令名、命令参数、结果保存变量 |
| 图片 OCR | 优先调用 OneBot OCR;失败时可选调用兼容 OpenAI 图像输入的视觉模型兜底 | 图片、AI OCR 兜底、AI 服务地址、API 密钥、视觉模型、OCR 提示词、结果保存变量 |
| AI 对话请求 | 请求兼容 OpenAI Chat Completions 的 AI 服务;适用于 OCR 结果理解、文本生成、翻译、总结与分类 | 服务地址、API 密钥、模型、系统提示词、用户提示词、随机性、最大输出 Token、结果保存变量 |
| 注册自定义命令 | 注册 Koishi 命令;用户输入时执行「命令回调」子流程,内置 {cmdContent} {cmdArgs} {cmdName} {userId} {groupId} {content} 变量 | 命令名、描述、别名、参数获取方式、参数声明 |
基础目录可选:插件数据目录(
data/fully-customized-function-mywl)/ Koishi 数据目录(data)/ 系统临时目录;所有路径必须解析在所选基础目录内,禁止通过..越界。 数据库安全:表名仅允许字母/数字/下划线/冒号(防止非法注入),其余由 Koishi minato 模型约束(只能访问已注册模型)。 OCR 说明:图片 OCR 节点优先调用 OneBot 的ocr_image(不支持时回退ocr)接口;若调用失败且开启「AI OCR 兜底」,会将公开 HTTP(S) 图片 URL 发给兼容 OpenAI Chat Completions 图像输入的视觉模型。兜底结果为{ texts: [{ text }], language: "ai-vision", source: "ai-fallback" };本插件不启动或托管 OCR 服务。 AI 密钥说明:AI 对话请求与 AI OCR 兜底均仅支持 HTTP(S) 的兼容 Chat Completions 服务;推荐通过任务运行时变量注入密钥,避免直接保存到任务。密钥不会写入执行日志,但直接填写在节点参数中时会随任务定义持久化。 消息说明:图片、音频、文件、视频与卡片节点通过标准 CQ 消息段调用 OneBot;可填写本地绝对路径、fileURL、HTTP(S) URL 或对应适配器支持的数据形式。不同 OneBot 实现对文件、视频和卡片的支持存在差异。「发送自定义消息数据」用于直接传入 OneBotsend_msg的消息段数组或 CQ 文本,调用前应按当前适配器的消息格式确认参数。 命令说明:命令由任务执行时注册,同一条命令只注册一次;插件停用或重启时自动移除。回调中{cmdContent}为命令后剩余文本,{cmdArgs}为按空格分割的参数 JSON 数组。触发已有命令需要当前消息会话,用于保证命令权限、平台和用户上下文正确。
AI OCR 兜底配置
当 OneBot 实现不支持 ocr_image / ocr,或接口调用发生错误时,可在「图片 OCR」节点中启用 AI OCR 兜底:
- 图片填写可由视觉 AI 服务访问的公开
http/httpsURL;本地路径、OneBot 图片文件名仅能交给 OneBot OCR 处理。 - 将「AI OCR 兜底」设为“开启”,填写兼容 OpenAI Chat Completions 的服务地址、API 密钥和支持图像输入的视觉模型名。
- 可按业务调整 OCR 提示词,例如要求保留换行、还原表格或限定识别语言。
- OneBot OCR 成功时不会请求 AI;仅 OneBot OCR 失败后才执行兜底,避免额外模型调用与费用。
AI 兜底返回结构:
{
"texts": [{ "text": "识别出的完整文本", "confidence": null, "coordinates": [] }],
"language": "ai-vision",
"source": "ai-fallback",
"model": "实际模型名"
}后续节点可通过 {结果变量} 引用完整 JSON,或在条件判断中使用 texts.0.text 读取识别文本。视觉模型必须支持 Chat Completions 的 image_url 消息内容格式。
触发已有命令
「触发已有命令」节点会从当前 Koishi Commander 实时下发的已注册命令中提供下拉选项;刷新任务页面即可更新列表。若命令由任务运行时动态注册、尚未出现在下拉列表,或需调用未展示的命令,可填写“手动命令名”,它会优先于下拉选择生效。命令参数支持 {变量名} 模板替换。
触发方式
| 方式 | 配置 | 说明 | | --- | --- | --- | | 手动触发 | — | 仅通过 WebUI「立即执行」运行 | | 定时触发 | cron 表达式 | 5 段格式,详见下方语法 | | 固定间隔 | 秒数(≥5) | 按固定间隔循环执行 | | 事件触发 | 事件类型 | 群/私聊消息、入群、退群、撤回时触发,自动注入事件变量 |
cron 表达式语法
分 时 日 月 周,支持 *、?(同 *)、数字、a-b 范围、*/n 步长、, 列表:
*/10 * * * *每 10 分钟0 8 * * *每天 08:000 9 * * 1每周一 09:0030 14 1,15 * *每月 1 日与 15 日 14:30
变量说明
任何文本参数均可使用 {变量名} 引用:
| 变量 | 可用场景 | 说明 |
| --- | --- | --- |
| {now} | 全部 | 当前时间 YYYY-MM-DD HH:mm:ss |
| {taskName} / {taskId} | 全部 | 任务名称 / ID |
| {lastResult} | OneBot 调用后 | 上一次接口调用结果(也可在节点上自定义保存变量名) |
| {groupId} | 事件触发 | 事件发生的群号 |
| {userId} | 事件触发 | 触发用户 QQ(撤回事件为操作者) |
| {nickname} | 消息事件 | 用户昵称 |
| {content} | 消息事件 | 消息文本内容 |
| {messageId} | 消息/撤回事件、命令回调 | 消息 ID |
| {operatorId} | 入群/退群/撤回 | 操作者 QQ |
| {cmdName} | 自定义命令回调 | 当前被执行的命令名 |
| {cmdContent} | 自定义命令回调 | 命令后的完整原始文本参数 |
| {cmdArgs} | 自定义命令回调 | 按空格分割后的参数 JSON 数组;带引号的内容会作为同一个参数 |
| 自定义变量 | 全部 | 由「设置变量」节点产生;循环变量可用 {i} |
表达式语法(条件、表达式取值的设置变量)
支持:算术 + - * / %、比较 == != > < >= <=、逻辑 && || !、括号、三元 条件 ? 值1 : 值2、字符串拼接与比较。
- 变量引用
{count}或裸标识符count(变量已存在时取变量值) - 未定义的裸单词按字符串字面量处理,如
{type} == warn - 示例:
{atCount} > 3 && {content} != ""、count + 1、{score} >= 60 ? "通过" : "不通过"
配置项
插件配置保持极简,其余功能均在 WebUI 中操作:
| 配置 | 默认 | 说明 |
| --- | --- | --- |
| 插件总开关 | 开启 | 关闭后调度器与 WebUI 均停用 |
| 日志保留天数 | 7 | 超过该天数的执行日志自动清理 |
| 日志最大占用空间 | 32 MB | 超过该容量时优先删除最旧的已完成日志;运行中的日志不会被自动删除。可在 WebUI 日志页「容量设置」中修改 |
| 日志最大保留条数 | 2000 | 与占用空间限制同时生效,超出时删除最旧日志。可在 WebUI 日志页「容量设置」中修改 |
| 任务调试日志 | 关闭 | 开启后逐步输出详细日志(进入/退出节点、参数值、中间结果、判断结果、错误信息);关闭时仅输出「日志输出 / 读取变量」节点与错误/失败摘要 |
| OneBot 框架适配 | 自动识别 | auto 自动检测;也可手动指定 LLOneBot / NapCat,对参数类型(布尔/JSON 文本)与 action 命名差异做兼容处理 |
注意事项
- 权限:仅管理员可创建 / 修改 / 删除工作流;WebUI 入口
authority = 3 - WebUI 修改工作流或工作流运行结束后,所有已打开的客户端会自动同步最新数据,无需手动刷新
- 工作流按 连线 执行:务必把节点用端口连起来,未与起始节点连通的节点不会被执行(面板会给出提示)
- 条件判断的「被比较值」来自上游的取值节点。若上游是多个节点,会按最近的一层取值节点收集规则(
AND/OR由节点参数决定) - 循环节点通过「循环体末尾连回循环节点」成环;循环全部结束后从「循环结束后」出口继续。为避免死循环,while 循环受「最大次数」保护,引擎另有总执行节点数上限兜底
- 事件触发的工作流请在「事件触发」中选择监听事件;消息事件会自动区分群聊 / 私聊
- 遭撤回/禁用/删除的消息 ID 等接口参数可能失效,接口错误会记录在日志中便于排查
数据存储
| 表名 | 说明 |
| --- | --- |
| mywl_ftask | 工作流定义(名称、触发方式、工作流图 JSON graph、运行统计) |
| mywl_flog | 执行日志(状态、耗时、逐节点明细 JSON) |
旧数据兼容:早期版本使用树形
steps字段存储任务,插件在读取时会自动将其转换为新的graph图结构(条件规则前置、分支汇合、循环体回边均会重建),无需手动迁移。
License
MIT
