"BestBlogs.dev 每日内容早报。适用场景: (1) 生成每日早报/日报, (2) 获取过去 24 小时最值得阅读的内容, (3) 每天早上 9 点的内容精选, (4) 今日 AI/技术领域有什么重要动态, (5) 生成早报海报和分享文案。触发短语: '每日早报', '今日早报', 'daily digest', '早报', '日报', '今天有什么值得看的', 'morning briefing', '每日精选', 'daily briefing', '生成早报', '今日精选', 'bestblogs 早报', 'bestblogs digest', '内容早报', '技术早报', 'AI 早报', '每日推荐'"
Resources
1Install
npx skillscat add ginobefun/gino-skills/bestblogs-daily-digest Install via the SkillsCat registry.
BestBlogs 每日早报 (Daily Digest)
从 BestBlogs.dev 过去 24 小时的内容中智能筛选 10 条最值得关注的信息,生成纯文本、杂志风 HTML 和信息图海报三种形式的早报。
完整 API 参数详情见 references/api_reference.md。
认证
所有请求需要 X-API-KEY 请求头。从环境变量 BESTBLOGS_API_KEY 读取密钥:
-H "X-API-KEY: $BESTBLOGS_API_KEY"若 BESTBLOGS_API_KEY 未设置,提示用户配置。
接口地址: https://api.bestblogs.dev
工作流概览
- [ ] 阶段一: 并行拉取数据(7 个请求)
- [ ] 阶段二: 合并去重 + AI 智能筛选 Top 10
- [ ] 阶段三: 生成三种输出
- [ ] 3.1 纯文本版(IM/社交媒体分享)
- [ ] 3.2 杂志风 HTML(浏览/截图)
- [ ] 3.3 信息图海报(Top 5,via image-gen)
- [ ] 阶段四: 保存文件阶段一: 并行拉取数据
7 个请求并行执行,每组获取评分最高的 100 条,时间范围 1 天:
# 1. AI 文章
curl -s -X POST https://api.bestblogs.dev/openapi/v1/resource/list \
-H "Content-Type: application/json" \
-H "X-API-KEY: $BESTBLOGS_API_KEY" \
-d '{"currentPage":1,"timeFilter":"1d","sortType":"score_desc","userLanguage":"zh_CN","pageSize":100,"type":"ARTICLE","category":"Artificial_Intelligence"}'
# 2. 编程技术文章
curl -s -X POST https://api.bestblogs.dev/openapi/v1/resource/list \
-H "Content-Type: application/json" \
-H "X-API-KEY: $BESTBLOGS_API_KEY" \
-d '{"currentPage":1,"timeFilter":"1d","sortType":"score_desc","userLanguage":"zh_CN","pageSize":100,"type":"ARTICLE","category":"Programming_Technology"}'
# 3. 商业科技文章
curl -s -X POST https://api.bestblogs.dev/openapi/v1/resource/list \
-H "Content-Type: application/json" \
-H "X-API-KEY: $BESTBLOGS_API_KEY" \
-d '{"currentPage":1,"timeFilter":"1d","sortType":"score_desc","userLanguage":"zh_CN","pageSize":100,"type":"ARTICLE","category":"Business_Tech"}'
# 4. 产品设计文章
curl -s -X POST https://api.bestblogs.dev/openapi/v1/resource/list \
-H "Content-Type: application/json" \
-H "X-API-KEY: $BESTBLOGS_API_KEY" \
-d '{"currentPage":1,"timeFilter":"1d","sortType":"score_desc","userLanguage":"zh_CN","pageSize":100,"type":"ARTICLE","category":"Product_Development"}'
# 5. 视频
curl -s -X POST https://api.bestblogs.dev/openapi/v1/resource/list \
-H "Content-Type: application/json" \
-H "X-API-KEY: $BESTBLOGS_API_KEY" \
-d '{"currentPage":1,"timeFilter":"1d","sortType":"score_desc","userLanguage":"zh_CN","pageSize":100,"type":"VIDEO"}'
# 6. 播客
curl -s -X POST https://api.bestblogs.dev/openapi/v1/resource/list \
-H "Content-Type: application/json" \
-H "X-API-KEY: $BESTBLOGS_API_KEY" \
-d '{"currentPage":1,"timeFilter":"1d","sortType":"score_desc","userLanguage":"zh_CN","pageSize":100,"type":"PODCAST"}'
# 7. 推文
curl -s -X POST https://api.bestblogs.dev/openapi/v1/tweet/list \
-H "Content-Type: application/json" \
-H "X-API-KEY: $BESTBLOGS_API_KEY" \
-d '{"currentPage":1,"timeFilter":"1d","sortType":"score_desc","userLanguage":"zh_CN","pageSize":100,"language":"all"}'并行执行所有 7 个请求。 客户端过滤: 仅保留 score >= 85 的内容。
阶段二: 合并去重 + AI 智能筛选
2.1 合并与去重
- 合并数据:
- 请求 1-6(resource/list): 直接取
data.dataList中的资源对象 - 请求 7(tweet/list): 取
data.dataList[].resourceMeta作为资源对象,同时保留tweet.author.userName用于输出时标注@用户名
- 请求 1-6(resource/list): 直接取
- URL 去重: 按
url去重(同一内容可能出现在多个分类查询结果中) - 主题去重: 多篇内容讨论同一话题时,保留评分最高的一条,记录其他来源作为补充提及(格式:
另见: 来源2, 来源3)
2.2 AI 智能筛选 Top 10
从合并后的候选池中选出 10 条最值得推荐的内容。筛选维度(按优先级排列):
优先级 1: 头部厂商重大动态
以下厂商的新模型、新产品、新政策、重大更新自动进入候选:
- 国际: OpenAI, Anthropic, Google/Gemini, Meta AI, xAI
- 国内: 阿里巴巴/通义, 腾讯, DeepSeek, 月之暗面/Kimi, 智谱/GLM, Minimax, 百度/文心, 字节/豆包
优先级 2: AI Coding 专题
关于以下工具、方法论、实践经验的内容加权提升:
- Claude Code, Codex, Cursor, Windsurf, GitHub Copilot, Devin
- AI 辅助编程最佳实践、Agent 开发、MCP 协议
优先级 3: 高优来源加权
来自以下来源的内容加权提升(按来源名称 sourceName 匹配):
- 国际: Lenny's Podcast, Y Combinator, The Pragmatic Engineer, a16z, Lex Fridman, Latent Space, Simon Willison, Stratechery
- 国内: 宝玉, 张小珺, 数字生命卡兹克, 赛博禅心, 腾讯科技, Founder Park, 晚点LatePost, 极客公园
优先级 4: 内容质量与阅读价值
score评分(基础权重)- 内容深度(长文/深度分析 > 短资讯)
- 读者阅读的迫切性(时效性强的 > 常青内容)
- 独特视角或原创洞察
筛选输出
对每条入选内容记录:
- 排名(1-10)
- 入选理由(一句话)
- 如有同话题的其他来源,记录补充来源
不要求覆盖每个分类或内容类型 — 纯按内容重要性排序。
阶段三: 生成三种输出
3.1 纯文本版
适合直接复制到 IM 群聊(微信/飞书/Slack)或社交媒体分享。IM 不渲染 markdown,因此使用纯文本格式,URL 独立成行确保可点击。
BestBlogs 早报 | YYYY-MM-DD
# AI Coding / Claude 4 / DeepSeek V3
[1] 标题
2-3 句摘要,概括核心信息和为什么值得关注。
来源: sourceName | 评分: 96
readUrl(BestBlogs 站内链接)
[2] 标题
一两句话摘要。
来源: sourceName | 评分: 93
readUrl(BestBlogs 站内链接)
...(共 10 条)
---
BestBlogs.dev - 遇见更好的技术阅读格式规则:
- 每条内容必须包含
readUrl链接(BestBlogs 站内链接),URL 独立成行确保在 IM 中可直接点击 - Top 1 的内容适当增加篇幅(2-3 句摘要 + 为什么值得关注)
- 其余每条 1-2 句摘要
- 同话题有多个来源时:
另见: 来源2, 来源3 - 关键词 3-5 个,提取自当日最热话题,用
/分隔 - 内容类型标识: 推文标注
@userName,播客标注[播客 XXmin],视频标注[视频 XXmin],文章不标注
3.2 杂志风 HTML
生成一个可直接在浏览器打开的独立 HTML 文件,信息量介于纯文本和海报之间,适合浏览和截图分享。
整体追求高端设计杂志(Monocle、Kinfolk)的气质 — 低调、专业、有文化底蕴,经得起反复观看。
视觉风格(BestBlogs 品牌 + 现代主义杂志美学):
| 维度 | 规范 |
|---|---|
| 色彩体系 | 墨蓝 #1a365d(主色/标题/序号)、琥珀 #d97706(唯一强调色,仅用于 Top 1)、米白纸张 #fefdfb(背景)、深炭灰 #374151(正文)、中灰 #6b7280(辅助信息) |
| 标题字体 | Georgia, 'Noto Serif SC', serif — 衬线体营造书卷气质 |
| 正文字体 | -apple-system, 'PingFang SC', 'Helvetica Neue', sans-serif |
| 数字/评分 | 'Inter', sans-serif — 等宽数字对齐 |
| 质感纹理 | body 叠加细腻纸质噪点(CSS SVG filter,opacity 0.03),营造纸张手工质感 |
| 卡片风格 | 无边框,仅用极淡分隔线 #e5e7eb 区隔条目;避免堆叠阴影,保持平面克制感 |
| Top 1 强调 | 左侧 3px 琥珀色竖线 + 浅琥珀背景 rgba(217,119,6,0.06),克制而醒目 |
| 留白 | 大量留白让信息有呼吸感 — 卡片间距 32px,内边距 24px,标题与摘要间距 12px |
| 宽度 | max-width 640px 居中,窄幅阅读体验 |
HTML 结构:
<!-- 独立 HTML,内联所有 CSS + SVG 噪点,无外部依赖 -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>BestBlogs 早报 | YYYY-MM-DD</title>
<style>
/* 纸质噪点纹理 */
body::before {
content: '';
position: fixed; top: 0; left: 0; width: 100%; height: 100%;
opacity: 0.03; pointer-events: none; z-index: 9999;
background-image: url("data:image/svg+xml,..."); /* inline SVG noise */
}
/* 其余样式内联 */
</style>
</head>
<body style="background: #fefdfb;">
<!-- 头部区域 -->
<!-- "BestBlogs 早报" 品牌标题(墨蓝,衬线体,letter-spacing 0.05em) -->
<!-- 日期(中灰,小号) -->
<!-- 关键词标签(墨蓝边框胶囊,背景透明,font-size 12px) -->
<!-- Top 1 精选卡片 -->
<!-- 琥珀色左边线 + 微暖背景 -->
<!-- 标题(墨蓝衬线体,font-size 20px) -->
<!-- 2-3 句摘要 + 主要观点 -->
<!-- 来源 | 分类 | 评分 -->
<!-- 2-10 常规条目 -->
<!-- 序号(墨蓝,Inter 字体,与标题同行) -->
<!-- 标题(可点击链接,衬线体,font-size 17px) -->
<!-- 1-2 句摘要(深炭灰,font-size 14px,line-height 1.6) -->
<!-- 来源 | 类型标签 | 评分(中灰,font-size 12px) -->
<!-- 条目间以极淡分隔线区隔 -->
<!-- 底部 -->
<!-- 细分隔线 -->
<!-- "BestBlogs.dev" 品牌标识(墨蓝,letter-spacing) -->
<!-- "遇见更好的技术阅读"(中灰,font-size 12px) -->
</body>
</html>每张卡片包含:
- 墨蓝序号 + 衬线体标题(可点击,链接到 readUrl)
- 来源 | 分类 | 评分(中灰辅助行)
- 1-2 句摘要(深炭灰正文)
- Top 1 额外展示: 主要观点(如有)、为什么值得关注
- 内容类型标识: 文章无标注、推文
@前缀、播客/视频显示时长胶囊标签
设计禁忌:
- 不要使用渐变背景、发光效果、蓝紫科技感
- 不要给每张卡片加投影 — 用分隔线代替
- 不要塞满画面 — 留白是设计的一部分
- 不要超过两种强调色 — 琥珀是唯一的点睛
3.3 信息图海报
使用 image-gen skill 生成纵向信息图海报,仅包含 Top 5 内容。
海报视觉风格:
整体气质: 高端建筑事务所作品集或 Monocle 杂志信息页 — 瑞士国际主义的克制与精准,每个元素恰到好处。
- 色彩: 墨蓝
#1a365d为主调 + 琥珀#d97706仅 Top 1 点睛 + 米白#fefdfb纸张背景 - 质感: 细腻纸质噪点纹理覆盖全图,营造手工印刷质感,而非光滑数码感
- 布局: 纵向 9:16,上下留白充足(顶部至少 60px,底部至少 80px)
- 头部: "BestBlogs 早报" 衬线体标题 + 日期 + 3 个关键词胶囊标签(墨蓝细边框)
- 主体: 5 条内容,每条用序号 + 标题 + 一句话摘要 + 来源,条目间用极细分隔线
- Top 1: 左侧琥珀色竖线标记,标题加大,视觉权重最高
- 底部: "BestBlogs.dev" 品牌标识 + 细线收尾
- 字体风格: 标题用衬线体(有文化底蕴感),正文用无衬线体(清晰易读)
- 留白: 大量留白让信息有呼吸感,条目间距 > 内容高度的 40%
海报设计禁忌:
- 不要蓝紫渐变科技感、不要发光粒子效果
- 不要圆角气泡卡片堆叠 — 用平面排版 + 分隔线
- 不要用力过猛 — 克制即高级
调用方式:
# 1. 定位 image-gen skill 目录(resolve symlink)
IMAGE_GEN_SKILL_DIR=$(readlink -f ~/.claude/skills/image-gen 2>/dev/null || readlink -f ~/.claude/skills/baoyu-image-gen 2>/dev/null)
# 2. 将海报内容描述写入 prompt 文件(保存在输出目录)
# prompt 文件包含: 完整视觉风格描述 + 品牌色值 + 5 条内容的标题和摘要
# 3. 生成海报
${BUN_X} ${IMAGE_GEN_SKILL_DIR}/scripts/main.ts \
--promptfiles <output-dir>/poster-prompt.md \
--image <output-dir>/poster.png \
--ar 9:16 \
--quality 2k若 image-gen skill 未安装,跳过海报生成并告知用户。
阶段四: 保存文件
所有输出保存到项目根目录下:
contents/bestblogs-digest/
YYYY-MM-DD/
digest.txt # 纯文本版
digest.html # 杂志风 HTML
poster.png # 信息图海报创建目录(如不存在):
mkdir -p contents/bestblogs-digest/YYYY-MM-DD保存完成后,输出纯文本版内容到对话中,并告知用户三个文件的路径。
参数调整
根据用户输入调整:
| 用户表述 | 参数调整 |
|---|---|
| "本周早报" / "这周" | timeFilter: "1w",Top 10 → Top 15 |
| "只看 AI" | 仅拉取 AI 分类 |
| "多给几条" / "Top 15" | 增加输出数量 |
| "不需要海报" | 跳过阶段 3.3 |
| "只要文本" | 仅生成纯文本版 |
| "评分 90 以上" | 客户端过滤阈值调整为 90 |
错误处理
重要: 始终先检查 response.success 再处理 response.data。部分错误返回 HTTP 200 但 success: false — 不要仅依赖 HTTP 状态码。
401: 检查BESTBLOGS_API_KEY是否已设置且有效400: 参数值不合法,检查枚举值500: 重试一次,仍失败则告知用户data为空或totalCount: 0: 该时间范围内无内容。若 1d 无结果,建议用户尝试3d- 单个分类请求失败不影响整体: 记录失败分类,用其他分类数据继续生成早报