Files
EveryPublish/docs/reference-repositories-analysis.md
T

79 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 参考仓库分析记录
## 仓库一:dreammis/social-auto-upload
- 地址:<https://github.com/dreammis/social-auto-upload>
- 本地:`references/social-auto-upload`
- HEAD:`1c66b7d`
- 许可证:MIT(`LICENSE`)
- 形态:Python CLI + Playwright/Patchright uploader,Web 不是当前主线。
- 可借鉴:文件/时间校验、平台参数契约、二维码处理、profile/cookie/upload 抽象。
- 不能直接照搬:依赖版本、账号路径、全局配置和平台选择器必须经过 workspace/account/task 隔离。
## 仓库二:DevilJie/social-auto-upload-web-ui
- 地址:<https://github.com/DevilJie/social-auto-upload-web-ui>
- 本地:`references/social-auto-upload-web-ui`
- HEAD:`85e783c`
- 许可证:MIT(`LICENSE`)
- 形态:Vue 3 + Element Plus + Flask + SQLite + 本地任务 worker + SSE;19 平台 Registry。
- 可借鉴:统一平台接口、Registry、`/login` SSE、Cookie 导入四步状态机、异步 `/postVideo`、任务状态轮询、草稿批量发布和分片上传。
- 关键调用链:`backend/app.py:672-708` 登录 SSE;`backend/app.py:719-847` Cookie 导入与 stream;`backend/impl/base_platform.py:188-355` 解析→临时文件→sync_profile→写账号;`backend/app.py:961-1154` 视频入队/状态查询;`backend/services/publish_executor.py:1-170` 单 worker;`backend/ext_api/task_queue.py:28-55,161-330` v2 多 worker;`backend/blueprints/uploads_bp.py:100-430` 可续传分片;`backend/ext_api/__init__.py:831-975,1219-1375` 草稿与批量发布。
- 风险:单 worker 状态有内存 TTL,v2 是另一套队列;二维码消息格式不统一;图文接口同步执行且缺资源可能占位成功;素材删除的 storage backend 选择不一致;TaskCenter 的中文状态过滤与英文后端状态可能不匹配。EveryPublish 只借鉴协议/状态思想,统一到 MySQL Task/TaskEvent 和 Go dispatcher。
## 仓库三:funfan0517/MediaPublishPlatform
- 地址:<https://github.com/funfan0517/MediaPublishPlatform>
- 本地:`references/MediaPublishPlatform`
- HEAD:`0813236`
- 许可证:MIT(`LICENSE`,版权归 funfan0517)
- 形态:Flask + SQLite + Playwright + Vue 3/Element Plus + Pinia;这是用户描述的“Media/Medium Publish Platform”候选仓库。
- 后端入口:`sau_backend/sau_backend.py`。文件 `/uploadSave`,素材 `/getFiles`,账号 `/getAccounts`/`/getValidAccounts`,登录 `/login`(SSE),发布 `/postVideo`、`/postVideosToMultiplePlatforms`,记录 `/getPublishTaskRecords`,重试 `/retryPublishTask`,取消 `/cancelPublishTask`。
- 上传核心:`newFileUpload/baseFileUploader.py` 统一处理 profile/cookie、文件类型、标题/正文/标签/封面/地点/定时;`multiFileUploader.py` 按文件→平台→账号串行尝试,账号失败后切换下一个账号。
- 平台配置:`newFileUpload/platform_configs.py` 以字典保存 URL、选择器和功能开关;新增平台主要改配置,但选择器仍是平台强耦合代码。
- 登录:`myUtils/login.py` 启动可视 Chrome,等待 URL 离开 login 页面后保存 `storage_state`;线程 + `Queue` 通过 SSE 推送状态。
- 数据模型:`db/createTable.py` 只有 `user_info`、`file_records`、`publish_task_records`,没有 workspace、角色、幂等键、状态事件或凭据加密层。
- 不能直接复制:全局 CORS、SQLite 并发限制、cookie 明文文件、错误 `code` 不统一、简单路径检查、发布记录与执行状态分离。EveryPublish 只借鉴页面信息架构、参数契约、profile、SSE 状态思想和平台配置表。
## 真实缺陷清单(参考代码审计)
| 项目 | 缺陷 | 当前迁移策略 |
|---|---|---|
| MediaPublishPlatform | 无鉴权、CORS 全开、Cookie/文件接口可越权 | JWT + workspace 条件 + 加密凭据,绝不返回 Cookie |
| MediaPublishPlatform | URL 离开 login 即判登录成功、SSE 无可靠断开 | adapter 明确状态码/响应 schema,context 可取消,挑战持久化 |
| MediaPublishPlatform | 同步 Playwright、retry/cancel 只改数据库、批次粗粒度成功 | Dispatcher context + TaskEvent + 逐账号结果 |
| 两个参考项目 | 定时参数类型/位置错位、平台 schedule feature 常关闭 | 当前任务使用毫秒时间戳,adapter 明确支持/拒绝 |
| social-auto-upload-web-ui | 单线程内存队列和 v2 队列并存 | EveryPublish 只保留一个持久化任务状态机 |
| social-auto-upload-web-ui | 纯字符串/JSON 混合 SSE、图文缺资源仍可能成功 | Browser WS envelope + 非空结果/错误分类硬校验 |
## 三个参考系统的关系
```text
dreammis/social-auto-upload
└─ 平台 uploader、Playwright、cookie/profile、CLI 参数
├─ DevilJie/social-auto-upload-web-ui
│ └─ Flask Registry、SSE 登录、异步发布任务和 Web 页面
└─ funfan0517/MediaPublishPlatform
└─ 统一 BaseFileUploader、批量账号轮换、定时发布、发布记录
EveryPublish Web-only V1
└─ Go REST/JWT/GORM + MySQL/Redis + Browser WS
├─ 统一平台参数和浏览器 profile 思路
├─ SSE 状态转换为 DB Challenge + Browser WS
├─ SQLite 任务记录转换为 Task + TaskEvent 状态机
├─ 批量账号轮换/定时参数进入任务请求和调度器
└─ 每个平台 adapter 独立实现和测试
```
## 合并策略
```text
参考仓库(只读)
├─ 平台参数/登录/上传思路 ──> PlatformAdapter 接口
├─ SSE/任务队列思路 ────────> Browser WS + DB 状态
├─ 批量账号轮换/定时参数 ───> 当前任务请求和调度器
└─ 页面信息架构 ────────────> 当前 React + TDesign 页面
```
不会把 Vue/Flask/SQLite 整套替换当前工程;这会造成三套认证、数据模型和部署入口。当前工程只吸收可验证的领域逻辑,并在每个 adapter 的文件头标注来源和 MIT 许可。真实平台选择器必须经过用户授权和人工扫码验收,不能用 mock 结果代替真实成功。