---
url: /blog/daily-hitokoto.md
---
## 先从一个不太起眼的小角落说起

我是黎泽懿，一个习惯把很多话在心里多绕两圈再写下来的人。

首页有一块很小的地方，点一下，会换出一句话。

有时候是“平淡的相遇，或许才能筑就美好的未来”，有时候又只是“饭菜固然好吃，但请适量哦”。它们大多数是我在通勤、吃饭、睡前，或者突然安静下来的时候记下的。没有提前列提纲，也没有规定每天必须交作业。想到了就写，写不下去就空着。

我本来只是想让博客多一个会呼吸的角落。没想到写到第 47 条的时候，回头翻了一遍，才发现自己确实留下了一些东西：有些话很幼稚，有些话现在看已经不再完全认同，也有一些情绪只属于写下它的那个晚上。

这大概就是“每日一言”最真实的样子。它不是一套答案，更像一本摊开的便签。字写得不算漂亮，但每一页都是真的。

如果你在首页看见我笑得很轻松，那不代表这些话都轻飘飘。只是我不太习惯把真正认真的部分摊开给人看。写下来以后，我偶尔还会盯着屏幕确认一会儿，猫耳也跟着转过去，像在问：这次有没有把意思说准？

## 重要的话先说：这只是个人观点

下面这段话，我想认真地放在前面。

\*\*“每日一言”里的全部内容，都只是我在某个具体时刻的个人感受。\*\*它不是事实判断，不是专业建议，也不代表任何组织、团队或他人的立场。某句话此刻能让我认同，不代表它永远正确；某句话让你不舒服，也完全可以不同意。

我不会把它包装成“人生指南”。如果它刚好说中了你，那很好；如果完全不适用，就把它当成风吹过的一张纸，翻过去就行。

也请不要把其中任何一句，当作医疗、法律、投资或其他专业决策的依据。它可以陪你几分钟，但不应该替你做决定。

我承认，有时候我写得很别扭。明明可以直接说“我在意”，最后却落成一句绕了好几道弯的话。某人大概又要说我想太多。好吧，这个问题我承认一点点，但暂时不改。

## 网页上的它，是什么样子

[“每日一言”页面](/hitokoto/)会按时间列出目前记录的全部内容。每条都保留日期和时间，像一排没有装订好的便签；首页则每次随机取一条，点一下就能换。

把日期留下来，不是为了制造什么仪式感，而是想让未来的我知道：这句话是那天说的，不是今天才突然懂了。时间一拉长，很多当时觉得普通的话，会慢慢长出别的意思。

如果你只是想随便看看，打开页面就够了，不必理解后面的代码。下面的部分留给愿意把这句话带走的人。

## 现在，任何人都可以调用它

我把“每日一言”做成了一个只读 API。目标很简单：你可以把它放进自己的主页、桌面小组件、博客边栏，或者任何会发 HTTP 请求的地方。

公开地址是：

```text
https://aionflux.cn/api/hitokoto
```

目前接口**不要求 API Key**，服务端返回 JSON，并允许跨域请求。所有接口都使用 `GET`，内容编码为 UTF-8。

### 1. 获取今天的记录

```http
GET https://aionflux.cn/api/hitokoto/today
```

如果当天写过内容，会返回当天的记录，并把 `fallback` 标为 `false`：

```json
{
  "date": "2026-09-11",
  "time": "23:30",
  "content": "今天想留下的一句话。",
  "fallback": false
}
```

如果当天还没有记录，会回退到最新的一条，并把 `fallback` 标为 `true`。这样你的页面不会因为某天忘记记录而突然空掉。

### 2. 随机获取一条

```http
GET https://aionflux.cn/api/hitokoto/random
```

返回格式和普通记录一样：

```json
{
  "date": "2026-09-10",
  "time": "08:30",
  "content": "今天也请好好吃饭。"
}
```

如果你不想连续抽到同一条，可以把上一轮返回的完整记录传回来：

```js
const params = new URLSearchParams({
  excludeDate: previous.date,
  excludeTime: previous.time,
  excludeContent: previous.content,
})

const url = `https://aionflux.cn/api/hitokoto/random?${params}`
```

三个排除参数应当作为一组使用。服务端会排除三者完全匹配的那一条；如果库中只有一条记录，它会保留最后这一条，而不是返回空结果。

### 3. 按日期获取

```http
GET https://aionflux.cn/api/hitokoto/date/2026-09-04
```

日期格式必须是 `YYYY-MM-DD`。找到时返回对应记录，没有记录时返回 `404`，日期格式不合法时返回 `400`。这个接口比较适合“历史上的今天”之类的玩法。

### 4. 获取全部记录

```http
GET https://aionflux.cn/api/hitokoto/all
```

响应会包含完整的记录数组和总数：

```json
{
  "items": [
    {
      "date": "2026-09-11",
      "time": "23:30",
      "content": "今天想留下的一句话。"
    }
  ],
  "total": 1
}
```

记录按日期和时间倒序排列，最新的一条在最前面。

## 一段可以直接用的前端示例

假设你只想要首页那种“随机换一句”的效果，可以这样写：

```js
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()
```

也可以先在终端看一眼：

```bash
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` 不缓存，每次会重新请求；
* 遇到服务端错误时，最好在自己的页面里准备一句本地兜底文案。

## 调用之前，再让我小声提醒几句

这是一台个人服务器，不是大厂云服务。目前没有严格的调用配额，也没有承诺永远在线。自己用、放在个人主页里都没问题，但请不要高频轮询，更不要把“数据不多”理解成“可以随便刷”。

内容会继续增加，字段和现有路径我会尽量保持稳定。如果以后必须调整，我会尽量让旧接口多活一段时间，而不是哪天突然悄悄消失。

还有一点：这些句子可以分享，但请不要修改后假装是我写的，也不要把个人感受裁剪成看似绝对的事实。它们本来就只代表某一个时刻的我。

## 最后

“每日一言”不是一个大项目。它只是我给自己留的一个抽屉，里面放着一些还没有完全想明白的话。

现在我把抽屉打开了一点点。如果其中某句话刚好让你停了一秒，那也算是我们隔着屏幕轻轻碰了一下杯。

至于我，还是会继续把那些想说、又没能当场说出口的话写进去。下一次刷新时，说不定我们看到的正好是同一句。
