6.0 KiB
6.0 KiB
参考仓库分析记录
仓库一: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、
/loginSSE、Cookie 导入四步状态机、异步/postVideo、任务状态轮询、草稿批量发布和分片上传。 - 关键调用链:
backend/app.py:672-708登录 SSE;backend/app.py:719-847Cookie 导入与 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-330v2 多 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 + 非空结果/错误分类硬校验 |
三个参考系统的关系
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 独立实现和测试
合并策略
参考仓库(只读)
├─ 平台参数/登录/上传思路 ──> PlatformAdapter 接口
├─ SSE/任务队列思路 ────────> Browser WS + DB 状态
├─ 批量账号轮换/定时参数 ───> 当前任务请求和调度器
└─ 页面信息架构 ────────────> 当前 React + TDesign 页面
不会把 Vue/Flask/SQLite 整套替换当前工程;这会造成三套认证、数据模型和部署入口。当前工程只吸收可验证的领域逻辑,并在每个 adapter 的文件头标注来源和 MIT 许可。真实平台选择器必须经过用户授权和人工扫码验收,不能用 mock 结果代替真实成功。