惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
美团技术团队
Microsoft Azure Blog
Microsoft Azure Blog
V
Visual Studio Blog
Jina AI
Jina AI
博客园_首页
M
MIT News - Artificial intelligence
D
DataBreaches.Net
L
LangChain Blog
宝玉的分享
宝玉的分享
F
Fortinet All Blogs
A
About on SuperTechFans
月光博客
月光博客
Stack Overflow Blog
Stack Overflow Blog
Google DeepMind News
Google DeepMind News
N
Netflix TechBlog - Medium
Y
Y Combinator Blog
腾讯CDC
Vercel News
Vercel News
雷峰网
雷峰网
GbyAI
GbyAI
aimingoo的专栏
aimingoo的专栏
阮一峰的网络日志
阮一峰的网络日志
博客园 - 【当耐特】

小球飞鱼

白露 | 明天世界就要毁灭了,但沉迷结缘小网站 处暑 | 就为这点事把大家叫出来! 博客 | 在博客文章中显示Fedi互动数据 博客 | 在AI时代来搭博客吧! 博客 | 一份来自花边小报的发刊词 立秋 | 新式人体舍利子炼成手记 手账 | 关于一些爱用品的随便讲讲 手账 | 如何选择一本手账 夏至 | 朕和最终幻想14何曾有过嫌隙 芒种 | 像魔法少女一样 立夏 | 来不及解释了,立刻突入二次元 玩具箱 | 个人大生活家三件套之2026篇
博客 | 从Neodb到Blog的全面自动化
2026-08-17 · via 小球飞鱼

此方教会了我使用 Openclaw,我顺带研究了如何使用 Codex。
以下代码和具体实现为 Codex 编写,我尽量把思路讲清楚一点。

起因

在每年的年终总结里,我固定会把当年的阅读、观影、演出、游戏等娱乐消费总结成一张年历表格。我很喜欢这个模块,后来它独立成了博客的 Chronicle 页面。

但我忘记了一件事情,是这样的,往年只是每年更新总结一次,还不觉得这件事有什么特别。但变成页面之后,我就感觉自己有一种,实时地更新这个表格的义务,而我又,特别懒得做这件事……

于是我问:万能的神灯(Codex)啊,有什么办法解决这一切吗?我想要它能自动化,要无感,要免费,最好还能顺便把海报墙也同步更新一下,对了既然提到海报墙,你知道吗 Hugo 的 Neodb 卡片短代码每次读取都拉一次 API 哎,虽然也不是特别浪费吧但是这样大陆用户就没法获取海报封面了!

Codex 实现了我的愿望,让我们谢谢 Codex(和它背后的 Deepseek Token)。

思路

说到自动化那就是定时脚本,让 Codex 写脚本前需要捋清几件事:怎么让脚本知道我读了/看了什么,图片数据从哪里来,中国大陆无法顺畅访问 Neodb,图片需要中转,怎么中转?

答案是:放弃依赖 Neodb 的即时 API 拉取,将整套数据拉取后化为本地的静态储存,Hugo 构建时读取静态储存。海报图片则拉取后通过 boto3 上传至图床。
也就是说:

  1. 解决 Neodb 自动更新到 Chronicle 页面:脚本定时拉取 Neodb 标记后更新本地静态文件。
  2. 解决短代码(和海报墙)中 Neodb 海报无法通过大陆网路访问:脚本下载 Neodb 海报,上传至图床,短代码(和海报墙)使用图床链接展示图片。

流程如下:

  1. 我在 Neodb 上标记看过/读过。
  2. 脚本定时通过 Neodb API拉取标记,获取封面。
  3. 脚本通过 Neodb API下载海报,上传至图床,将数据合并写回仓库。
  4. Hugo 重新构建一次并读取数据,将已读书目等内容写入表格/海报展示至海报墙,同时短代码也使用本地图床链接展示海报。

其中,脚本使用 Github Action,因此写回 Github仓库之后会触发 Vercel 的自动构建,整个过程中人类只需要参与第一步的标记工作。

流程及注意事项

事前准备

我们需要 Neodb API(Neodb 底部-开发者),以及一个图床。
图床我推荐使用 Cloudflare R2,免费额度为 10 G,Neodb 拉下来的海报基本为 kb 级别,可谓是量大管饱。

需要的 Token 数据 相关用处
NEODB_TOKEN 调用 NeoDB 个人书架 API,拉取标记数据
R2 _ACCESS_KEY_ID / R2 _SECRET_ACCESS_KEY 图床的身份认证
R2_BUCKET 存储桶名
R2_ACCOUNT_ID / R2_ENDPOINT 拼出 R2 的 S3 兼容接口地址
R2_DOMAIN 图床公开域名,用于生成封面链接 cover_url

文件与脚本

