关于 noise2blog
这项技能可将粗略笔记、转录稿、推文合集、短草稿或 URL 内容整理成博客文章。它使用 Gemini 生成内容,并可通过 Tavily 研究核实主张,要求具体信息有来源依据。
主要功能
- 01接收笔记、转录稿、推文合集、草稿或 URL
- 02识别输入类型和博客文章风格
- 03配置 Tavily 后核查相关主张
- 04生成博客文章、SEO 元描述和备选标题
- 05依据输入材料或研究来源检查主张
适用场景
- 01将零散笔记整理为可发布的文章
- 02把转录稿或推文串改写成博客文章
- 03为草稿中的主张补充来源核实
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ varnan-tech/ opendirectory --skill noise2blog安装后在 Claude Code 中输入/noise2blog确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.env.exampleREADME.mdevals/evals.jsonreferences/blog-format.mdoutput-template.md详细介绍
从杂乱素材到博客文章
将任意粗略素材(要点、语音转录、推文合集或简短草稿)整理成润色完善、可直接发表的博客文章。每项说法都必须有原始素材或经 Tavily 验证的研究作为依据。
关键规则: 不要编造具体信息。博客文章中的每项说法、指标和示例都必须来自原始输入或 Tavily 搜索结果。绝不可捏造数据、引语或结果。
第 1 步:检查设置
确认已设置必需的环境变量:
echo "GEMINI_API_KEY: ${GEMINI_API_KEY:+set}"
echo "TAVILY_API_KEY: ${TAVILY_API_KEY:-not set, Tavily enrichment will be skipped}"
如果缺少 GEMINI_API_KEY: 停止。告知用户:“GEMINI_API_KEY 是必需的。请前往 aistudio.google.com → Get API key 获取密钥,并将其添加到 .env 文件中。”
如果缺少 TAVILY_API_KEY: 继续。说明将跳过 Tavily 补充信息。博客文章将完全基于用户提供的内容。这适用于个人经历、基于经验的教程或观点文章。
确认输入内容已提供。 用户必须提供以下内容之一:
- 粘贴的文本(要点、粗略笔记、转录、推文合集或简短草稿)
- 要抓取内容的 URL
如果没有输入内容,请询问:“请分享你的粗略笔记、要点或转录。可以直接粘贴,也可以提供要抓取来源的 URL。”
第 2 步:阅读并分析输入内容
如果输入是 URL: 使用 WebFetch 抓取页面内容。提取:标题、作者、发布日期、所有正文、关键统计数据、编号列表、小标题和引语。
如果输入是粘贴的文本: 直接阅读。识别输入类型:
- 要点或粗略笔记:零散的想法、不完整的句子、意识流
- 语音转录:口语化、重复、填充词(嗯、呃、像、你知道)、冗长曲折的句子
- 推文串合集:简短片段、@提及、话题标签、“1/8”编号
- 简短草稿:结构完整但内容单薄,需要扩充和润色
质量检查关卡: 继续之前,先说明:
- 识别出的输入类型
- 用一句话概括核心论点或主要观点
- 原始内容中最有力的 3~5 条见解、事实或想法
- 需要外部验证的说法(基准测试、统计数据、产品比较、研究发现)
如果无法确定核心论点,请询问:“你最希望读者记住的一件事是什么?”
第 3 步:选择博客文章风格
共有四种风格。根据内容特征自动识别。始终尊重用户的指定。
| 风格 | 适用情况 | 特征 |
|---|---|---|
| 技术教程 | 分步指南、操作方法、代码讲解 | 编号步骤、命令、代码片段、内容中出现“如何” |
| 案例研究 | 前后对比、构建记录、经验教训 | 具体结果、时间线、第一人称经历 |
| 思想领导力 | 观点、论证、反直觉主张 | “我认为”、“X 的问题在于”、唱反调的立场、辩论式框架 |
| 说明文 | 什么是 X、为何重要、如何运作 | 先讲概念、侧重比较、“大多数人不知道” |
识别逻辑:
- 内容包含编号步骤或命令 → 技术教程
- 内容包含前后对比、具体指标或叙事脉络 → 案例研究
- 内容反驳常见看法或提出鲜明观点 → 思想领导力
- 内容面向不熟悉某个概念、工具或趋势的人进行解释 → 说明文
说明选定的风格及理由。如果无法明确判断,选一种并说明选择。
步骤 4:使用 Tavily 研究补充内容
如果未设置 TAVILY_API_KEY,请静默跳过此步骤。
搜索原始内容中需要核实或补充数据的论据,寻找支持证据。适合核实的内容包括:
- 产品基准测试或性能数据
- 市场统计数据或行业趋势
- 技术比较(“X 比 Y 更快”)
- 用户凭记忆提及、而非引用来源的任何数字
对于每条需要核实的论据,执行一次 Tavily 搜索。最多执行 3 次搜索,避免来源过多:
curl -s -X POST "https://api.tavily.com/search" \
-H "Content-Type: application/json" \
-d '{
"api_key": "'"$TAVILY_API_KEY"'",
"query": "SPECIFIC_CLAIM_OR_TOPIC",
"search_depth": "advanced",
"max_results": 5,
"include_answer": true
}'
保留 score >= 0.65 的结果。提取:标题、url、内容摘要。
使用 Tavily 结果的规则:
- 使用结果支持或核实原始输入中已有的论据。绝不要引入搜索结果中的全新论据。
- 在正文中自然注明来源:“根据 [Source]”“[X] 的数据显示”
- 如果没有 Tavily 结果能证实某项论据,就保留该论据未经核实的状态,不要用无关结果替换
步骤 5:生成博客文章
完整阅读 references/blog-format.md。从 references/output-template.md 中选择匹配的模板。生成前,先熟悉所有规则。
将 Gemini 请求写入临时文件,以妥善处理特殊字符:
cat > /tmp/noise2blog-request.json << 'ENDJSON'
{
"system_instruction": {
"parts": [{
"text": "You are a tech writer who sounds like a real person. Rules: Active voice only. Short paragraphs, 1-3 lines max, then a blank line. Use contractions naturally (don't, won't, it's, can't, you're, they're). No em dashes — use a comma or period instead. No semicolons. Every sentence needs a concrete detail: a number, a tool name, a file name, a command, a result. No filler phrases: no 'In today's rapidly evolving', no 'Let's dive in', no 'It's worth noting', no 'In conclusion', no 'I hope this was helpful'. No banned words: incredible, amazing, leveraging, synergize, game-changing, groundbreaking, revolutionary, paradigm, cutting-edge, seamless, robust, unprecedented, delve, harness, utilize, transformative, disruptive, unlock, comprehensive, actionable, crucial, pivotal. Title must not start with I, My, or We. Open with a hook paragraph that does not announce the topic. Close with something actionable. Do not invent claims, metrics, or outcomes not present in the source material."
}]
},
"contents": [{
"parts": [{
"text": "RAW_CONTENT_AND_INSTRUCTIONS_HERE"
}]
}],
"generationConfig": {
"temperature": 0.7,
"maxOutputTokens": 4096
}
}
ENDJSON
将 RAW_CONTENT_AND_INSTRUCTIONS_HERE 替换为以下内容:
- 原始输入内容
- 博客文章风格和结构说明(来自所选模板)
- 步骤 4 中收集的任何 Tavily 研究结果
- 目标字数:800-1,800 词
提交请求:
curl -s -X POST \
"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d @/tmp/noise2blog-request.json \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d['candidates'][0]['content']['parts'][0]['text'])"
还需提供:
- (B) 用于 SEO 预览文本的 1-2 句元描述
- (C) 一个采用不同切入角度的备选标题
步骤 6:自我检查
逐项执行所有检查,并在提交前修正违规之处:
- 标题不以“I”“My”或“We”开头
- 标题具体且自然(不能使用“A Comprehensive Guide to X”或“The Ultimate Guide to Y”)
- 开篇段落要吸引读者,不要宣布主题(例如“In this post I will...”)
- 任何一行都不得使用 em dash
- 不得使用分号
- 空行前的段落不超过 3 行
- 不得使用以下禁用词:incredible、amazing、leveraging、game-changing、delve、harness、unlock、groundbreaking、cutting-edge、remarkable、paradigm、revolutionize、seamless、robust、utilize、unprecedented、comprehensive、actionable、crucial、pivotal
- 不得编造数据:每项论据都必须能追溯至原始输入或 Tavily 结果
- 文章结尾不得使用“In conclusion”“To summarize”或“I hope this helped”
- 字数为 800-1,800 词(注明字数)
- 逻辑流畅:开篇 → 问题/背景 → 正文各部分 → 可执行的结尾
修正所有违规之处。注明最终字数。
步骤 7:输出
将完整博客文章放在代码块中。
在正文下方提供元描述和备选标题。
询问:“可以复制到编辑器中了吗?如果你要发布到特定平台,请告诉我,我可以为你设置 frontmatter 格式。”
针对特定平台的请求:
Ghost:
---
title: "POST_TITLE"
date: YYYY-MM-DD
tags: [tag1, tag2]
status: draft
---
dev.to:
---
title: POST_TITLE
description: META_DESCRIPTION
tags: [tag1, tag2, tag3]
published: false
---
Substack:以纯 Markdown 呈现。Substack 的编辑器可以直接导入 Markdown。
Hashnode:
---
title: POST_TITLE
subtitle: META_DESCRIPTION
tags: [tag1, tag2]
---