











此方教会了我使用 Openclaw,我顺带研究了如何使用 Codex。
以下代码和具体实现为 Codex 编写,我尽量把思路讲清楚一点。
在每年的年终总结里,我固定会把当年的阅读、观影、演出、游戏等娱乐消费总结成一张年历表格。我很喜欢这个模块,后来它独立成了博客的 Chronicle 页面。
但我忘记了一件事情,是这样的,往年只是每年更新总结一次,还不觉得这件事有什么特别。但变成页面之后,我就感觉自己有一种,实时地更新这个表格的义务,而我又,特别懒得做这件事……
于是我问:万能的神灯(Codex)啊,有什么办法解决这一切吗?我想要它能自动化,要无感,要免费,最好还能顺便把海报墙也同步更新一下,对了既然提到海报墙,你知道吗 Hugo 的 Neodb 卡片短代码每次读取都拉一次 API 哎,虽然也不是特别浪费吧但是这样大陆用户就没法获取海报封面了!
Codex 实现了我的愿望,让我们谢谢 Codex(和它背后的 Deepseek Token)。
说到自动化那就是定时脚本,让 Codex 写脚本前需要捋清几件事:怎么让脚本知道我读了/看了什么,图片数据从哪里来,中国大陆无法顺畅访问 Neodb,图片需要中转,怎么中转?
答案是:放弃依赖 Neodb 的即时 API 拉取,将整套数据拉取后化为本地的静态储存,Hugo 构建时读取静态储存。海报图片则拉取后通过 boto3 上传至图床。
也就是说:
流程如下:
其中,脚本使用 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 写脚本的时候需要注意以下内容:
https://neodb.social/api/me/shelf/{状态}?page={页码},脚本请求之后,要按 UUID (而不是标题)去重,防止索引逻辑出错和封面重复上传,以及,注意加入 Accept-Language: zh-CN ,它的作用是使标题返回中文。[skip ci],用于预防提交再次触发 workflow 形成循环。一开始准备的 Token 全部都走 GitHub Secrets,防止仓库出现明文。cover_url(而不是通过 Neodb API 读取封面图片)。最后是成本,这一套流程中,Cloudflare R2 10G 内免费, GitHub Actions 每月有2000分钟的免费时间,Vercel 的每月免费构建次数是500次。
时间成本上,以我的数据量,Vercel 构建一般在8s 左右,GitHub Actions 一般在30s 上下。
API 成本:Deepseek v4 flash,连摸思路+踩坑一起约3块钱。
说一下这个踩坑:因为会产生二次构建,所以我一开始不想用 GitHub Actions,想用 Vercel 直接在构建的时候跑脚本,后来改了半天发现,Vercel 不保留构建缓存,单次构建时长长达12分钟……
让 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。
❤️
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。