整个流程由一个 Python 脚本和一个 GitHub Actions 脚本组成,其中,sync_neodb.py 脚本负责同步,即拉取→合并→传图→写回,GitHub Actions 脚本负责定时运行和自动提交。其中,指挥 AI 写脚本的时候需要注意以下内容:

  1. UUID 去重:NeoDB 的接口是 https://neodb.social/api/me/shelf/{状态}?page={页码},脚本请求之后,要按 UUID (而不是标题)去重,防止索引逻辑出错和封面重复上传,以及,注意加入 Accept-Language: zh-CN ,它的作用是使标题返回中文。
  2. 多卷本处理:涉及到表格展示端,读书和电影会有多卷本的情况,在 Neodb 标记中,我们可能会按1-20卷分卷标记,但现实中,肯定不愿意一口气显示20条相似数据,这里的情况可能比较复杂,可以和 AI 讨论,或者干脆手动处理。
  3. 手动写入处理:表格实际展示中可能有大量手动调整显示的情况(比如上面提到的多卷本),要求 AI 编辑脚本时加入手动写入优先的逻辑,防止自动更新之后和手写互相打架。
  4. 海报使用 boto3上传,每次上传时检测一下对象是否存在,如果出错,回退到原 Neodb 图片地址。
  5. GitHub Actions 的逻辑是:定时触发 → 跑脚本 → 有变化才自动提交。注意要加入 [skip ci],用于预防提交再次触发 workflow 形成循环。一开始准备的 Token 全部都走 GitHub Secrets,防止仓库出现明文。
  6. 短代码也需要跟着修改,要求它改从本地缓存数据中读取 cover_url(而不是通过 Neodb API 读取封面图片)。
  7. 脚本出错容易把整个流程都卡死,因此如果单条拉取、单张图上传失败,要求脚本只输出警告而不中断脚本。

最后是成本,这一套流程中,Cloudflare R2 10G 内免费, GitHub Actions 每月有2000分钟的免费时间,Vercel 的每月免费构建次数是500次。
时间成本上,以我的数据量,Vercel 构建一般在8s 左右,GitHub Actions 一般在30s 上下。
API 成本:Deepseek v4 flash,连摸思路+踩坑一起约3块钱。

说一下这个踩坑:因为会产生二次构建,所以我一开始不想用 GitHub Actions,想用 Vercel 直接在构建的时候跑脚本,后来改了半天发现,Vercel 不保留构建缓存,单次构建时长长达12分钟……

给 AI 的提示词

让 Codex 写了一个提示词,供参考

我要给 Hugo 博客优化 NeoDB 短代码功能,背景:博客是 Hugo,数据文件放 data/neodb/{year}.yaml,短代码通过 .Site.Data.neodb 读取本地缓存渲染卡片,构建时不能访问外网 API。
请你帮我写以下内容:
1. 同步脚本(Python)

  • 数据源:https://neodb.social/api/me/shelf/{complete|wishlist|progress|dropped}?page=N,请求头 Authorization: Bearer <NEODB_TOKEN>,token 从环境变量读取,不要硬编码;
  • 分页拉取全部书架状态,按 uuid 去重(同一作品只保留一条);
  • 合并写回 data/neodb/{year}.yaml(按 created_time 的年份分文件):已有条目按 uuid 匹配,只补缺失字段(uuid / shelf_type / comment_text / cover_url),绝不覆盖已有的标题、封面、评论;
  • 封面上传到 Cloudflare R2(boto3),cover_url 存图床地址。上传前先判断对象是否已存在,做到幂等;
  • 单条拉取或上传失败只打印警告,不中断整个脚本;
  • YAML 条目结构:title / category / cover_url / created_time / uuid / shelf_type / comment_text

2. Hugo 短代码 layouts/shortcodes/neodb.html

  • 用法:短代码包含 neodb 链接、短评,并在博客中渲染为卡片。
  • 从 URL 提取 uuid,在 .Site.Data.neodb 所有年份里查找;
  • 找到则渲染卡片:封面图、标题(链接回 NeoDB 原页)、标记日期、动作文案(book=读、movie/tv/performance=看、podcast/album=听、game=玩;wishlist=想/complete=过/progress=在/dropped=不……了)、分类、评论;
  • 评论优先级:短代码内文 > 缓存里的 comment_text;
  • 没找到时显示占位文案(如"该条目尚未同步,等待同步脚本运行后自动显示")。

3. 自动化(可选,建议包含)

  • GitHub Actions:每天定时(cron)+ 手动触发,跑同步脚本,有变化就自动 commit/push,commit message 带 [skip ci]
  • 凭据走 GitHub Secrets:NEODB_TOKEN,图床凭据为:R2_ACCESS_KEY_ID / R2_SECRET_ACCESS_KEY / R2_BUCKET / R2_ACCOUNT_ID / R2_DOMAIN

❤️