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

6.0 KiB
Raw Blame History

参考仓库分析记录

仓库一: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 + 非空结果/错误分类硬校验

三个参考系统的关系

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 结果代替真实成功。