使用文档
pupu 是一款多平台内容发布浏览器扩展:一次编辑,轻松将内容同步发布到多个社交平台。当前版本为 0.3.0。
安装
pupu 提供已经打包好的扩展压缩包,无需自己编译即可安装使用。
-
下载并解压
在 Releases 页面下载
pupu-v<version>.zip,解压到任意目录。解压后目录中应当直接能看到manifest.json。 -
打开扩展管理页并开启开发者模式
Chrome 输入
chrome://extensions,Edge 输入edge://extensions,打开右上角「开发者模式」。 -
加载已解压的扩展程序
点击左上角「加载已解压的扩展程序」,选中第 1 步解压出的目录。
.crx? 自签名 CRX 无法通过拖拽或普通安装流程安装:Chromium 会校验
CRX 内的 proof 是否由 Chrome 应用商店的私钥签名,否则报 CRX_REQUIRED_PROOF_MISSING(依据见 Chromium
的 crx_verifier.cc:off-store 的 CRX 会按 CRX3_WITH_PUBLISHER_PROOF 校验)。这与怎么打包无关,
加 manifest 的 key 字段或 update_url 都不解决;唯一可用的 CRX 路径是机器级强制企业策略
(ExtensionInstallAllowlist + ExtensionInstallSources,注意必须是 MANDATORY,recommended 会被忽略)。
因此本项目不再提供 .crx,想彻底摆脱「开发者模式」,唯一途径是上架应用商店。
nffpajdealkjpdmjjboneelajanbboig(由签名密钥决定,各版本固定不变)。Edge 与 Chrome 同为 Chromium,共用同一份 .zip。
Linux 桌面 Agent 实验版
pnpm desktop:dev,可使用插件的动态、视频、Markdown 文章编辑器及图片/PPTX/PDF 导入。
平台收纳为窗口内标签,批量执行不弹窗或抢焦点;需要登录时点击「登录 / 查看」或顶部平台标签。
普通适配器自动模式显示「待确认」,不是发布成功;可能已提交或仍执行的任务禁止重载重发。
此路径不需要模型,原 Agent 入口为 pnpm desktop:agent。
下列下载和操作步骤针对已发布的 v0.3.0 小红书试点;开发版未逐一验收所有真实平台。
- 从 Releases 下载
pupu-desktop-v0.3.0-linux-x64.tar.gz,解压并保留完整目录,运行pupu-linux-x64/pupu。不需要 Node.js 或加载扩展。仅提供 Linux x64 归档。 - 单独安装 Ollama。连接本机服务,或在高级设置选择 Ollama 可执行文件,再点击「下载 Qwen3 4B」。模型约 2.5 GB,不包含在应用归档中。
- 输入标题、正文并添加图片,打开平台窗口登录并确认当前账号。点击「让 Agent 自动发布」,确认本次任务后自动执行。
先想了解流程,可在高级设置运行本地模拟发布,不会向互联网发布。正式任务中的正文和图片会上传到小红书;本地模型只读取字段标签。
草稿文字和登录状态可保留,图片选择重启后需要重新添加。缺少内容/图片或模型时点击发布按钮会显示原因;不需要自己操作「观察字段」。Windows/macOS 和手机应用尚未发布。
pnpm desktop:dev
pnpm desktop:smoke # 不需要模型的 Chromium/IPC 冒烟
pnpm desktop:verify # 真实本地 Qwen3 + 模拟发布
pnpm desktop:package
发布流程
CI 同时检查扩展和桌面类型、测试、扩展归档及无模型桌面冒烟。Release 在 Linux runner 打包并验证完整桌面目录,所有产物成功后发布扩展 ZIP、桌面 tar.gz 和 SHA256SUMS,再部署 Pages。Pages 静态版本读取已发布 Release,而非尚未发布的标签。
使用
发布类型
- 动态:只填内容即可。支持添加图片、导入 PPT / PDF 并自动逐页转图片随动态发布。
- 视频:上传视频并发布到支持视频的平台。
- 文章:导入本地 Markdown,可视化编辑 / 预览渲染,图片随正文一起发布。
自动 / 手动发布
底部开关可一键切换发布模式:自动发布在内容填充完成后直接提交;手动发布只把内容填充到各平台页面,由你确认后再发布。首次使用建议先用手动发布确认各平台填充效果。
内容工具栏
- 用
#包裹文字即可添加话题,例如#今日好物#;选中文字可一键包裹为#话题#。 - 输入框内的话题会实时蓝色高亮预览。
- emoji 分类面板共 9 类,包含颜文字。
- 发布到小红书时会自动把
#话题#转换为小红书格式#话题[话题]#;标题超过 20 字会自动跳过标题。
平台与分组
动态 / 视频 / 文章各自的首选平台会单独列出,其余平台统一归入「其它」分组。
| 发布类型 | 首选平台 |
|---|---|
| 动态 | 微博、小红书、知乎、X、脸书 |
| 视频 | 抖音、快手、微信视频号、bilibili、微博、小红书、Youtube |
| 文章 | 微信公众号、知乎、CSDN、51CTO |
其它平台包括掘金、简书、思否、少数派、豆瓣、雪球、即刻、今日头条、百家号、网易号、搜狐号、企鹅号、大鱼号、一点号、东方财富、得物、小黑盒、脉脉、知识星球、阿里云、腾讯云、WordPress、Medium、Instagram、TikTok、LinkedIn、Reddit、Pinterest、Threads、BlueSky、V2EX、Webhook 等,完整列表可在扩展内的平台选择面板查看。
各平台图标内置在扩展本地、离线可用,国内平台按流量池排序置前。部分平台(如即刻、Webhook、知识星球、WordPress)需要先配置圈子 / 地址 / 星球等附加信息。
账号与侧边栏
- 侧边栏显示当前编辑类型的平台列表,切换 Tab 时实时跟随;切到「关于」页会自动关闭侧边栏。
- 顶栏账户头像按当前月份显示 12 生肖,悬停同时显示生肖与星座。点击头像可一键展开侧边栏。
- 账号不会在打开侧边栏时自动刷新,只有点击「刷新账号」才会真正抓取各平台账号;已登录的平台排在最前,常用平台其次,其余平台折叠收纳。
- 「清空账号缓存」需二次确认,清空后会自动重新刷新一次账号。
本地开发与构建
需要 Node.js 与 pnpm。
pnpm install
pnpm dev # 启动 Plasmo 开发模式(热更新)
构建产物的命令:
pnpm build # 本地构建:只产出可「加载已解压」的目录(不出 zip / crx)
pnpm build:ci # 构建并打包 zip(CI 使用)
pnpm package # 只把已构建的产物打包成 zip
pnpm crx # 只打包 CRX(自托管/企业策略场景用,需签名密钥;不能拖拽安装)
pnpm verify:crx # 校验 CRX3 签名与包内内容
本地构建刻意不产出 zip / crx(那些由 CI 生成并附加到 Release),只输出
build/chrome-mv3-prod/,在扩展管理页「加载已解压的扩展程序」中直接导入即可。
scripts/copy-pdf-worker.mjs,把 PDF worker、PDF 图像解码器
WASM 与离线平台图标复制进产物。若直接使用 npx plasmo build,需要手动补跑该脚本,否则 PDF
转图片与平台图标会缺失。
keys/pupu.pem(已被 .gitignore 忽略),CI 从仓库 Secret
CRX_PRIVATE_KEY 读取(Release 已不再需要它)。没有密钥时 pnpm crx 会跳过而不会自动生成新密钥
—— 新密钥会产生新的扩展 ID,已安装用户将收不到更新。
代码检查与测试
pnpm lint # 代码检查(Biome)
pnpm lint:fix # 自动修复
pnpm format # 格式化
pnpm typecheck # 类型检查(tsc --noEmit)
pnpm test # 单元测试(vitest)
CI / CD 与发布
仓库内置三条 GitHub Actions 工作流:
| 工作流 | 触发条件 | 作用 |
|---|---|---|
CI |
push 到 main、PR、手动 |
安装依赖 → pnpm lint → pnpm typecheck → pnpm test →
桌面类型检查与无模型 Chromium 冒烟 → pnpm build:ci,校验产物;再用临时密钥打包 CRX 做冒烟测试(仅验证打包路径可用),最后上传 zip 与解压目录为构建产物
|
Release |
推送 v* 标签、手动 |
校验标签与 package.json 版本一致 → lint + typecheck + test
→ 扩展构建 + Linux 桌面打包/冒烟 → 创建 Release,附上扩展 ZIP、桌面 tar.gz 与 SHA256SUMS(不附 CRX)
|
Deploy Pages |
push 到 main 且改动 docs/**、手动 |
把 docs/ 目录部署到 GitHub Pages(本站在此发布) |
发布一个版本
先改版本号并提交,再打标签(顺序不能反,否则发布流程会因一致性校验失败而中止):
pnpm pkg set version=0.3.0
# 同步更新 docs/releases/v0.3.0.md 并提交相关变更
git commit -am "chore(release): 0.3.0"
git push origin main
git tag v0.3.0 && git push origin v0.3.0
推送标签后,Release 工作流会校验标签与 package.json 版本一致、跑完 lint / 类型检查 / 单元测试、
构建扩展 ZIP 与 Linux 桌面归档(校验 manifest 版本与标签一致),然后发布到 Releases 页面,
并触发一次站点重部署以同步站点上的版本号。也可以在 Actions 页面手动运行 Release 工作流并填写版本号,
输入必须与源码版本一致,且必须提供对应更新说明;它会自动创建对应标签。
package.json。标签与 package.json 不一致时发布流程会直接失败并给出修复命令,
避免仓库版本与已发布版本悄悄漂移。
scripts/inject-site-version.mjs
注入静态页面,页面再用 GitHub API 获取最新 release;发布流程结束时会自动触发一次站点重部署。README 徽章同样由
shields 动态读取,都无需手工维护。
常见问题
安装 .crx 时提示「包无效:CRX_REQUIRED_PROOF_MISSING」?
这是 Chromium 对非商店来源 CRX 的限制,不是打包方式的问题:它会校验 CRX 内的 proof 是否由 Chrome
应用商店的私钥签名,自签名的一律被拒(拖拽、双击都一样),因此本项目已不再提供 .crx。请改用
.zip + 「加载已解压的扩展程序」。若确实需要 CRX 部署,只能走机器级强制企业策略
(ExtensionInstallAllowlist + ExtensionInstallSources);要彻底摆脱「开发者模式」,唯一途径是上架
Chrome Web Store / Edge 加载项商店,且上架与后续更新都要沿用同一把签名密钥以保持扩展 ID 不变。
安装后扩展被浏览器停用 / 提示来自非应用商店?
这是不经过应用商店安装的浏览器限制,与扩展本身无关:需保持扩展管理页右上角的「开发者模式」开启, 否则这类扩展可能被浏览器自动停用。
有 Safari 版本吗?
暂时没有。Safari 扩展不能像 .crx 那样单独分发,必须由 Xcode 打包成宿主 App 并通过 App Store
分发;另外本扩展依赖的 sidePanel(侧边栏选平台)与 tabGroups 在 Safari 上并不存在,即使转换出来核心流程也无法工作。
扩展里的 PDF / 平台图标显示不出来?
通常是没有执行复制脚本导致的。重新运行 pnpm build:ci(或 pnpm dev)即可,产物中应当存在
pdf.worker.min.mjs、wasm/ 与 assets/platforms/。
为什么标题没有发布出去?
部分平台(如小红书)标题有长度限制,超过 20 字时会自动跳过标题,只发布正文内容。
为什么打开侧边栏没有显示我的账号?
账号只在点击「刷新账号」时抓取,不会自动刷新。请先在各平台登录,再点击「刷新账号」;若仍未显示,可尝试「清空账号缓存」后重新刷新。
遇到问题或想新增平台?
欢迎到 GitHub Issues 反馈,或在扩展内点击「提交反馈」/「发送邮件」。
权限说明
扩展申请的权限与用途如下(见 package.json 中的 manifest 字段):
| 权限 | 用途 |
|---|---|
host_permissions |
访问 https://*/* 与本地地址,用于在目标平台页面填充 / 发布内容 |
cookies |
读取各平台的登录状态,用于判断账号是否已登录 |
tabs / tabGroups |
为每个同步任务打开管理标签页,并在侧边栏中管理这些标签 |
scripting |
向目标页面注入内容填充与抓取脚本 |
activeTab |
在当前活动标签页上执行用户主动触发的操作 |
sidePanel |
提供平台选择与账号管理的侧边栏界面 |
background |
在后台协调各平台标签页与同步任务 |
扩展会把内容发布到你自己已经登录的平台;除此之外,扩展会请求项目自身的同步服务
https://pupu.app(开发模式下为 http://localhost:3000)用于账号数据同步。设置页的「可信域名」
用于授权特定网站调用扩展的发布能力,请只添加你信任的域名。