Skip to content

Repository files navigation

polypost

多平台内容发布工具 · 七牛云 × XEngineer 新工科计划 第二批参赛作品(议题二)

Next.js React TypeScript Tailwind CSS 七牛云 议题二 License: MIT

🎬 Demo 视频(2.5 分钟):https://b23.tv/3jWGsgj · 🔗 在线体验:http://101.133.166.220:3000

一份内容(文字 / 语音 / 视频)→ AI 按平台调性自动改写 → 发布前合规预检 → 各平台原生预览 → 一键导出 / 发布 全链路跑在七牛云,国内可直接访问、零密钥配置即可试用。


📖 目录

它解决什么 · 核心能力 · 60 秒体验 · 架构设计 · 七牛云能力 · 技术栈 · 本地运行 · 部署 · 工程质量 · 路线图 · 原创声明


它解决什么

一个负责多平台内容运营的人,每天要把一份内容手动改成小红书 / 公众号 / 知乎 / 微博 / B站 / 抖音 六种原生风格、守各平台规范、防违规、再逐个后台发出去——逐平台手改是时间黑洞,小红书格式错乱是高频翻车,发错一条违规内容更是事故。

polypost 把这条链收进一个内容运营控制台。核心理念是 「加速人,而不是取代人」:自动做掉批量适配 + 初步合规,把容易出错、违规的地方标出来让运营一眼扫到、快速改,人只需复检一遍、一键发。详见 docs/产品愿景与需求.md


✨ 核心能力

能力 说明
按平台调性 AI 改写 同一份内容产出 6 平台(小红书 / 微博 / 知乎 / B站 / 公众号 / 抖音)原生风格稿(标题 / emoji / 话题标签 / 版式各异),七牛 LLM;🧠 智能选型按内容类型推荐最合适模型(图文笔记 → 豆包 / 长文 → Qwen3 / 视频 → Kimi),一键采纳。
视频 → 图文(创新) 上传视频 → 七牛 Dora avthumb(pfop 持久化)抽音轨为 mp3 → 七牛 ASR 转写为正文初稿,再走多平台改写。
语音 → 图文 浏览器现场录音 / 上传音频 / 一键示例 → 七牛 ASR 转写填入正文。
🔑 品牌词 · 禁改词 + 校验没丢(创新 ·「加速人」核心) 运营标记品牌词 / 禁改词(产品名 / 价格 / 卖点)→ 改写时作为硬约束注入 LLM → 每平台成稿后自动核对,丢了在该卡红条提示,点编辑 / AI 重改补回。
真实发布前合规预检 接七牛内容审核,fail-closed(异常一律转人工,绝不放行);原稿 + 各平台成稿双层审核;顶部「红绿灯」聚合 pass / review / block。
易错点标注 扫描广告法违禁 / 绝对化 / 医疗夸大 / 诱导词,在原稿面板与成稿里标红 + 给改写建议
可编辑预览 + AI 重改 每张平台原生预览卡可手动改(改完自动重跑合规复检、更新红绿灯),或 🤖 AI 去违禁 / 绝对化重写;改完一键导出 / 发布。
多图笔记 导入 / 拖拽多张图(第 1 张为封面);小红书缩略图条 / 微博九宫格 / 各平台图集;导出整包带全部图。
平台原生预览 把成稿渲染成读者在小红书 / 微博 / 知乎 / B站 / 公众号 / 抖音 实际刷到的样子(含抖音暗色竖版视频卡),一眼看出格式对不对;每张卡一键复制。
审核必经 → 发布管理(导出 / 定时 / 发布) 内容须过合规审核才进发布管理:📦 导出全平台包(各平台文案 + 图打成 zip,半自动真闭环,手机粘贴即发)、⏰ 定时、🧪 模拟发布。发布方式诚实标注 真实 / 半自动 / 模拟:仅公众号草稿是真实 API,其余无开放发布接口走半自动、未真实推送;数据看板亦标注演示数据。
作品 > 平台版本(各平台独立走流程) 一个作品挂多个平台版本,每个独立走 待审 → 通过(待发布)→ 发布,可逐个或全部操作、可逐步撤回;审批流(✓ 已通过 / ✗ 已驳回 + 理由)+ 数据看板。

