我把每天没说出口的话,做成了一个 API
先从一个不太起眼的小角落说起
我是黎泽懿,一个习惯把很多话在心里多绕两圈再写下来的人。
首页有一块很小的地方,点一下,会换出一句话。
有时候是“平淡的相遇,或许才能筑就美好的未来”,有时候又只是“饭菜固然好吃,但请适量哦”。它们大多数是我在通勤、吃饭、睡前,或者突然安静下来的时候记下的。没有提前列提纲,也没有规定每天必须交作业。想到了就写,写不下去就空着。
我本来只是想让博客多一个会呼吸的角落。没想到写到第 47 条的时候,回头翻了一遍,才发现自己确实留下了一些东西:有些话很幼稚,有些话现在看已经不再完全认同,也有一些情绪只属于写下它的那个晚上。
这大概就是“每日一言”最真实的样子。它不是一套答案,更像一本摊开的便签。字写得不算漂亮,但每一页都是真的。
如果你在首页看见我笑得很轻松,那不代表这些话都轻飘飘。只是我不太习惯把真正认真的部分摊开给人看。写下来以后,我偶尔还会盯着屏幕确认一会儿,猫耳也跟着转过去,像在问:这次有没有把意思说准?
重要的话先说:这只是个人观点
下面这段话,我想认真地放在前面。
“每日一言”里的全部内容,都只是我在某个具体时刻的个人感受。它不是事实判断,不是专业建议,也不代表任何组织、团队或他人的立场。某句话此刻能让我认同,不代表它永远正确;某句话让你不舒服,也完全可以不同意。
我不会把它包装成“人生指南”。如果它刚好说中了你,那很好;如果完全不适用,就把它当成风吹过的一张纸,翻过去就行。
也请不要把其中任何一句,当作医疗、法律、投资或其他专业决策的依据。它可以陪你几分钟,但不应该替你做决定。
我承认,有时候我写得很别扭。明明可以直接说“我在意”,最后却落成一句绕了好几道弯的话。某人大概又要说我想太多。好吧,这个问题我承认一点点,但暂时不改。
网页上的它,是什么样子
“每日一言”页面会按时间列出目前记录的全部内容。每条都保留日期和时间,像一排没有装订好的便签;首页则每次随机取一条,点一下就能换。
把日期留下来,不是为了制造什么仪式感,而是想让未来的我知道:这句话是那天说的,不是今天才突然懂了。时间一拉长,很多当时觉得普通的话,会慢慢长出别的意思。
如果你只是想随便看看,打开页面就够了,不必理解后面的代码。下面的部分留给愿意把这句话带走的人。
现在,任何人都可以调用它
我把“每日一言”做成了一个只读 API。目标很简单:你可以把它放进自己的主页、桌面小组件、博客边栏,或者任何会发 HTTP 请求的地方。
公开地址是:
https://aionflux.cn/api/hitokoto目前接口不要求 API Key,服务端返回 JSON,并允许跨域请求。所有接口都使用 GET,内容编码为 UTF-8。
1. 获取今天的记录
GET https://aionflux.cn/api/hitokoto/today如果当天写过内容,会返回当天的记录,并把 fallback 标为 false:
{
"date": "2026-09-11",
"time": "23:30",
"content": "今天想留下的一句话。",
"fallback": false
}如果当天还没有记录,会回退到最新的一条,并把 fallback 标为 true。这样你的页面不会因为某天忘记记录而突然空掉。
2. 随机获取一条
GET https://aionflux.cn/api/hitokoto/random返回格式和普通记录一样:
{
"date": "2026-09-10",
"time": "08:30",
"content": "今天也请好好吃饭。"
}如果你不想连续抽到同一条,可以把上一轮返回的完整记录传回来:
const params = new URLSearchParams({
excludeDate: previous.date,
excludeTime: previous.time,
excludeContent: previous.content,
})
const url = `https://aionflux.cn/api/hitokoto/random?${params}`三个排除参数应当作为一组使用。服务端会排除三者完全匹配的那一条;如果库中只有一条记录,它会保留最后这一条,而不是返回空结果。
3. 按日期获取
GET https://aionflux.cn/api/hitokoto/date/2026-09-04日期格式必须是 YYYY-MM-DD。找到时返回对应记录,没有记录时返回 404,日期格式不合法时返回 400。这个接口比较适合“历史上的今天”之类的玩法。
4. 获取全部记录
GET https://aionflux.cn/api/hitokoto/all响应会包含完整的记录数组和总数:
{
"items": [
{
"date": "2026-09-11",
"time": "23:30",
"content": "今天想留下的一句话。"
}
],
"total": 1
}记录按日期和时间倒序排列,最新的一条在最前面。
一段可以直接用的前端示例
假设你只想要首页那种“随机换一句”的效果,可以这样写:
async function loadHitokoto() {
const response = await fetch('https://aionflux.cn/api/hitokoto/random', {
headers: { Accept: 'application/json' },
cache: 'no-store',
})
if (!response.ok)
throw new Error(`请求失败:${response.status}`)
const { content, date, time } = await response.json()
document.querySelector('#hitokoto').textContent = content
document.querySelector('#hitokoto-meta').textContent = `${date} ${time}`
}
loadHitokoto()也可以先在终端看一眼:
curl https://aionflux.cn/api/hitokoto/today
curl https://aionflux.cn/api/hitokoto/random
curl https://aionflux.cn/api/hitokoto/date/2026-09-04
curl https://aionflux.cn/api/hitokoto/all接口的缓存策略也顺便说清楚:
/today、指定日期和/all的响应默认缓存 60 秒;/random不缓存,每次会重新请求;- 遇到服务端错误时,最好在自己的页面里准备一句本地兜底文案。
调用之前,再让我小声提醒几句
这是一台个人服务器,不是大厂云服务。目前没有严格的调用配额,也没有承诺永远在线。自己用、放在个人主页里都没问题,但请不要高频轮询,更不要把“数据不多”理解成“可以随便刷”。
内容会继续增加,字段和现有路径我会尽量保持稳定。如果以后必须调整,我会尽量让旧接口多活一段时间,而不是哪天突然悄悄消失。
还有一点:这些句子可以分享,但请不要修改后假装是我写的,也不要把个人感受裁剪成看似绝对的事实。它们本来就只代表某一个时刻的我。
最后
“每日一言”不是一个大项目。它只是我给自己留的一个抽屉,里面放着一些还没有完全想明白的话。
现在我把抽屉打开了一点点。如果其中某句话刚好让你停了一秒,那也算是我们隔着屏幕轻轻碰了一下杯。
至于我,还是会继续把那些想说、又没能当场说出口的话写进去。下一次刷新时,说不定我们看到的正好是同一句。
贡献者
更新日志
95df5-feat(hitokoto): 添加每日一言 API 与前端支持于
版权所有
版权归属:黎泽懿_Aionflux
许可证:MIT
