paper2xhs
GitHub将学术论文PDF转化为小红书帖子。AI主导选题与文案创作,确保内容准确不夸大;调用脚本解析PDF及生成封面。在理解论文和定稿两个关键点暂停确认,实现人机协作的高效内容生产。
Trigger Scenarios
Install
npx skills add QuZhan51496/paper2anything --skill paper2xhs -g -y
SKILL.md
Frontmatter
{
"name": "paper2xhs",
"description": "把学术论文 PDF 转成小红书帖子(标题 + 正文 + 标签 + 封面)。你主导设计的协调式:机械活(MinerU 解析 PDF、生成封面、半自动发布)交给 scripts\/ 下的小工具,论文理解、选题角度、文案撰写由你亲自完成并在关键点与用户确认。当用户说“论文转小红书”、“paper2xhs”、“把这篇论文发小红书”、“论文转社交媒体”、“PDF 转小红书帖子”时触发。",
"allowed-tools": "Bash, Read, Write, Glob, Grep, AskUserQuestion, SendUserFile"
}
paper2xhs — 论文转小红书(你主导的协调式)
把一篇论文 PDF 转成小红书帖子。你是主笔:这份文件是配方,不是全自动脚本——
没有 main.py。机械步骤(解析 / 封面 / 发布)调用 scripts/ 下的小工具;论文理解、
选题角度、文案撰写由你亲自完成(用 Read 看材料、用 Write 落产物),并在关键点用
AskUserQuestion 与用户确认。
PDF
→ 解析 (parse_pdf.py:MinerU → parsed/ + figures/)
→ 你读懂论文 (读 parsed/ + 看 figures/) → understanding/paper_understanding.json [确认选题角度]
→ 你写小红书文案 (标题/正文/标签/封面文字) → xhs_post.json + xhs_post.md [确认文案]
→ 封面 (cover.py:默认 API 生图 gpt-image-2;无 key/key 不可用回退本地合成复用原图)
→ 半自动发布 (publish.py,可选)
→ 小红书帖子
运行方式
- 一步步来:机械步骤用
Bash调脚本,创作步骤你自己用Read/Write做。不要试图一条命令跑完。 - 每个 Bash 块开头就地算
WORKDIR——各 Bash 调用是独立 shell、不共享变量,所以别指望export跨步存活:
其中WORKDIR="$(dirname "$pdf_path")/.paper2anything/xhs/$(basename "${pdf_path%.*}")"$pdf_path是用户给的论文 PDF 路径(每个块都重新设一次)。脚本在${SKILL_DIR}/scripts——SKILL_DIR是本 skill 的目录(见本 skill 顶部注入的 "Base directory for this skill: …");各 Bash 块独立 shell, 用到它的块开头按需export SKILL_DIR=<那个目录>一次(和WORKDIR一样每块现设)。 - 在两个决策点用
AskUserQuestion暂停:① 读懂论文后确认“选题角度”;② 文案成稿后确认。用户想改,可直接改产物 JSON/MD 或告诉你改。 - 小红书是“准确、不夸大的科普”:忠实反映论文贡献,口语化、有钩子,但绝不编造数据或夸大结论。
Step 0:环境与凭据
统一环境:所有
python命令都在 paper2anything 的统一 conda 环境里(顶层environment.yml创建),命令以conda run -n paper2anything --no-capture-output为前缀。
凭据集中在 paper2anything 包根的 .env(从 .env.example 复制,已 gitignore)。每个新 shell 先导出一次:
set -a; source <paper2anything 包根>/.env; set +a
本 skill 用到的 key(理解与文案由你亲自做,不调用任何 LLM API):
MINERU_API_TOKEN— 解析 PDF(必填)OPENAI_API_KEY(+OPENAI_BASE_URL) — 封面默认走它生图(gpt-image-2);无 key 或 key 不可用时回退本地合成(复用论文原图)XHS_MCP_BIN— 可选:自定义 xiaohongshu-mcp 二进制位置;不设则发布时 skill 自动按平台下载到~/.paper2anything/xhs/。另可选XHS_MCP_URL(自定义服务地址/端口,默认http://localhost:18060)。
依赖自检(缺啥按提示装;依赖统一在 environment.yml):
conda run -n paper2anything --no-capture-output python -c "import requests, rich, dotenv" 2>&1
Step 1:解析 PDF(脚本)
pdf_path="/path/to/paper.pdf" # ← 用户的论文 PDF
WORKDIR="$(dirname "$pdf_path")/.paper2anything/xhs/$(basename "${pdf_path%.*}")"
conda run -n paper2anything --no-capture-output \
python "${SKILL_DIR}/scripts/parse_pdf.py" "$pdf_path" --workdir "$WORKDIR"
产出($WORKDIR 下):
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.jsonfigures/*论文插图实体
解析完,先 Read parsed/sections.json 与 parsed/paper_meta.json 通读全文。
Step 2:读懂论文 → 写 understanding(你来做)[确认]
这是创作的地基,你自己做判断,不要交给脚本:
Readparsed/sections.json(全文)+parsed/paper_meta.json;Readparsed/figures_index.json看图注(个别图 caption 可能为空,以实际看图为准),并实际Read几张候选图片(figures/下)判断哪些清晰、适合做封面或配图——图注说“framework”的图在小图里未必好看,只有你的眼睛能判断。- 用
Write落understanding/paper_understanding.json,schema:{ "paper_title": "...", "method_name": "方法简称(如 AccKV)", "one_sentence_summary": "一句话讲清这篇做了什么", "problem": "解决什么问题", "method": "怎么做的", "highlights": ["有数据支撑的亮点1", "创新点2", "应用价值3"], "experiment_results": ["关键数据1(含数字)", "..."], "keywords": ["领域关键词", "..."], "cover_palette": {"bg": "#F4F5F7", "accent": "#2E86AB"}, "important_figures": [ {"figure_id": "fig_1", "image_path": "<figures_index.json 里的真实路径>", "suitable_for_cover": true, "importance_score": 0.9, "description": "图说明"} ] }important_figures必须含image_path(取自parsed/figures_index.json,指向真实存在的图)、suitable_for_cover、importance_score——封面默认走 API 生图(gpt-image-2),仅当OPENAI_API_KEY未配/不可用时回退本地合成、靠这几个字段复用原图;漏了则回退时无图 → 封面skipped。cover_palette(可选):本地合成回退路径的配色,按论文领域选bg(浅色打底) +accent(强调色),标题字色会随底色深浅自动适配。参考浅色调:通用#F4F5F7+#2E86AB、生物#EEF6F0+#2D8A5F、物理数学#F1ECF8+#6A30C2、工程#FBF0EC+#D85A3C、社科#F4EEF2+#8A5A78、化学#EAF4F8+#0E86C0。
- 用
AskUserQuestion与用户确认选题角度:这篇论文发小红书主打哪个亮点 / 用什么钩子 / 面向哪类读者。带着确认结果再写文案。
Step 3:写小红书帖子(你来做)[确认]
按小红书风格亲自撰写,用 Write 落 xhs_post.json 和 xhs_post.md。
小红书文案规则(领域知识):
- 标题 ≤20 字,吸睛:含核心价值、或数字、或对比、或悬念式提问。
- 正文 300–600 字,结构:
- 开头 1–2 句钩子,抓住注意力
- 这篇论文是什么、解决什么问题(2–3 句)
- 3–5 个核心亮点,每点用 emoji 开头,简洁有力
- 1–3 个关键实验数据,要具体
- 对读者有什么用(1–2 句)
- 结尾引导互动(如“你觉得这方法能用在哪?”)
- 风格:口语化、易读、不端学术腔,但忠实准确、不夸大、不编数据。
- 标签 8–12 个,写在正文末尾;
hashtags字段同步放这些标签(发布脚本读hashtags)。 - 封面文字
cover_text≤15 字(封面大字用)。
产物 schema —— xhs_post.json:
{"title": "...", "body": "含 emoji/换行,末尾带标签的完整正文",
"hashtags": ["#标签1", "#标签2"], "cover_text": "≤15字封面词", "paper_title_zh": "论文中文标题"}
xhs_post.md:第一行 # {title},然后正文;可在顶部放  占位(封面在 Step 4 生成)。
写完用 AskUserQuestion 给用户看标题 + 正文摘要,确认或按反馈修改(可直接改 JSON/MD)。
Step 4:生成封面(脚本,可选)
封面主/副标题此刻由你现拟(你已读透论文,比从 JSON 里捡更贴切),经 --title(主标题大字)/ --subtitle(副标题小字)传入:
pdf_path="/path/to/paper.pdf"
WORKDIR="$(dirname "$pdf_path")/.paper2anything/xhs/$(basename "${pdf_path%.*}")"
conda run -n paper2anything --no-capture-output \
python "${SKILL_DIR}/scripts/cover.py" --workdir "$WORKDIR" \
--title "你拟的封面主标题大字" --subtitle "你拟的副标题小字"
逻辑:默认用 OPENAI_IMAGE_MODEL(默认 gpt-image-2)生成竖版封面,主标题大字用你传入的 --title、副标题小字用 --subtitle(留空才分别回退 xhs_post.cover_text / 论文标题);未配 OPENAI_API_KEY 或 key 不可用时回退本地合成——复用 understanding.important_figures 里 suitable_for_cover 最高分的论文原图(叠加 --title,配色取 cover_palette);两者都不可用则 skipped(不阻断流程)。产出 cover.png。
Step 5:发布到小红书(脚本 + 你协调,可选)
发布走开源的 xiaohongshu-mcp(自带无头 Chromium 的单二进制 + REST API)。登录一次后 cookies 持久、之后免登录。二进制由 ① 自动备好(XHS_MCP_BIN 仅自定义位置时配,见 Step 0)。首次配置/登录的分环境完整步骤见 references/publish-guide.md——先 Read 它。不发布就跳过本步,把产物路径告诉用户手动发。
① 确保 mcp 二进制就位并在固定持久目录运行(二进制不存在会自动下载;cookies 落这里、跨论文复用):
export XHS_MCP_DIR="$HOME/.paper2anything/xhs"; mkdir -p "$XHS_MCP_DIR"
# 解析二进制:优先 .env 的 XHS_MCP_BIN;否则用持久目录里的;都没有就按平台自动下载
if [ -n "$XHS_MCP_BIN" ] && [ -x "$XHS_MCP_BIN" ]; then BIN="$XHS_MCP_BIN"; else
case "$(uname -s)-$(uname -m)" in
Linux-x86_64) ASSET=xiaohongshu-mcp-linux-amd64 ;;
Darwin-arm64) ASSET=xiaohongshu-mcp-darwin-arm64 ;;
Darwin-x86_64) ASSET=xiaohongshu-mcp-darwin-amd64 ;;
*) ASSET= ; echo "未知平台,请手动下载 xiaohongshu-mcp 并在 .env 设 XHS_MCP_BIN" ;;
esac
BIN="$XHS_MCP_DIR/$ASSET"
if [ -n "$ASSET" ] && [ ! -x "$BIN" ]; then
echo "未找到 mcp 二进制,自动下载 $ASSET …"
curl -fL -o "$XHS_MCP_DIR/$ASSET.tar.gz" "https://github.com/xpzouying/xiaohongshu-mcp/releases/latest/download/$ASSET.tar.gz" \
&& tar xzf "$XHS_MCP_DIR/$ASSET.tar.gz" -C "$XHS_MCP_DIR" && chmod +x "$BIN"
fi
fi
# 起服务(已在跑就跳过;BIN 不可用则报错、不硬起)
if ! curl -sf http://localhost:18060/api/v1/login/status >/dev/null 2>&1; then
if [ ! -x "$BIN" ]; then
echo "mcp 二进制不可用($BIN)——下载失败或平台不支持,无法发布;手动下载并设 XHS_MCP_BIN,见 references/publish-guide.md"
else
( cd "$XHS_MCP_DIR" && nohup "$BIN" -port=:18060 > mcp.log 2>&1 & )
for i in $(seq 1 30); do curl -sf http://localhost:18060/api/v1/login/status >/dev/null 2>&1 && break; sleep 2; done
fi
fi
(首次会下载 mcp 二进制 + 其 Chromium(约 150MB),可能要等;日志见 $XHS_MCP_DIR/mcp.log。macOS 若被 Gatekeeper 拦:xattr -c "$BIN"。)
② 查登录态:
conda run -n paper2anything --no-capture-output python "${SKILL_DIR}/scripts/publish.py" --check-only
已登录 → 跳到 ④。未登录 → 走 ③。
③ 登录(仅首次或会话失效时):登录要换带界面/monitor 的方式起 mcp,先停掉 ① 起的那个(按进程名精确停,别用 pkill -f,会误杀自身):
pkill -x xiaohongshu-mcp; sleep 1
再照 references/publish-guide.md 按环境操作。无头服务器要点:带 -rod "monitor=:9273" 重起 mcp(保持默认无头)→ xhs_login.py 取码 → SendUserFile 把 qr.png 发用户、提醒首次可能要先在 monitor 端口(:9273)的浏览器界面里扫一道「新设备验证」码 → AskUserQuestion 等用户确认扫完 → 监测 cookies 写出 → 成功后再 pkill -x xiaohongshu-mcp 停掉、回 ① 重启(去掉 monitor、加载 cookies)。
conda run -n paper2anything --no-capture-output python "${SKILL_DIR}/scripts/xhs_login.py" \
--out "$XHS_MCP_DIR/qr.png" --cookies "$XHS_MCP_DIR/cookies.json" --wait
④ 发布前给用户过目:Read xhs_post.json 把标题 + 正文发给用户看,SendUserFile 发 cover.png;用 AskUserQuestion 让用户确认发布并选可见性(选项默认「公开可见」,另有「仅自己可见」「仅互关好友可见」)。
⑤ 发布(传入用户选的可见性):
pdf_path="/path/to/paper.pdf"
WORKDIR="$(dirname "$pdf_path")/.paper2anything/xhs/$(basename "${pdf_path%.*}")"
conda run -n paper2anything --no-capture-output \
python "${SKILL_DIR}/scripts/publish.py" --workdir "$WORKDIR" --visibility "公开可见"
返回「发布成功」即完成。
Step 6:把成品归集到 PDF 旁
成品默认埋在 .paper2anything/xhs/<stem>/ 里不好找。文案+封面定稿后(无论是否走 Step 5 发布),把它们复制一份
到与 PDF 同级的 <stem>_xhs/ 目录(.paper2anything 内副本保留不动),让用户在论文旁直接取用:
pdf_path="/path/to/paper.pdf"
WORKDIR="$(dirname "$pdf_path")/.paper2anything/xhs/$(basename "${pdf_path%.*}")"
DEST="${pdf_path%.*}_xhs" # 与 PDF 同目录、同名 + _xhs 后缀
i=2; while [ -e "$DEST" ]; do DEST="${pdf_path%.*}_xhs_v$i"; i=$((i+1)); done # 重名则追加 _v2、_v3
mkdir -p "$DEST"
cp "$WORKDIR/xhs_post.md" "$WORKDIR/xhs_post.json" "$DEST/"
[ -f "$WORKDIR/cover.png" ] && cp "$WORKDIR/cover.png" "$DEST/" # 封面可能 skipped,存在才复制
xhs_post.md 以  相对引用封面,故文案与封面整组放进 <stem>_xhs/ 子目录、引用不破。
产物位置
中间产物落在论文旁 <pdf目录>/.paper2anything/xhs/<stem>/(同目录多篇论文按 <stem> 分篇、互不覆盖),最终成品另复制到 PDF 同级的 <stem>_xhs/(Step 6):
| 路径 | 内容 | 谁写 |
|---|---|---|
.paper2anything/xhs/<stem>/parsed/ |
MinerU PIR(meta/sections/figures_index/references) | parse_pdf |
.paper2anything/xhs/<stem>/figures/ |
论文插图实体 | parse_pdf |
.paper2anything/xhs/<stem>/understanding/paper_understanding.json |
论文理解 + important_figures | 你 |
.paper2anything/xhs/<stem>/xhs_post.json xhs_post.md |
小红书文案 | 你 |
.paper2anything/xhs/<stem>/cover.png |
封面 | cover |
.paper2anything/xhs/<stem>/logs/ |
各脚本 *_result.json |
脚本 |
<pdf目录>/<stem>_xhs/ |
成品归集:xhs_post.md + .json + cover.png,与 PDF 同级 |
你(Step 6) |
重跑覆盖工作区 .paper2anything/xhs/<stem>/(中间产物);归集步骤遇同名 <stem>_xhs/ 会另存为 _v2、_v3,不覆盖旧成品。
排错
- MinerU 解析失败:核对
.env的MINERU_API_TOKEN(在 https://mineru.net 申请);PDF 应 ≤200MB / ≤200 页;能访问mineru.net。重跑 Step 1 即可(覆盖)。 - 封面没生成(
skipped):通常是既没配可用OPENAI_API_KEY、又没有可复用的论文原图。配上 key 走 AI 生图,或确保understanding.important_figures有suitable_for_cover:true且image_path存在的图以供本地合成回退。 - 发布步骤报错:
未登录→ 按references/publish-guide.md完成登录(首次注意「新设备验证」);连不上 mcp→ 看 ① 是否成功起服务(二进制下载/启动失败查$XHS_MCP_DIR/mcp.log)。登录成功后须重启 mcp 才会加载 cookies。不发布可跳过 Step 5、手动发产物。 - 理解/文案不需要 API key:这两步是你亲自做的,不调用任何 LLM API。
Version History
- 0b87c3b Current 2026-07-05 09:13