⏱ 60 秒体验路径(评委可直接走一遍)

流程是一条线:① 创作 → ② 审核 → ③ 发布 → ④ 数据(左侧导航即此顺序,审核必经、无直接发布旁路)。

  1. 打开在线地址 → 创作台已预填样例稿,点 「生成多平台预览」 → 右侧出各平台原生风格卡(emoji 种草 / 理性 / 正式 文案迥异——按调性改写,非复制粘贴);勾上「抖音」还能看暗色竖版视频卡。
  2. 正文工具栏点 🎙 语音 →「用示例语音」 → 七牛 ASR 几秒转写(零配置验证 ASR);视频 → 图文同样支持(Dora 抽音轨 + ASR)。
  3. 「更多」里填 🔑 品牌词 · 禁改词(如 限时399)→ 生成 → 哪个平台改丢了会红条报警;任一卡 ✏️ 编辑 / 🤖 AI 重改
  4. 点卡片 「提交审核」(创作台唯一出口)→ 卡片从预览消失、转入 ② 合规中心
  5. 合规中心:各平台版本逐个过七牛内容审核,命中的违禁 / 敏感词标红列出并给改写建议;可就地 ✏️ 改违禁词、通过 / 驳回(作品级「全部通过 / 退回重做」)。
  6. ③ 发布管理:已过审的内容 「📦 导出全平台包」(各平台文案 + 图打包,手机粘贴即发)/ 发布 / 定时;发布方式 真实 / 半自动 / 🧪 模拟 诚实标注。左下 「🎬 载入演示数据」 → 看合规中心 / 发布管理 / ④ 数据看板(均如实标注演示数据)。

🏗 架构:扩展更多平台的设计(赛题要求)

graph TD
  IN["输入<br/>文字 / 语音 / 视频"] --> DORA["七牛 Dora<br/>视频抽音轨 pfop"]
  IN --> ASR["七牛 ASR"]
  DORA --> ASR
  IN --> CC["CanonicalContent<br/>平台无关内容模型"]
  ASR --> CC
  CC --> REG["PlatformRegistry"]
  REG --> AD["每平台 Adapter<br/>adaptationProfile 调性"]
  AD --> LLM["七牛 LLM 按调性改写<br/>智能选型 + 卖点约束"]
  LLM --> TF["transform<br/>纯函数投影 payload"]
  TF --> CEN["七牛内容审核<br/>原稿+成稿 fail-closed"]
  CEN --> PV["可编辑预览 + AI 重改<br/>读者视角原生卡"]
  PV --> PUB["导出包 / 定时 / 模拟发布"]
  PUB --> LC["生命周期 / 审批 / 数据"]
Loading

统一内容模型 CanonicalContent + 平台适配契约 PlatformAdapter<TDraft, TPrepared, A> + 注册表 + 类型化流水线。新增一个平台 = 写一个 Adapter(或一个配置对象)+ 注册一行,核心编排层零改动

// 抖音正是这样内置的——一个配置对象 + 一行注册(本作品现含 6 个平台)
const DOUYIN = createMockPlatformAdapter({
  platform: "douyin",
  displayName: "抖音",
  capabilities: { bodyFormat: "plain", maxTitleLength: 30, maxImages: 12, maxTags: 5, allowExternalLinks: false, supportsVideo: true },
  adaptationProfile: { tone: "短平快、强钩子、玩梗", emojiPolicy: "sparse", hashtagPolicy: { use: true, max: 5, placement: "end" }, forbiddenClaims: ["绝对化用语"] },
});
registry.register(DOUYIN);

TDraft(转换后)与 TPrepared(资产准备后)用泛型区分,从类型层面阻止未准备好的内容流到 publish


☁️ 七牛云能力(全部后端调用,密钥仅存后端 env)

七牛能力 用途 端点
AI 大模型推理 按平台调性改写(LLM)、语音 / 视频转写(ASR) api.qnaigc.com/v1(OpenAI 兼容)
内容审核 发布前合规预检(文本,fail-closed) ai.qiniuapi.com/v3/text/censor(QiniuMac 鉴权)
Kodo 对象存储 录制 / 上传音视频托管成公网 URL 喂给 ASR / Dora 区域自动解析 + 上传凭证
Dora 媒体处理 视频抽音轨为 mp3(avthumb,pfop 持久化异步 + 轮询) api.qiniu.com/pfop(QBox 鉴权)

