{"skill":{"slug":"daily-tang-poem","displayName":"每日唐诗","summary":"每日唐诗：一句诗 + 讲解，晚上验收，支持艾宾浩斯复习和诗人缘分。触发词：今日唐诗、验收、复习、诗人缘分。","description":"---\nname: daily-tang-poem\ndescription: >\n  每日唐诗：一句诗 + 讲解，晚上验收，支持艾宾浩斯复习和诗人缘分。触发词：今日唐诗、验收、复习、诗人缘分。\n---\n\n# 每日唐诗 📜\n\n每天一句唐诗，白天推送 + 讲解，晚上验收背诵。支持复习（多种题型）和诗人缘分排行。\n\n---\n\n## 一、触发与模式识别\n\n| 用户可能说 | 模式 | 动作 |\n|------------|------|------|\n| 今日唐诗、早上的诗、今天的诗、daily tang poem | **推送** | 一句诗 + 讲解 |\n| 验收、背一下、检查、验收背诵 | **验收** | 背诵一句，你来校验 |\n| 复习、抽查、回顾、复习一下 | **复习** | 5 道题，多种题型 |\n| 诗人缘分、和谁有缘、哪位诗人、诗人 | **诗人** | 缘分排行 |\n\n**歧义处理**：根据上下文推断。若用户刚收到今日诗再说「背一下」，即验收；若说「复习」则进入复习流程。\n\n---\n\n## 二、推送模式\n\n**流程**：`GET {URL}/?date=YYYY-MM-DD`（不传 date 则用今天）→ 取 `recite_lines[0]` 作为主推送句。\n\n**输出格式**：\n1. 标题：《{title}》— {author}（{type}）\n2. **主推送**：只展示 `recite_lines[0]` 这一句（若无则用全诗 `contents`）\n3. **讲解**：2–3 句，你自己的话。**必须完整展示全诗**（用「全诗：……」引出），不得用省略号或任何方式截断。\n\n**示例**：\n```\n📜 今日唐诗 · 2025年3月4日\n\n《月下独酌》— 李白（五言古诗）\n\n我歌月徘徊，我舞影零乱。\n\n讲解：李白邀月对饮，与影共舞，把孤独写成热闹。这句从「歌」到「舞」，看似放达实则寂寞。全诗：花间一壶酒，独酌无相亲。举杯邀明月，对影成三人。月既不解饮，影徒随我身。暂伴月将影，行乐须及春。我歌月徘徊，我舞影零乱。醒时同交欢，醉后各分散。永结无情游，相期邈云汉。\n```\n\n---\n\n## 三、验收模式\n\n**提示一律由后端提供，禁止在 skill 中编造或写出诗句。**\n\n**流程**：\n1. **取验收提示**：调用 `GET {URL}/api/verification-hint?date=YYYY-MM-DD`（不传则当天）。返回 `{ date, poem_id, recite_hint }`。**只向用户展示返回的 `recite_hint` 作为提示**，不得修改、不得自行编造、不得在提示中出现要背的那句诗本身。\n2. 请用户背出原句。用户输入后，**调用后端判题**：`POST {URL}/api/validate-recite`，body：`{\"user_input\": \"用户背的句子\", \"date\": \"返回的 date\"}`（或 `\"poem_id\": 返回的 poem_id`）。鉴权同其他 API。\n3. 根据返回的 `passed` 与 `expected`：\n   - **通过** →「✅ 背得很好！今日任务完成。」并调用 `POST {URL}/api/pass` 记录（body: `{user_id, date, poem_id}`，user_id 从 `DAILY_TANG_POEM_USER_ID` 读取；若未配置则跳过记录）。\n   - **未过** → 温和指出，用返回的 `expected` 给出正确句，鼓励明天再试。\n\n**未看过今日诗**：若用户未先看今日诗就说验收，可先调 verification-hint 拿到 recite_hint，再回复：「今天还没有推送过今日唐诗哦。先对我说「今日唐诗」看看今天是哪一首，晚上再验收吧。」或直接回复该句。\n\n---\n\n## 四、复习模式\n\n**复习题目仅来自用户已验收通过的记录**，由后端根据 `user_id` 从存储中取出，**不得自行编造题目或使用其他来源**。验收通过后必须调用 `POST {URL}/api/pass` 记录，否则复习池中不会出现该句。用户需配置 `DAILY_TANG_POEM_USER_ID`。\n\n**流程**（全部由后端出题与判题，你只负责展示与调用 API）：\n1. **拉取题目**：`GET {URL}/api/review/questions?user_id={DAILY_TANG_POEM_USER_ID}&count=5`（可选 `&seed=YYYY-MM-DD`，默认当天）。返回 `{ seed, count, questions: [ { index, type, prompt, hint } ], message? }`。\n2. 若 `questions` 为空或存在 `message`，回复用户：「还没有通过验收的句子，先背几天再来复习吧～」\n3. **逐题出题**：按顺序展示每题的 `prompt`（可结合 `hint` 提示作者/诗名）。用户作答后，**调用判题**：`POST {URL}/api/review/check`，body：`{\"user_id\": \"...\", \"seed\": \"与拉取题目时返回的 seed 一致\", \"question_index\": 当前题序号, \"user_answer\": \"用户回答\"}`。\n4. 根据返回的 `correct` 与 `expected`：答对 ✅ 进入下一题，答错则展示 `expected` 再下一题。全部结束后：「本轮复习完成，答对 X/Y 题。」\n\n**题型**（后端已实现，你只需按 `type` 与 `prompt` 展示）：填空、默写、选作者、选诗名、排序。\n\n**边界**：返回的题目数可能少于 5，有多少出多少。\n\n**未配置 user_id**：若 API 返回 `user_id required`，提示用户配置 `DAILY_TANG_POEM_USER_ID`（如终端运行 `uuidgen`，写入技能 config）。\n\n**存储未配置**：若 API 返回 `Storage not configured` 或 503，提示复习暂不可用，今日诗和验收仍可用。\n\n---\n\n## 五、诗人缘分模式\n\n**流程**：`GET {URL}/api/poet-affinity?days=30` → 得到 `poets` 数组（含 `author`、`count`、`poems`）。\n\n**输出**：轻松、像「缘分测试」的语气。\n- 第一名：你和 **{author}** 最有缘！他的诗出现了 {count} 次。\n- 可举 1–2 首诗名为例\n- 列出前 3–5 名及次数\n- 收尾一句俏皮话（如「说不定你骨子里也有几分豪迈洒脱呢～」）\n\n**示例**：\n```\n📜 诗人缘分 · 最近30天\n\n你和 **李白** 最有缘！他的诗出现了 5 次，《月下独酌》《静夜思》《春思》……\n\n其次：杜甫 3 次，王维 2 次。\n\n说不定你骨子里也有几分豪迈洒脱呢～\n```\n\n---\n\n## 六、规则与语气\n\n- **一天一诗**：同一日期全世界同一首，不做「再抽一次」\n- **讲解**：用自己的话，2–3 句，不照抄\n- **验收**：语气鼓励，允许小错\n- **复习**：题型多样，逐题反馈，不一次扔完\n- **诗人**：轻松有趣，像抽签\n- **语言**：默认中文\n\n---\n\n## 七、API 速查\n\n**Base URL**：从技能配置 `DAILY_TANG_POEM_API_URL` 读取，默认值在 manifest 中定义，用户安装后无需配置。  \n**鉴权**：仅当配置了 `DAILY_TANG_POEM_API_KEY` 时，每个请求追加 `?key=配置值`；未配置则不追加。\n\n| 端点 | 参数 | 返回 |\n|------|------|------|\n| `GET /` | `date`（可选，YYYY-MM-DD，默认今天） | `id`, `title`, `author`, `type`, `contents`, `recite_lines`, `recite_hint` 等 |\n| `GET /api/verification-hint` | `date`（可选） | `{date, poem_id, recite_hint}`（仅验收用，不包含诗句内容） |\n| `POST /api/validate-recite` | body: `{user_input, date? \\| poem_id?}` | `{passed, expected, poem_id, date}` |\n| `GET /api/review/questions` | `user_id`（必填）, `count`=5（1–10）, `seed`（可选） | `{seed, count, questions: [{index, type, prompt, hint}]}` 或 `message` |\n| `POST /api/review/check` | body: `{user_id, seed, question_index, user_answer}` | `{correct, expected}` |\n| `GET /api/review` | `user_id`（必填）, `count`=5（1–10） | `{items: [...], total}` 或 `{items:[], message}`（旧版，复习建议用 questions） |\n| `POST /api/pass` | body: `{user_id, date, poem_id}` | `{ok:true}` |\n| `GET /api/poet-affinity` | `days`=30（1–365） | `{days, poets: [{author, count, poems: [{date, title, id}]}]}` |\n","tags":{"latest":"1.1.1"},"stats":{"comments":0,"downloads":689,"installsAllTime":26,"installsCurrent":1,"stars":0,"versions":3},"createdAt":1772616618605,"updatedAt":1778491714733},"latestVersion":{"version":"1.1.1","createdAt":1772691609270,"changelog":"验收判题/复习出题 API、验收提示后端生成、Vercel 导入修复","license":null},"metadata":null,"owner":{"handle":"romanluoman00007","userId":"s171sme55sbq6y1rta5smhp1dn844vca","displayName":"Romanluoman00007","image":"https://avatars.githubusercontent.com/u/205717325?v=4"},"moderation":null}