feat: expand module workflows, dynamic config, notifications and console API

This commit is contained in:
2026-09-04 09:49:37 +08:00
parent 8df5266abb
commit b124d757b0
309 changed files with 89358 additions and 6232 deletions
+28 -3
View File
@@ -67,9 +67,34 @@ flowchart TD
## 外部系统
- PostgreSQL:云端模式不提供地址、数据库、用户或密码的源码默认值;由 `GYXX_POSTGRES_DSN` 在运行时注入,并拒绝回环数据库地址。
- Hermes:保留本机 `data-analyzer``data-collector` 两个角色,以及各自 API 和 gateway。
- 飞书:复用现有 lark-cli profile、应用身份、表格和消息调用方式
- 浏览器:每个脚本从 `config/runtime-bindings.json` 获得唯一 CDP 端口及独立 Profile、Cookie、storage state 路径,不共享可写 Profile。
- Hermes:保留本机 `data-analyzer``data-collector` 两个角色,以及各自 API 和 gateway;Hermes 只承担需要大模型的分析,不作为飞书消息投递身份
- 飞书:表格写入和业务消息统一使用 `lark-cli --profile hermes-analyzer --as user`。消息发送必须校验真实 `message_id` 回执;卡片图片预上传因上游接口仅支持 tenant token,保留同一 profile 的 bot 媒体上传例外,但最终卡片仍由 user 身份投递
- 浏览器:每个脚本从 `config/runtime-bindings.json` 获得唯一 CDP 端口及独立 Profile、Cookie、storage state 路径,不共享可写 Profile;多个脚本若属于同一登录身份,则通过 `state/accounts/<account_id>/` 的账号 vault 合并 Cookie,仍保持 Profile 隔离。像商品经营日报这类按品牌动态路由的包装脚本,会在运行时选择对应账号 vault,但仍为每个品牌保留独立 Profile。
- 账号保活:`accounts.<account_id>.keepalive` 由唯一的 `gyxx schedule run` 常驻进程错峰执行;只有安全页面确认未跳转登录页且必需 Cookie 仍有效时,才原子发布新 vault 并同步成员脚本。京东 `jd-shop``jd-self-operated``jd-market-rank` 以及天猫 `tmall-shop``tmall-ozko` 都使用独立 vault,避免同域不同店铺相互覆盖。
### Scrapling 采集边界
浏览器和公开 HTTP 采集统一使用 `scrapling[fetchers]==0.4.13`。生产代码不得直接
导入或启动 Playwright、Patchright、Selenium;静态接口使用 `Fetcher`,普通动态
页面使用 `DynamicSession`,需要隐身能力的页面使用 `StealthySession`。Scrapling 的
动态抓取器内部仍分别使用 Playwright/Patchright,因此它们会作为传递依赖出现,但
不是项目业务 API。官方选型说明见
<https://scrapling.readthedocs.io/en/latest/fetching/choosing.html>。
`gyxx_flow.adapters.scrapling.ScraplingBrowser` 是统一浏览器边界,负责:
- 默认只执行一次,避免上传、申诉等有副作用动作被框架静默重放;
- 从绑定专属 Cookie/storage-state 文件恢复状态,并在关闭前原子保存;
- 用持久 Profile 启动自有浏览器,或借用外部 CDP 中唯一已有 context
- 借用 CDP 时只关闭本次页面和连接,不关闭远端 browser/context
- 将 Scrapling 回调中被记录后吞掉的异常重新抛给工作流;
- 在业务代码不导入底层引擎的前提下统一识别浏览器超时。
Scrapling 0.4.13 当前要求 `curl-cffi==0.16.1b1`,项目显式锁定该版本。部署安装锁定
依赖后运行 `uv run scrapling install` 准备浏览器运行时;定时采集任务本身不得执行
安装。`tests/test_no_native_browser_automation.py` 负责阻止原生浏览器调用回流,唯一
排除项是不可执行的上游 Scrapling 源码快照
`vendors/dy-data-flow/dynamic_session_src.py`
## 数据布局