🛠 技术栈与依赖(规则要求列明)

依赖 版本 用途
next 16.2.6 全栈框架(App Router, Turbopack)
react / react-dom 19.2.4 UI
typescript ^5 类型
tailwindcss / @tailwindcss/postcss ^4 样式
motion ^12 动效(motion/react
lucide-react ^1.17 界面线性图标
jszip ^3.10 「导出全平台包」客户端打包 zip
geist ^1.7 自托管字体(构建期不外联 Google Fonts)
openai ^6 调七牛 AI 推理(OpenAI 兼容,仅改 baseURL)
zod ^4 API 输入校验
vitest ^4 单元测试
eslint / eslint-config-next ^9 / 16.2.6 代码规范

node:crypto 用于七牛 QiniuMac / 上传凭证签名(Node 内置)。


💻 本地运行

npm install
cp .env.example .env.local   # 填入七牛云 key(QINIU_AI_API_KEY 必填;AK/SK + Kodo 可选,启用合规与语音托管)
npm run dev                  # http://localhost:3000
npm test                     # vitest(63 例)

🚀 部署(国内可访问,零配置)

*.workers.dev 在中国大陆被 GFW 解析污染、评委打不开,因此弃用 Cloudflare,改用国内 Node 服务器 + 原生 next start

# 1) 本机:同步代码 + 后端密钥到服务器
rsync -az --exclude node_modules ./ root@<服务器IP>:~/polypost/
# 2) 服务器:一键部署(装 Node、swap、build、pm2 守护 next start :3000)
bash ~/polypost/deploy/setup.sh

国内裸 IP + 非标准端口免备案;密钥预置后端 env,评委零配置。见 deploy/setup.sh。当前实例:http://101.133.166.220:3000


🔧 工程质量(对应「开发过程与质量」)

  • 安全两轮硬化(经对抗式审查):合规 fail-closed、publish 服务端重校验(收 content 不收前端 payload,重跑 transform + 合规,闸门不可绕过)、Zod 输入校验 + 资源上限、模型 allowlist、URL SSRF 防护、pass-only 发布闸门。
  • 测试vitest 63 例——QiniuMac 签名串格式、合规 fail-closed 各分支、发布越权拦截、语音 WAV 编码、请求 schema、风险词扫描、必保留要点解析 / 校验。
  • 规范:Conventional Commits;每个 PR 只做一件事 + 四段描述(改了什么 / 功能 / 思路 / 测试);跨三天持续提交 40+ PR
  • UI 自测:用浏览器自动化(真实 Chrome 截图)对关键流程做端到端自测,交付前自查。

🗺 路线图

  • 6 平台调性改写(小红书 / 微博 / 知乎 / B站 / 公众号 / 抖音)· 🧠 智能选型 · 真实合规预检(原稿 + 成稿双层)· 易错点标注 · 可编辑预览 + 🤖 AI 重改 · 🔑 锁定关键卖点
  • 语音 → 图文 · 视频 → 图文(Dora avthumb 抽音轨 + ASR)· 多图笔记 · 一键导出全平台包 · ⏰ 定时发布 · 内容生命周期 / 审批 / 数据看板 · 部署上线
  • 公众号真实草稿(draft/add,需已认证服务号凭据)· 小红书模板封面生成 · 真实数据回流

📑 引用与原创声明

  • 第三方依赖均为开源库,见上表。
  • 核心逻辑(内容模型、Adapter 架构与注册表、调性适配、智能选型、合规预检与复检、语音 / 视频转写链路、Dora pfop 封装、锁定卖点校验、可编辑预览 + AI 重改、平台原生预览、多图打包导出、风险词扫描)均为本作品原创,未复用历史代码。

📄 License

MIT

About

多平台内容发布与合规预检工具 · 一份内容→AI按平台调性改写→发布前合规预检→原生预览→一键发布

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages