$npx -y skills add QuZhan51496/paper2anything --skill paper2xhs把学术论文 PDF 转成小红书多图帖(标题 + 正文 + 标签 + 封面 + 论文主图/主实验结果配图)。你主导设计的协调式:机械活(MinerU 解析 PDF、生成封面与配图、半自动发布)交给 scripts/ 下的小工具,论文理解、选题角度、文案撰写由你亲自完成并在关键点与用户确认。当用户说“论文转小红书”、“paper2xhs”、“把这篇论文发小红书”、“论文转社交媒体”、“PDF 转小红书帖子”时触发。
| 1 | # paper2xhs — 论文转小红书(你主导的协调式) |
| 2 | |
| 3 | 把一篇论文 PDF 转成小红书帖子。**你是主笔**:这份文件是配方,不是全自动脚本—— |
| 4 | 没有 `main.py`。机械步骤(解析 / 封面 / 发布)调用 `scripts/` 下的小工具;**论文理解、 |
| 5 | 选题角度、文案撰写由你亲自完成**(用 Read 看材料、用 Write 落产物),并在关键点用 |
| 6 | `AskUserQuestion` 与用户确认。 |
| 7 | |
| 8 | ```text |
| 9 | |
| 10 | → 解析 (parse_pdf.py:MinerU → parsed/ + figures/) |
| 11 | → 你读懂论文 (读 parsed/ + 看 figures/) → understanding/paper_understanding.json [确认选题角度] |
| 12 | → 你写小红书文案 (标题/正文/标签/封面文字) → xhs_post.json + xhs_post.md [确认文案] |
| 13 | → 封面+配图 (cover.py 封面:默认 API 生图 gpt-image-2、无 key 回退本地合成; |
| 14 | post_images.py 配图:把你选的论文主图/主实验图按序复制成图集,原图直出) |
| 15 | → 半自动发布 (publish.py:封面+配图多图帖,可选) |
| 16 | → 小红书帖子 |
| 17 | ``` |
| 18 | |
| 19 | ## 运行方式 |
| 20 | |
| 21 | 1. **一步步来**:机械步骤用 `Bash` 调脚本,创作步骤你自己用 `Read` / `Write` 做。不要试图一条命令跑完。 |
| 22 | 2. **每个 Bash 块开头就地算 `WORKDIR`**——各 Bash 调用是独立 shell、不共享变量,所以别指望 `export` 跨步存活: |
| 23 | ```bash |
| 24 | WORKDIR="$(dirname "$pdf_path")/.paper2anything/xhs/$(basename "${pdf_path%.*}")" |
| 25 | ``` |
| 26 | 其中 `$pdf_path` 是用户给的论文 PDF 路径(每个块都重新设一次)。脚本在 `${SKILL_DIR}/scripts`——`SKILL_DIR` |
| 27 | 是**本 skill 的目录**(见本 skill 顶部注入的 "Base directory for this skill: …");各 Bash 块独立 shell, |
| 28 | 用到它的块开头按需 `export SKILL_DIR=<那个目录>` 一次(和 `WORKDIR` 一样每块现设)。 |
| 29 | 3. **在两个决策点用 `AskUserQuestion` 暂停**:① 读懂论文后确认“选题角度”;② 文案成稿后确认。用户想改,可直接改产物 JSON/MD 或告诉你改。 |
| 30 | 4. **小红书是“准确、不夸大的科普”**:忠实反映论文贡献,口语化、有钩子,但**绝不编造数据或夸大结论**。 |
| 31 | |
| 32 | --- |
| 33 | |
| 34 | ## Step 0:环境与凭据 |
| 35 | |
| 36 | > **统一环境**:所有 `python` 命令都在 paper2anything 的统一 conda 环境里(顶层 `environment.yml` 创建),命令以 `conda run -n paper2anything --no-capture-output` 为前缀。 |
| 37 | |
| 38 | 凭据集中在 paper2anything 包根的 `.env`(从 `.env.example` 复制,已 gitignore)。每个新 shell 先导出一次: |
| 39 | |
| 40 | ```bash |
| 41 | set -a; source <paper2anything 包根>/.env; set +a |
| 42 | ``` |
| 43 | |
| 44 | 本 skill 用到的 key(**理解与文案由你亲自做,不调用任何 LLM API**): |
| 45 | - `MINERU_API_TOKEN` — 解析 PDF(必填) |
| 46 | - `OPENAI_API_KEY`(+ `OPENAI_BASE_URL`) — 封面默认走它生图(gpt-image-2);无 key 或 key 不可用时回退本地合成(复用论文原图) |
| 47 | - `XHS_MCP_BIN` — 可选:自定义 [xiaohongshu-mcp](https://github.com/xpzouying/xiaohongshu-mcp) 二进制位置;**不设则发布时 skill 自动按平台下载**到 `~/.paper2anything/xhs/`。另可选 `XHS_MCP_URL`(自定义服务地址/端口,默认 `http://localhost:18060`)。 |
| 48 | |
| 49 | 依赖自检(缺啥按提示装;依赖统一在 `environment.yml`): |
| 50 | |
| 51 | ```bash |
| 52 | conda run -n paper2anything --no-capture-output python -c "import requests, rich, dotenv" 2>&1 |
| 53 | ``` |
| 54 | |
| 55 | --- |
| 56 | |
| 57 | ## Step 1:解析 PDF(脚本) |
| 58 | |
| 59 | ```bash |
| 60 | pdf_path="/path/to/paper.pdf" # ← 用户的论文 PDF |
| 61 | WORKDIR="$(dirname "$pdf_path")/.paper2anything/xhs/$(basename "${pdf_path%.*}")" |
| 62 | conda run -n paper2anything --no-capture-output \ |
| 63 | python "${SKILL_DIR}/scripts/parse_pdf.py" "$pdf_path" --workdir "$WORKDIR" |
| 64 | ``` |
| 65 | |
| 66 | 产出(`$WORKDIR` 下): |
| 67 | - `parsed/paper_meta.json`(title / authors / abstract)、`parsed/sections.json`(`[{title, content}]`)、`parsed/figures_index.json`(`[{figure_id, caption, image_path, page}]`,`image_path` 已指向 `figures/` 实体)、`parsed/references.json` |
| 68 | - `figures/*` 论文插图实体 |
| 69 | |
| 70 | 解析完,先 `Read` `parsed/sections.json` 与 `parsed/paper_meta.json` 通读全文。 |
| 71 | |
| 72 | --- |
| 73 | |
| 74 | ## Step 2:读懂论文 → 写 understanding(你来做)[确认] |
| 75 | |
| 76 | 这是创作的地基,**你自己做判断**,不要交给脚本: |
| 77 | |
| 78 | 1. `Read` `parsed/sections.json`(全文)+ `parsed/paper_meta.json`;`Read` `parsed/figures_index.json` 看图注(个别图 caption 可能为空;多面板大图可能被解析器拆成两半、完整图注只挂在其中一半上,且拆缝处图例/轴标签可能被裁——一律以实际看图为准),并**实际 `Read` 几张候选图片**(`figures/` 下)判断哪些清晰、适合做封面或配图——图注说“framework”的图在小图里未必好看,只有你的眼睛能判断。 |
| 79 | 2. 用 `Write` 落 `understanding/paper_understanding.json`,schema: |
| 80 | ```json |
| 81 | { |
| 82 | "paper_title": "...", "method_name": "方法简称(如 AccKV)", |
| 83 | "one_sentence_summary": "一句话讲清这篇做了什么", |
| 84 | "problem": "解决什么问题", "method": "怎么做的", |
| 85 | "highlights": ["有数据支撑的亮点1", "创新点2", "应用价值3"], |
| 86 | "experiment_results": ["关键数据1(含数字)", "..."], |
| 87 | "keywords": ["领域关键词", "..."], |
| 88 | "cover_palette": {"bg": "#F4F5F7", "accent": "#2E86AB"}, |
| 89 | "important_figures": [ |
| 90 | {"figure_id": "fig_1", "image_path": "<figures_index.json 里的真实路径>", |
| 91 | "suitable_for_cover": true, "importance_score": 0.9, "description": "图说明"} |
| 92 | ], |
| 93 | "post_figures": [ |
| 94 | {"image_path": "<figures_index.json 里的真实路径>"} |
| 95 | ] |
| 96 | } |
| 97 | ``` |
| 98 | - `important_figures` 必须含 `image_path`(取自 `parsed/figures_index.json`,指向真实存在的图)、`suitable_for_cover`、`importance_score`——封面默认走 API 生图(gpt-image-2),仅当 `OPENAI_API_KEY` 未配/不可用时回退本地合成、靠这几个字段复用原图;漏了则回退时无图 → 封面 `skipped`。 |
| 99 | - `post_figures`(多图帖正文配图,建议 2~4 张、按展示顺序排):**第一张放论文主图**(框架/方法总览), |
| 100 | 其后放**主实验结果图**;只放你亲眼 `Read` 过、缩到手机宽度仍清晰可读的图。配图**原图直出、 |
| 101 | 不做任何加工**。发布时图集 = 封面 + 这些配图。 |
| 102 | - `cover_palette`(可选):本地合成回退路径的配色,按论文领域选 `bg`(浅色打底) + `accent`(强调色),标题字色会随底色深浅自动适配。参考浅色调:通用 `#F4F5F7`+`#2E86AB`、生物 `#EEF6F0`+`#2D8A5F`、物理数学 `#F1ECF8`+`#6A30C2`、工程 `#FBF0EC`+`#D85A3C`、社科 `#F4EEF2`+`#8A5A78`、化学 `#EAF4F8`+`#0E86C0`。 |
| 103 | 3. 用 `AskUserQuestion` 与用户确认**选题角度**:这篇论文发小红书主打哪个亮点 / 用什么钩子 / 面向哪类读者。带着确认结果再写文案。 |
| 104 | |
| 105 | --- |
| 106 | |
| 107 | ## Step 3:写小红书帖子(你来做)[确认] |
| 108 | |
| 109 | 按小红书风格**亲自撰写**,用 `Write` 落 `xhs_post.json` 和 `xhs_post.md`。 |
| 110 | |
| 111 | **小红书文案规则(领域知识):** |
| 112 | - **标题** ≤20 字,吸睛:含核心价值、或数字、或对比、或悬念式提问。 |
| 113 | - **正文 300–600 字**,结构 |