Skill: shaozrrr/book-of-answers-skill (version 1.0.0)

--- name: book-of-answers-skill description: Route natural-language questions into a three-book answer experience and return one random cited answer with SQLite-backed minimal per-user memory, duplicate-question protection, contextual book switching, and daily fortune. Use when Codex needs to build, run, extend, or debug a pure text conversational skill based on movie, literature, and music quote libraries. --- # Book of Answers Skill ## Core Workflow 1. Normalize the user input and resolve intents in this order: welcome, fallback, disabled-history notice, daily fortune, contextual switch-book, duplicate check, normal question. 2. Load per-user state from SQLite before generating any answer. 3. Reuse `last_question` only when the input is a switch-book follow-up such as `那用电影版的再测一次`. 4. Block identical questions asked within 300 seconds unless the request is a switch-book follow-up. 5. Persist only `last_question`, `last_answer`, `last_book`, and `last_timestamp` after each successful content response. 6. Default to a random choice between `《电影答案之书》`、`《文学答案之书》` and `《音乐答案之书》` unless the user explicitly specifies a book. 7. Render every answer with both正文 and `出处：...`. ## Project Files - Use `main.py` as the runtime entry point and local CLI for manual testing. - Use `service.py` for intent orchestration and response composition. - Use `router.py` for three-book routing and switch-book detection. - Use `storage.py` for SQLite persistence and state recovery. - Use `data/books.json` as the built-in answer corpus for the three themed books. - Use `skill.json` and `interaction_model.json` as the portable metadata and utterance definitions. - Use `README.md` as the repository-level setup and usage guide. ## Runtime Rules - Detect fallback input when the message contains no Chinese or alphabetic characters and is effectively digits or symbols only. - Prefer explicit book selection when the user names `电影`、`文学` or `音乐` in the same request. - Keep response formatting stable for normal answers: ```text 我感受到了你的困惑。 正在为你翻开 [book_name]... 它给你的指引是： 「 [答案正文] 」 出处：[出处] ``` ## Validation - Run `python3 main.py --user-id demo-user "明天会好吗"` for a direct single-turn test. - Run `python3 main.py --user-id demo-user --interactive` for a local REPL. - Run `python3 -m unittest discover -s tests` to validate key intent and state flows. - Run `python3 /Users/shaozhaoru/.codex/skills/.system/skill-creator/scripts/quick_validate.py /Users/shaozhaoru/Documents/book-of-answers-skill` after editing skill metadata.

path: README.md
content: # 答案之书.skill

有些问题，适合被分析；有些问题，却只适合在夜深灯静时，交给一句恰到好处的话。

《答案之书.skill》想做的，正是这样一件温柔而克制的事。它不替人做决定，不夸张地许诺命运，也不试图用冗长的解释掩盖犹疑本身。它只是从电影的光影、文学的章节与音乐的旋律里，轻轻翻出一句带着出处的回答，让提问者在某个瞬间，恰好与一句话相遇。

当你问它明天会不会更好、旅行会不会顺利、是否该远行、是否该放下，它不会像一台冷冰冰的问答机那样给出结论，而更像一位深夜仍为你留灯的馆员，从不同书架之间替你抽出一页，交到你手里。也许那不是标准答案，却往往会成为当下最像答案的那一句。

这是一个基于纯文本交互的对话技能项目。当前版本内置三本书：

- `《电影答案之书》`
- `《文学答案之书》`
- `《音乐答案之书》`

它会在三本书之间随机翻页，也允许使用者指定其中一本来提问；回答始终保留出处，并以尽量简洁、稳定、可分享的形式呈现。

## 一句话简介

把问题轻轻放下，让电影、文学与音乐为你翻出一句带出处的回答。

## 功能特性

- 三书库模式：默认在电影、文学、音乐三本书之间随机抽取，也支持指定其中一本来提问
- 答案带出处：每次返回都会展示正文与出处
- 反重复/防刷：5 分钟内重复提问同一问题会直接返回上一次答案
- 换书追问：支持在上一题上下文上执行“那用电影版的再测一次”“换文学之书”“换音乐之书”
- 每日一签：从三本书中随机翻出一句今日指引
- 最小状态持久化：仅保存防刷与换书追问所需的最小上下文

## 数据说明

- 内置书库统一维护在 `data/books.json`
- 当前已整理为三套可直接调用的书库数据
- 每条答案都以 `{text, source}` 形式存储，并在回复时展示 `出处：...`

## 模块职责

- `main.py`：CLI 入口和对外暴露的 `handle_request`
- `service.py`：业务编排、意图处理、响应格式和状态更新
- `router.py`：显式选书、换书识别与默认随机路由
- `storage.py`：SQLite 最小状态持久化与脏数据恢复
- `tests/test_integration.py`：多轮状态流集成测试

## 快速开始

```bash
cd /Users/shaozhaoru/Documents/book-of-answers-skill
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```

单次调用：

```bash
python3 main.py --user-id demo-user "明天会好吗"
```

启动欢迎语：

```bash
python3 main.py --user-id demo-user
```

交互模式：

```bash
python3 main.py --user-id demo-user --interactive
```

## 示例指令

- `明天会好吗`
- `用电影答案之书问明天会好吗`
- `请用文学答案之书回答我`
- `用音乐答案之书问我该放下吗`
- `那用电影版的再测一次`
- `换文学之书`
- `换音乐之书`
- `每日一签`

## 存储说明

- 默认数据库：`data/book-of-answers-skill.sqlite3`
- 默认仅保存 `last_question`、`last_answer`、`last_book`、`last_timestamp`
- 这些字段仅用于防刷与换书追问，不保留借阅历史记录
- 可通过环境变量覆盖数据库位置：

```bash
ANSWER_LIBRARY_DB=/tmp/book-of-answers-skill.sqlite3 python3 main.py --user-id demo-user "明天会好吗"
```

## 自定义书库

如需切换到你自己的外部书库文件：

```bash
ANSWER_LIBRARY_BOOKS=/absolute/path/to/books.json python3 main.py --user-id demo-user "明天会好吗"
```

## 校验与测试

运行单元测试：

```bash
python3 -m unittest discover -s tests
```

校验技能元数据：

```bash
python3 /Users/shaozhaoru/.codex/skills/.system/skill-creator/scripts/quick_validate.py /Users/shaozhaoru/Documents/book-of-answers-skill
```

## 响应格式

常规问答严格输出：

```text
我感受到了你的困惑。
正在为你翻开 [book_name]...

它给你的指引是：
「 [答案正文] 」
出处：[出处]
```


path: agents/openai.yaml
content: interface:
  display_name: "答案之书.skill"
  short_description: "在电影、文学与音乐之间翻开一句带出处的回答，替提问者照亮当下的犹疑"
  default_prompt: "Use $book-of-answers-skill to answer my question with a cited line drawn from the movie, literary, or music answer book, while keeping concise text output and per-user memory."


path: data/books.json
content: {
  "_meta": {
    "content_mode": "provided",
    "notice": "内置答案库来自用户提供的源文档，并为每条答案保留出处。",
    "counts": {
      "《电影答案之书》": 299,
      "《文学答案之书》": 300,
      "《音乐答案之书》": 300
    }
  },
  "《电影答案之书》": {
    "answers": [
      {
        "text": "做，或者不做。没有‘试试看’这回事。",
        "source": "《星球大战5：帝国反击战》"
      },
      {
        "text": "如果你有梦想，就要去捍卫它。",
        "source": "《当幸福来敲门》"
      },
      {
        "text": "希望是件好东西，也许是世上最好的东西，好东西从不会消逝。",
        "source": "《肖申克的救赎》"
      },
      {
        "text": "冒险就在前方！",
        "source": "《飞屋环游记》"
      },
      {
        "text": "跑，阿甘，快跑！",
        "source": "《阿甘正传》"
      },
      {
        "text": "去看看这个世界，去寻找那些隐秘的角落。",
        "source": "《白日梦想家》"
      },
      {
        "text": "做人如果没有梦想，跟咸鱼有什么分别？",
        "source": "《少林足球》"
      },
      {
        "text": "只要你一直向前走，总会到达某个地方的。",
        "source": "《爱丽丝梦游仙境》"
      },
      {
        "text": "有些鸟是关不住的，它们的羽毛太丰润了。",
        "source": "《肖申克的救赎》"
      },
      {
        "text": "决定我们成为什么样人的，不是我们的能力，而是我们的选择。",
        "source": "《哈利·波特与密室》"
      },
      {
        "text": "伟大并非生而有之，而是通过磨砺得来。",
        "source": "《教父》"
      },
      {
        "text": "你必须成为你希望在世界上看到的改变。",
        "source": "《甘地传》"
      },
      {
        "text": "勇敢点，哪怕是假装的。没有人能看出来。",
        "source": "《勇敢的心》"
      },
      {
        "text": "最黑暗的夜晚，往往也是黎明破晓前。",
        "source": "《蝙蝠侠：黑暗骑士》"
      },
      {
        "text": "你今天所做的，可以改变你所有的明天。",
        "source": "《回到未来》"
      },
      {
        "text": "只有在失去一切之后，我们才能自由地做任何事。",
        "source": "《搏击俱乐部》"
      },
      {
        "text": "不要让别人告诉你，你不能做什么。",
        "source": "《当幸福来敲门》"
      },
      {
        "text": "凡事都有可能，哪怕是那些不可能的事。",
        "source": "《欢乐满人间》"
      },
      {
        "text": "如果你不出去走走，你就会以为这就是世界。",
        "source": "《天堂电影院》"
      },
      {
        "text": "不要温柔地走进那个良夜。",
        "source": "《星际穿越》"
      },
      {
        "text": "我们该决定的是，如何利用这段被赋予的时间。",
        "source": "《指环王：护戒使者》"
      },
      {
        "text": "奇迹每天都在发生。",
        "source": "《阿甘正传》"
      },
      {
        "text": "去爱吧，就像从来没有受过伤害一样。",
        "source": "《尽善尽美》"
      },
      {
        "text": "你得先跌到谷底，才能重新站起来。",
        "source": "《搏击俱乐部》"
      },
      {
        "text": "行动胜于雄辩。",
        "source": "《蝙蝠侠：侠影之谜》"
      },
      {
        "text": "不要害怕失败，因为那是通往成功的必经之路。",
        "source": "《蝙蝠侠：侠影之谜》"
      },
      {
        "text": "有些事情，现在不做，一辈子都不会做了。",
        "source": "《练习曲》"
      },
      {
        "text": "生活不是电影，生活比电影苦多了。但你还是得继续。",
        "source": "《天堂电影院》"
      },
      {
        "text": "别让任何人觉得你不配拥有你想要的。",
        "source": "《我恨你的十件事》"
      },
      {
        "text": "你的人生是你自己创造的。",
        "source": "《楚门的世界》"
      },
      {
        "text": "现在就是最好的时机。",
        "source": "《死亡诗社》"
      },
      {
        "text": "打破规则，而不是法律。",
        "source": "《华尔街》"
      },
      {
        "text": "去争取你应得的。",
        "source": "《疤面煞星》"
      },
      {
        "text": "如果你不去尝试，你就永远不知道结果。",
        "source": "《千钧一发》"
      },
      {
        "text": "把握当下，男孩们。让你们的生命变得非凡。",
        "source": "《死亡诗社》"
      },
      {
        "text": "只要不放弃，就还有希望。",
        "source": "《荒岛余生》"
      },
      {
        "text": "路是自己走出来的。",
        "source": "《无间道》"
      },
      {
        "text": "我命由我不由天。",
        "source": "《哪吒之魔童降世》"
      },
      {
        "text": "去寻找你的绿洲吧。",
        "source": "《头号玩家》"
      },
      {
        "text": "既然选择了远方，便只顾风雨兼程。",
        "source": "《大鱼海棠》"
      },
      {
        "text": "不要回头，一直向前看。",
        "source": "《千与千寻》"
      },
      {
        "text": "要想改变世界，先改变自己。",
        "source": "《黑客帝国》"
      },
      {
        "text": "这是你的世界，去塑造它。",
        "source": "《盗梦空间》"
      },
      {
        "text": "相信你自己，这就够了。",
        "source": "《功夫熊猫》"
      },
      {
        "text": "不要被恐惧支配你的生活。",
        "source": "《疯狂原始人》"
      },
      {
        "text": "去发现未知的世界。",
        "source": "《星际迷航》"
      },
      {
        "text": "哪怕只有百分之一的机会，也要付出百分之百的努力。",
        "source": "《百万美元宝贝》"
      },
      {
        "text": "去追求那束光。",
        "source": "《了不起的盖茨比》"
      },
      {
        "text": "站起来，继续战斗。",
        "source": "《洛奇》"
      },
      {
        "text": "你的心是自由的，有勇气去追随它吧。",
        "source": "《勇敢的心》"
      },
      {
        "text": "一切都会好的。如果还没好，说明还没到最后。",
        "source": "《涉外大饭店》"
      },
      {
        "text": "让子弹飞一会儿。",
        "source": "《让子弹飞》"
      },
      {
        "text": "哈库纳玛塔塔（别烦恼）。",
        "source": "《狮子王》"
      },
      {
        "text": "毕竟，明天又是新的一天。",
        "source": "《乱世佳人》"
      },
      {
        "text": "让它去吧 (Let it go)。",
        "source": "《冰雪奇缘》"
      },
      {
        "text": "世界上没有绝对的巧合。",
        "source": "《功夫熊猫》"
      },
      {
        "text": "大雨过后，总会看到彩虹的。",
        "source": "《飞屋环游记》"
      },
      {
        "text": "不要着急，最好的总会在最不经意的时候出现。",
        "source": "《泰坦尼克号》"
      },
      {
        "text": "生命自会找到出路。",
        "source": "《侏罗纪公园》"
      },
      {
        "text": "继续游就对了。",
        "source": "《海底总动员》"
      },
      {
        "text": "有些事情你无法改变，你必须接受。",
        "source": "《阿甘正传》"
      },
      {
        "text": "顺应水流，不要逆流而上。",
        "source": "《大河恋》"
      },
      {
        "text": "人生匆匆，若不偶尔停下来看看，就会错过很多风景。",
        "source": "《春天不是读书天》"
      },
      {
        "text": "属于你的，终究会来。",
        "source": "《本杰明·巴顿奇事》"
      },
      {
        "text": "真正的平静，是在风暴中心找到的。",
        "source": "《黑客帝国》"
      },
      {
        "text": "时间会带走一切，包括痛苦。",
        "source": "《绿里奇迹》"
      },
      {
        "text": "你无法改变风向，但你可以调整风帆。",
        "source": "《加勒比海盗》"
      },
      {
        "text": "闭上眼睛，感受现在的这一刻。",
        "source": "《心灵奇旅》"
      },
      {
        "text": "过去的痛楚固然存在，但你可以选择逃避，或者从中学习。",
        "source": "《狮子王》"
      },
      {
        "text": "有时候，正确的道路往往不是那条最轻松的。",
        "source": "《风中奇缘》"
      },
      {
        "text": "答案不在风中，而在你心里。",
        "source": "《阿甘正传》"
      },
      {
        "text": "静观其变。",
        "source": "《教父》"
      },
      {
        "text": "没有什么是永恒的，即使是麻烦。",
        "source": "《摩登时代》"
      },
      {
        "text": "接受当下，即是破局。",
        "source": "《黑客帝国3：矩阵革命》"
      },
      {
        "text": "随遇而安。",
        "source": "《荒野生存》"
      },
      {
        "text": "一切都是最好的安排。",
        "source": "《贫民窟的百万富翁》"
      },
      {
        "text": "耐心是苦涩的，但它的果实是甜的。",
        "source": "《灰姑娘》"
      },
      {
        "text": "有些树，注定要长在风中。",
        "source": "《荒野猎人》"
      },
      {
        "text": "不要为打翻的牛奶哭泣。",
        "source": "《生活多美好》"
      },
      {
        "text": "有时候，什么都不做才是最好的选择。",
        "source": "《战争之王》"
      },
      {
        "text": "随风而逝。",
        "source": "《乱世佳人》"
      },
      {
        "text": "万物皆有定时。",
        "source": "《圣女贞德》"
      },
      {
        "text": "退一步海阔天空。",
        "source": "《卧虎藏龙》"
      },
      {
        "text": "不要试图控制一切。",
        "source": "《楚门的世界》"
      },
      {
        "text": "顺其自然吧，命运自有安排。",
        "source": "《霍比特人》"
      },
      {
        "text": "在时间的长河里，这不过是泛起的一朵小浪花。",
        "source": "《时间机器》"
      },
      {
        "text": "学会放下，才能拿起。",
        "source": "《卧虎藏龙》"
      },
      {
        "text": "等待，也是一种力量。",
        "source": "《基督山伯爵》"
      },
      {
        "text": "不急，我们还有一辈子的时间。",
        "source": "《飞屋环游记》"
      },
      {
        "text": "该来的总会来。",
        "source": "《老无所依》"
      },
      {
        "text": "保持呼吸，活着就好。",
        "source": "《荒岛余生》"
      },
      {
        "text": "在沉默中寻找答案。",
        "source": "《沉默的羔羊》"
      },
      {
        "text": "给时间一点时间。",
        "source": "《本杰明·巴顿奇事》"
      },
      {
        "text": "有些梦，醒来就好。",
        "source": "《盗梦空间》"
      },
      {
        "text": "不必强求完美。",
        "source": "《黑天鹅》"
      },
      {
        "text": "享受过程，别太在意结果。",
        "source": "《深夜加油站遇见苏格拉底》"
      },
      {
        "text": "慢下来，去生活。",
        "source": "《普罗旺斯的夏天》"
      },
      {
        "text": "一切都会过去的。",
        "source": "《辛德勒的名单》"
      },
      {
        "text": "让时间证明一切。",
        "source": "《肖申克的救赎》"
      },
      {
        "text": "休斯顿，我们有麻烦了。",
        "source": "《阿波罗13号》"
      },
      {
        "text": "出来混，迟早要还的。",
        "source": "《无间道》"
      },
      {
        "text": "我对此有一种不祥的预感。",
        "source": "《星球大战》"
      },
      {
        "text": "忘了它吧，杰克，这就是唐人街。",
        "source": "《唐人街》"
      },
      {
        "text": "小心别被你的野心噎死。",
        "source": "《星球大战外传：侠盗一号》"
      },
      {
        "text": "这世界并不全是阳光和彩虹。",
        "source": "《洛奇6：永远的拳王》"
      },
      {
        "text": "我们已经不在堪萨斯了。",
        "source": "《绿野仙踪》"
      },
      {
        "text": "恐惧是通向黑暗面的道路。",
        "source": "《星球大战前传1：幽灵的威胁》"
      },
      {
        "text": "有些门一旦打开，就再也关不上了。",
        "source": "《黑客帝国》"
      },
      {
        "text": "贪婪，从缺乏中生出，永远得不到满足。",
        "source": "《华尔街》"
      },
      {
        "text": "真相往往是痛苦的。",
        "source": "《黑客帝国》"
      },
      {
        "text": "你眼中看到的，未必是真实的。",
        "source": "《盗梦空间》"
      },
      {
        "text": "越是看似完美的东西，越可能隐藏着危险。",
        "source": "《楚门的世界》"
      },
      {
        "text": "别让你的眼睛欺骗了你。",
        "source": "《星球大战》"
      },
      {
        "text": "你无法逃避自己的命运。",
        "source": "《终结者》"
      },
      {
        "text": "有些秘密，最好永远埋葬。",
        "source": "《夺宝奇兵》"
      },
      {
        "text": "代价是什么？",
        "source": "《复仇者联盟3：无限战争》"
      },
      {
        "text": "这不是你该来的地方。",
        "source": "《千与千寻》"
      },
      {
        "text": "不要轻易许下你无法兑现的诺言。",
        "source": "《教父》"
      },
      {
        "text": "你以为你赢了，其实你才刚刚开始输。",
        "source": "《社交网络》"
      },
      {
        "text": "不要相信任何人。",
        "source": "《X档案：征服未来》"
      },
      {
        "text": "这不是演习。",
        "source": "《独立日》"
      },
      {
        "text": "危险就在身边。",
        "source": "《大白鲨》"
      },
      {
        "text": "一切都是幻觉。",
        "source": "《搏击俱乐部》"
      },
      {
        "text": "游戏结束了。",
        "source": "《电锯惊魂》"
      },
      {
        "text": "你正在玩火。",
        "source": "《碟中谍》"
      },
      {
        "text": "没有回头路了。",
        "source": "《黑客帝国》"
      },
      {
        "text": "小心你许下的愿望。",
        "source": "《魔法黑森林》"
      },
      {
        "text": "这不是一个好主意。",
        "source": "《侏罗纪公园》"
      },
      {
        "text": "你承担不起这个后果。",
        "source": "《复仇者联盟》"
      },
      {
        "text": "有些事，不知道比知道好。",
        "source": "《无间道》"
      },
      {
        "text": "黑暗即将来临。",
        "source": "《权力的游戏》(剧场特别版)"
      },
      {
        "text": "你选错了对手。",
        "source": "《第一滴血》"
      },
      {
        "text": "前方高能。",
        "source": "《星际迷航》"
      },
      {
        "text": "不要越过那条线。",
        "source": "《边境杀手》"
      },
      {
        "text": "这只是一个陷阱。",
        "source": "《星球大战3：绝地归来》"
      },
      {
        "text": "你会被吞噬的。",
        "source": "《深渊》"
      },
      {
        "text": "保持警惕。",
        "source": "《哈利·波特与死亡圣器》"
      },
      {
        "text": "不要被表象迷惑。",
        "source": "《致命魔术》"
      },
      {
        "text": "代价太高昂了。",
        "source": "《拯救大兵瑞恩》"
      },
      {
        "text": "这不是你一个人能解决的。",
        "source": "《正义联盟》"
      },
      {
        "text": "放弃吧，你赢不了的。",
        "source": "《黑客帝国》"
      },
      {
        "text": "退后，这里不安全。",
        "source": "《变形金刚》"
      },
      {
        "text": "不要触碰那个按钮。",
        "source": "《银河护卫队》"
      },
      {
        "text": "你会后悔的。",
        "source": "《终结者2：审判日》"
      },
      {
        "text": "有些代价是无法挽回的。",
        "source": "《蝴蝶效应》"
      },
      {
        "text": "这不是你的战争。",
        "source": "《第一滴血》"
      },
      {
        "text": "别逼我。",
        "source": "《绿巨人》"
      },
      {
        "text": "你已经无路可逃了。",
        "source": "《亡命天涯》"
      },
      {
        "text": "📁 类别四：哲学 / 灵魂觉醒 (适合深层次的自我追问)",
        "source": ""
      },
      {
        "text": "念念不忘，必有回响。",
        "source": "《一代宗师》"
      },
      {
        "text": "我们之所以跌倒，是为了学会自己站起来。",
        "source": "《蝙蝠侠：侠影之谜》"
      },
      {
        "text": "你必须迷失方向，才能找到自己。",
        "source": "《纸镇》"
      },
      {
        "text": "只有用心才能看清事物本质，真正重要的东西是肉眼无法看见的。",
        "source": "《小王子》"
      },
      {
        "text": "要想了解一个人的真面目，就要看他如何对待那些比他地位低的人。",
        "source": "《哈利·波特与火焰杯》"
      },
      {
        "text": "即使世界再残酷，我们也要保持内心的纯真。",
        "source": "《剪刀手爱德华》"
      },
      {
        "text": "真相会让你自由，但首先它会激怒你。",
        "source": "《黑客帝国》"
      },
      {
        "text": "每个人都会死，但并非每个人都真正活过。",
        "source": "《勇敢的心》"
      },
      {
        "text": "重要的不是你来自哪里，而是你要去哪里。",
        "source": "《心灵捕手》"
      },
      {
        "text": "你的过去不能决定你的未来。",
        "source": "《X战警：逆转未来》"
      },
      {
        "text": "我们只是宇宙中的星尘。",
        "source": "《星际穿越》"
      },
      {
        "text": "一切的终点，就是新的起点。",
        "source": "《黑客帝国3：矩阵革命》"
      },
      {
        "text": "当你原谅别人时，你就释放了自己。",
        "source": "《不可饶恕》"
      },
      {
        "text": "人生的意义在于体验，而不是拥有。",
        "source": "《遗愿清单》"
      },
      {
        "text": "保持饥饿，保持愚蠢。",
        "source": "《乔布斯》"
      },
      {
        "text": "在绝望中寻找希望。",
        "source": "《辛德勒的名单》"
      },
      {
        "text": "死亡是生命的一部分，是我们注定要经历的。",
        "source": "《阿甘正传》"
      },
      {
        "text": "有时候，你得在理智和情感之间做出选择。",
        "source": "《理智与情感》"
      },
      {
        "text": "世间所有的相遇，都是久别重逢。",
        "source": "《一代宗师》"
      },
      {
        "text": "生命是一场幻觉。",
        "source": "《海上钢琴师》"
      },
      {
        "text": "你不是你的工作，你不是你银行卡里的数字。",
        "source": "《搏击俱乐部》"
      },
      {
        "text": "我们都在阴沟里，但仍有人仰望星空。",
        "source": "《王尔德》"
      },
      {
        "text": "真正的敌人是时间。",
        "source": "《星际穿越》"
      },
      {
        "text": "没有阴影，就没有光。",
        "source": "《刺客信条》"
      },
      {
        "text": "存在的本身就是一种意义。",
        "source": "《生命之树》"
      },
      {
        "text": "痛苦是暂时的，而电影是永恒的。",
        "source": "《天堂电影院》"
      },
      {
        "text": "不要试图去理解它，去感受它。",
        "source": "《信条》"
      },
      {
        "text": "万物皆虚，万事皆允。",
        "source": "《刺客信条》"
      },
      {
        "text": "命运是一座桥，不是一堵墙。",
        "source": "《本杰明·巴顿奇事》"
      },
      {
        "text": "每个人都有自己的地狱。",
        "source": "《禁闭岛》"
      },
      {
        "text": "记忆是我们灵魂的碎片。",
        "source": "《银翼杀手》"
      },
      {
        "text": "时间是一个相对的概念。",
        "source": "《星际穿越》"
      },
      {
        "text": "人类的悲欢并不相通。",
        "source": "《巴别塔》"
      },
      {
        "text": "最坚固的牢笼，是你自己建造的。",
        "source": "《楚门的世界》"
      },
      {
        "text": "生活就是不断地放下。",
        "source": "《少年派的奇幻漂流》"
      },
      {
        "text": "我们用一生去学习如何爱。",
        "source": "《英国病人》"
      },
      {
        "text": "真理掌握在少数人手里。",
        "source": "《十二怒汉》"
      },
      {
        "text": "孤独是人生的常态。",
        "source": "《迷失东京》"
      },
      {
        "text": "梦境是现实的倒影。",
        "source": "《盗梦空间》"
      },
      {
        "text": "自由是有代价的。",
        "source": "《美国队长：冬日战士》"
      },
      {
        "text": "信仰可以移山。",
        "source": "《血战钢锯岭》"
      },
      {
        "text": "不要被过去的阴影困住。",
        "source": "《狮子王》"
      },
      {
        "text": "知识就是力量。",
        "source": "《心灵捕手》"
      },
      {
        "text": "在混沌中寻找秩序。",
        "source": "《黑暗骑士》"
      },
      {
        "text": "人性本善，还是本恶？",
        "source": "《七宗罪》"
      },
      {
        "text": "灵魂是不会死去的。",
        "source": "《寻梦环游记》"
      },
      {
        "text": "每一个选择，都在创造一个平行宇宙。",
        "source": "《蝴蝶效应》"
      },
      {
        "text": "我们都是自己故事里的主角。",
        "source": "《楚门的世界》"
      },
      {
        "text": "看透不说透，还是好朋友。",
        "source": "《非诚勿扰》"
      },
      {
        "text": "这世上只有一种真正的英雄主义，那就是认清生活的真相后依然热爱它。",
        "source": "《罗曼蒂克消亡史》（化用）"
      },
      {
        "text": "如果非要在这份爱上加上一个期限，我希望是，一万年。",
        "source": "《大话西游》"
      },
      {
        "text": "不如我们从头来过。",
        "source": "《春光乍泄》"
      },
      {
        "text": "有些人浅薄，有些人金玉其外而败絮其中。可有一天你会遇到一个彩虹般绚丽的人。",
        "source": "《怦然心动》"
      },
      {
        "text": "你让我想要成为一个更好的人。",
        "source": "《尽善尽美》"
      },
      {
        "text": "爱意味着永远不必说抱歉。",
        "source": "《爱情故事》"
      },
      {
        "text": "我来这里是因为，当你意识到你想要与某人共度余生时，你会希望你的余生尽快开始。",
        "source": "《当哈利遇到莎莉》"
      },
      {
        "text": "爱是唯一能超越时间和空间的维度。",
        "source": "《星际穿越》"
      },
      {
        "text": "我爱你，不仅因为你的样子，还因为和你在一起时我的样子。",
        "source": "《爱在黎明破晓前》"
      },
      {
        "text": "我甚至连他的一张照片都没有。他只活在我的记忆里。",
        "source": "《泰坦尼克号》"
      },
      {
        "text": "爱情就是一场冒险。",
        "source": "《诺丁山》"
      },
      {
        "text": "有些人，一旦错过就不在。",
        "source": "《后来》（电影引用语境）"
      },
      {
        "text": "你是我每天早上醒来的唯一理由。",
        "source": "《遇见你之前》"
      },
      {
        "text": "我愿意为你放弃一切。",
        "source": "《罗密欧与朱丽叶》"
      },
      {
        "text": "我们相爱，就是上帝在微笑。",
        "source": "《情书》"
      },
      {
        "text": "如果我知道怎么戒掉你就好了。",
        "source": "《断背山》"
      },
      {
        "text": "斯人若彩虹，遇上方知有。",
        "source": "《怦然心动》"
      },
      {
        "text": "我跨越了时间的海洋来找你。",
        "source": "《惊情四百年》"
      },
      {
        "text": "你给了我一段永恒的日子。",
        "source": "《星运里的错》"
      },
      {
        "text": "爱一个人，就是赋予他伤害你的权力。",
        "source": "《暮光之城》"
      },
      {
        "text": "我不仅爱你的优点，也爱你的缺点。",
        "source": "《心灵捕手》"
      },
      {
        "text": "有些爱，只能止于唇齿，掩于岁月。",
        "source": "《甜蜜蜜》"
      },
      {
        "text": "我想要的只是你。",
        "source": "《恋恋笔记本》"
      },
      {
        "text": "你是我生命中的光。",
        "source": "《暮光之城》"
      },
      {
        "text": "最好的爱情，是让你成为更好的自己。",
        "source": "《爱乐之城》"
      },
      {
        "text": "我一直都在这里。",
        "source": "《幽灵公主》"
      },
      {
        "text": "真正的爱，是放手。",
        "source": "《泰坦尼克号》"
      },
      {
        "text": "我们注定要相遇。",
        "source": "《缘分天注定》"
      },
      {
        "text": "我不在乎你的过去，我只在乎我们的未来。",
        "source": "《卡萨布兰卡》"
      },
      {
        "text": "爱情没有对错，只有愿不愿意。",
        "source": "《花样年华》"
      },
      {
        "text": "你完整了我的人生。",
        "source": "《甜心先生》"
      },
      {
        "text": "只要你记得我，我就一直活着。",
        "source": "《寻梦环游记》"
      },
      {
        "text": "爱是无法被计算的。",
        "source": "《美丽心灵》"
      },
      {
        "text": "我为你心动。",
        "source": "《傲慢与偏见》"
      },
      {
        "text": "你是我的灵魂伴侣。",
        "source": "《阿甘正传》"
      },
      {
        "text": "我的心属于你。",
        "source": "《乱世佳人》"
      },
      {
        "text": "爱能治愈一切伤痛。",
        "source": "《绿里奇迹》"
      },
      {
        "text": "我喜欢你，现在的你。",
        "source": "《BJ单身日记》"
      },
      {
        "text": "无论你在哪里，我都能找到你。",
        "source": "《最后的莫西干人》"
      },
      {
        "text": "爱情是一场美丽的意外。",
        "source": "《天使爱美丽》"
      },
      {
        "text": "不要因为害怕失去而不敢去爱。",
        "source": "《情归新泽西》"
      },
      {
        "text": "你是我最美好的意外。",
        "source": "《遇见你之前》"
      },
      {
        "text": "我们天生一对。",
        "source": "《天生杀人狂》"
      },
      {
        "text": "爱是盲目的。",
        "source": "《大都会》"
      },
      {
        "text": "我会永远保护你。",
        "source": "《这个杀手不太冷》"
      },
      {
        "text": "你让我重新相信了爱。",
        "source": "《真爱至上》"
      },
      {
        "text": "爱情需要勇气。",
        "source": "《勇敢的心》"
      },
      {
        "text": "你是我唯一的牵挂。",
        "source": "《星际穿越》"
      },
      {
        "text": "就算世界毁灭，我也要和你在一起。",
        "source": "《2012》"
      },
      {
        "text": "爱，就是不问值不值得。",
        "source": "《半生缘》"
      },
      {
        "text": "原来你也在这里。",
        "source": "《爱在日落黄昏时》"
      },
      {
        "text": "愿原力与你同在。",
        "source": "《星球大战》"
      },
      {
        "text": "我还会回来的。",
        "source": "《终结者》"
      },
      {
        "text": "给我看钱！",
        "source": "《甜心先生》"
      },
      {
        "text": "飞向宇宙，浩瀚无垠！",
        "source": "《玩具总动员》"
      },
      {
        "text": "你跟我说话吗？",
        "source": "《出租车司机》"
      },
      {
        "text": "为什么这么严肃？",
        "source": "《蝙蝠侠：黑暗骑士》"
      },
      {
        "text": "我要给他一个他无法拒绝的条件。",
        "source": "《教父》"
      },
      {
        "text": "路？我们要去的地方不需要路。",
        "source": "《回到未来》"
      },
      {
        "text": "生活是一场宴席，而大多数可怜的傻瓜却快饿死了！",
        "source": "《欢乐梅姑》"
      },
      {
        "text": "下课了，朋友们！",
        "source": "《摇滚校园》"
      },
      {
        "text": "打劫！IQ卡，IC卡，IP卡，统统交出来！",
        "source": "《天下无贼》"
      },
      {
        "text": "我顶你个肺啊！",
        "source": "《疯狂的石头》"
      },
      {
        "text": "你看这个人，嘴里说不要，身体却很诚实。",
        "source": "《九品芝麻官》"
      },
      {
        "text": "其实，我是一个演员。",
        "source": "《喜剧之王》"
      },
      {
        "text": "地球很危险，你还是回火星去吧。",
        "source": "《少林足球》"
      },
      {
        "text": "我书读得少，你别骗我。",
        "source": "《精武门》"
      },
      {
        "text": "出来混，要讲信用，说杀你全家，就一定杀你全家。",
        "source": "《古惑仔》"
      },
      {
        "text": "你不仅是个疯子，还是个笨蛋。",
        "source": "《加勒比海盗》"
      },
      {
        "text": "我就是钢铁侠。",
        "source": "《钢铁侠》"
      },
      {
        "text": "能力越大，责任越大。",
        "source": "《蜘蛛侠》"
      },
      {
        "text": "为了部落！",
        "source": "《魔兽》"
      },
      {
        "text": "这是什么鬼地方？",
        "source": "《异形》"
      },
      {
        "text": "你妈贵姓？",
        "source": "《大话西游》"
      },
      {
        "text": "不要迷恋哥，哥只是个传说。",
        "source": "《国产凌凌漆》"
      },
      {
        "text": "人生如戏，全靠演技。",
        "source": "《喜剧之王》"
      },
      {
        "text": "我不做大哥好多年。",
        "source": "《英雄本色》"
      },
      {
        "text": "让暴风雨来得更猛烈些吧！",
        "source": "《海燕》(电影引用)"
      },
      {
        "text": "谁能比我惨？！",
        "source": "《唐伯虎点秋香》"
      },
      {
        "text": "我只猜中了前头，可是我却猜不中这结局。",
        "source": "《大话西游》"
      },
      {
        "text": "我是世界之王！",
        "source": "《泰坦尼克号》"
      },
      {
        "text": "上帝保佑美国。",
        "source": "《拯救大兵瑞恩》"
      },
      {
        "text": "闭嘴，拿走我的钱！",
        "source": "《飞出个未来》(大电影)"
      },
      {
        "text": "你太让我失望了。",
        "source": "《教父2》"
      },
      {
        "text": "你被解雇了！",
        "source": "《回到未来2》"
      },
      {
        "text": "欢迎来到真实世界。",
        "source": "《黑客帝国》"
      },
      {
        "text": "我看到了死人。",
        "source": "《第六感》"
      },
      {
        "text": "向我开炮！",
        "source": "《英雄儿女》"
      },
      {
        "text": "同志们，为了新中国，冲啊！",
        "source": "《董存瑞》"
      },
      {
        "text": "别开枪，自己人！",
        "source": "《地道战》"
      },
      {
        "text": "我代表月亮消灭你！",
        "source": "《美少女战士剧场版》"
      },
      {
        "text": "就决定是你了！",
        "source": "《精灵宝可梦剧场版》"
      },
      {
        "text": "真相只有一个！",
        "source": "《名侦探柯南剧场版》"
      },
      {
        "text": "这简直不可思议！",
        "source": "《侏罗纪公园》"
      },
      {
        "text": "我的宝贝...",
        "source": "《指环王：双塔奇兵》"
      },
      {
        "text": "你是一个玩具！",
        "source": "《玩具总动员》"
      },
      {
        "text": "你是个巫师，哈利。",
        "source": "《哈利·波特与魔法石》"
      },
      {
        "text": "我饿了。",
        "source": "《千与千寻》"
      },
      {
        "text": "不要吃我！",
        "source": "《怪物史莱克》"
      },
      {
        "text": "你好，世界。",
        "source": "《黑客帝国》"
      },
      {
        "text": "The End.",
        "source": "《无数经典老电影的最后字幕》"
      }
    ]
  },
  "《文学答案之书》": {
    "answers": [
      {
        "text": "凡是过去，皆为序章。",
        "source": "莎士比亚《暴风雨》"
      },
      {
        "text": "满地都是六便士，他却抬头看见了月亮。",
        "source": "毛姆《月亮与六便士》"
      },
      {
        "text": "一个人并不是生来要给打败的。",
        "source": "海明威《老人与海》"
      },
      {
        "text": "离你越近的地方，路途越远；最简单的音调，需要最艰苦的练习。",
        "source": "泰戈尔《吉檀迦利》"
      },
      {
        "text": "不要向井里吐痰，也许你还会来喝井里的水。",
        "source": "肖洛霍夫《静静的顿河》"
      },
      {
        "text": "世上本没有路，走的人多了，也便成了路。",
        "source": "鲁迅《故乡》"
      },
      {
        "text": "去吧，去过你自己的生活。",
        "source": "契诃夫《海鸥》"
      },
      {
        "text": "我只是一滴清水，不是肥皂水，不能吹泡泡。",
        "source": "杨绛《洗澡》"
      },
      {
        "text": "所有的大人都曾经是小孩，虽然，只有少数的人记得。",
        "source": "安东尼·德·圣-埃克苏佩里《小王子》"
      },
      {
        "text": "明天又是另外一天了。",
        "source": "玛格丽特·米切尔《飘》"
      },
      {
        "text": "你千万别跟任何人谈任何事情。你只要一谈起，就会想念起每一个人来。",
        "source": "塞林格《麦田里的守望者》"
      },
      {
        "text": "世界上只有一种真正的英雄主义，那就是在认清生活的真相后依然热爱生活。",
        "source": "罗曼·罗兰《米开朗基罗传》"
      },
      {
        "text": "不管我们的命运如何，我们都应该勇敢地去面对它。",
        "source": "狄更斯《远大前程》"
      },
      {
        "text": "让你的生命如夏花之绚烂，死如秋叶之静美。",
        "source": "泰戈尔《飞鸟集》"
      },
      {
        "text": "我们什么都没有，唯一的本钱就是青春。梦想让我与众不同，奋斗让我改变命运！",
        "source": "路遥《平凡的世界》"
      },
      {
        "text": "幸福的家庭都是相似的，不幸的家庭各有各的不幸。",
        "source": "列夫·托尔斯泰《安娜·卡列尼娜》"
      },
      {
        "text": "生存还是毁灭，这是一个值得考虑的问题。",
        "source": "莎士比亚《哈姆雷特》"
      },
      {
        "text": "一个人知道自己为什么而活，就可以忍受任何一种生活。",
        "source": "尼采《查拉图斯特拉如是说》"
      },
      {
        "text": "你如果认识从前的我，也许你会原谅现在的我。",
        "source": "张爱玲《倾城之恋》"
      },
      {
        "text": "生命是一袭华美的袍，爬满了蚤子。",
        "source": "张爱玲《天才梦》"
      },
      {
        "text": "一切都在无可挽回地走向庸俗。",
        "source": "王小波《万寿寺》"
      },
      {
        "text": "我年纪还轻，阅历不深，那时候我只懂得爱，不懂得宽容。",
        "source": "歌德《少年维特的烦恼》"
      },
      {
        "text": "人最宝贵的东西是生命。生命对人来说只有一次。",
        "source": "奥斯特洛夫斯基《钢铁是怎样炼成的》"
      },
      {
        "text": "不要着急，最好的总会在最不经意的时候出现。",
        "source": "泰戈尔《飞鸟集》"
      },
      {
        "text": "我越是孤独，越是没有朋友，越是没有支持，我就得越尊重我自己。",
        "source": "夏洛蒂·勃朗特《简·爱》"
      },
      {
        "text": "真正的自由不是想做什么就做什么，而是不想做什么就可以不做什么。",
        "source": "康德《道德形而上学》"
      },
      {
        "text": "一切伟大的行动和思想，都有一个微不足道的开始。",
        "source": "阿尔贝·加缪《西西弗神话》"
      },
      {
        "text": "冬天来了，春天还会远吗？",
        "source": "雪莱《西风颂》"
      },
      {
        "text": "即使在最黑暗的时刻，也总会有一线光明。",
        "source": "雨果《悲惨世界》"
      },
      {
        "text": "人是为了自己的希望才活着的。",
        "source": "肖洛霍夫《静静的顿河》"
      },
      {
        "text": "时间会刺破青春表面的彩饰，会在美人的额上掘深沟浅槽。",
        "source": "莎士比亚《十四行诗》"
      },
      {
        "text": "命运总是不如人愿。但往往是在无数的痛苦中，在重重的矛盾和艰难中，才使人成熟起来。",
        "source": "路遥《平凡的世界》"
      },
      {
        "text": "没有比漫无目的地徘徊更令人无法忍受的了。",
        "source": "荷马《奥德赛》"
      },
      {
        "text": "如果你因失去了太阳而流泪，那么你也将失去群星了。",
        "source": "泰戈尔《飞鸟集》"
      },
      {
        "text": "最深沉的感情往往是以最冷漠的方式表现出来的。",
        "source": "钱钟书《围城》"
      },
      {
        "text": "只要你是天鹅蛋，就是生在养鸡场里也没有什么关系。",
        "source": "安徒生《丑小鸭》"
      },
      {
        "text": "我必须承认，幸运喜欢照顾勇敢的人。",
        "source": "达尔文《物种起源》"
      },
      {
        "text": "无论怎么样，一个人借故堕落总是不值得原谅的。",
        "source": "亦舒《星之碎片》"
      },
      {
        "text": "生活总是让我们遍体鳞伤，但到后来，那些受伤的地方一定会变成我们最强壮的地方。",
        "source": "海明威《永别了，武器》"
      },
      {
        "text": "世间的好物，不坚牢，彩云易散琉璃脆。",
        "source": "白居易《简简吟》"
      },
      {
        "text": "你迟到了许多年，可我依然为你的到来而高兴。",
        "source": "阿兰·德波顿《爱情笔记》"
      },
      {
        "text": "我们曾经如此渴望命运的波澜，到最后才发现：人生最曼妙的风景，竟是内心的淡定与从容。",
        "source": "杨绛《一百岁感言》"
      },
      {
        "text": "人生就像一座围城，城外的人想进去，城里的人想出来。",
        "source": "钱钟书《围城》"
      },
      {
        "text": "我们都生活在阴沟里，但仍有人仰望星空。",
        "source": "王尔德《温夫人的扇子》"
      },
      {
        "text": "人只有在自由中才能找到真实的自己。",
        "source": "卢梭《社会契约论》"
      },
      {
        "text": "不要因为走得太远，忘了我们为什么出发。",
        "source": "纪伯伦《先知》"
      },
      {
        "text": "一个人如果连自己都无法控制，又怎么能控制别人呢？",
        "source": "马基雅维利《君主论》"
      },
      {
        "text": "世上没有绝望的处境，只有对处境绝望的人。",
        "source": "哈代《德伯家的苔丝》"
      },
      {
        "text": "黑夜无论怎样悠长，白昼总会到来。",
        "source": "莎士比亚《麦克白》"
      },
      {
        "text": "真正的勇敢，是在面对恐惧时仍然选择前行。",
        "source": "马克·吐温《汤姆·索亚历险记》"
      },
      {
        "text": "你必须只有内心丰富，才能摆脱这些生活表面的相似。",
        "source": "王朔《致女儿书》"
      },
      {
        "text": "如果你想造一艘船，不要抓一批人来搜集材料，不要指挥他们做这个做那个，你只要教他们如何渴望大海就够了。",
        "source": "圣埃克苏佩里《小王子》"
      },
      {
        "text": "你不能把你的生命交到别人的手里。",
        "source": "玛格丽特·阿特伍德《使女的故事》"
      },
      {
        "text": "人之所以痛苦，在于追求错误的东西。",
        "source": "叔本华《作为意志和表象的世界》"
      },
      {
        "text": "你以为我贫穷、相貌平平就没有感情吗？我向你起誓：如果上帝赐予我财富和美貌，我会让你难于离开我，就像我现在难于离开你一样。",
        "source": "夏洛蒂·勃朗特《简·爱》"
      },
      {
        "text": "有些东西，你越想得到它，它就越离你远去。",
        "source": "村上春树《挪威的森林》"
      },
      {
        "text": "生命是一场漫长的告别。",
        "source": "雷蒙德·钱德勒《漫长的告别》"
      },
      {
        "text": "我们不仅要在欢乐中，更要在痛苦中寻找人生的意义。",
        "source": "陀思妥耶夫斯基《卡拉马佐夫兄弟》"
      },
      {
        "text": "无论你转身多少次，你的屁股还是在你后面。",
        "source": "马克·吐温《赤道漫游记》"
      },
      {
        "text": "不要试图改变世界，改变你自己。",
        "source": "奥威尔《1984》"
      },
      {
        "text": "我们都是孤独的行者，在漫漫人生路上寻找着自己的归宿。",
        "source": "卡夫卡《变形记》"
      },
      {
        "text": "你若盛开，蝴蝶自来。",
        "source": "林徽因《你是人间四月天》"
      },
      {
        "text": "人生到处知何似，应似飞鸿踏雪泥。",
        "source": "苏轼《和子由渑池怀旧》"
      },
      {
        "text": "回首向来萧瑟处，归去，也无风雨也无晴。",
        "source": "苏轼《定风波》"
      },
      {
        "text": "一切有为法，如梦幻泡影，如露亦如电，应作如是观。",
        "source": "《金刚经》"
      },
      {
        "text": "你必须在这个世界上留下你的印记。",
        "source": "塞万提斯《堂吉诃德》"
      },
      {
        "text": "如果你想要飞得更高，就必须放下那些让你沉重的东西。",
        "source": "托妮·莫里森《宠儿》"
      },
      {
        "text": "真正的智慧是认识到自己的无知。",
        "source": "苏格拉底《对话录》"
      },
      {
        "text": "人生就像一场梦，我们都是梦中人。",
        "source": "莎士比亚《仲夏夜之梦》"
      },
      {
        "text": "勇敢是当你还未开始就已经知道自己会输，可你依然要去做，而且无论如何都要把它坚持到底。",
        "source": "哈珀·李《杀死一只知更鸟》"
      },
      {
        "text": "世界上没有完美的人，只有完美的心。",
        "source": "雨果《巴黎圣母院》"
      },
      {
        "text": "你必须为了自己的信念而战斗。",
        "source": "乔治·奥威尔《动物农场》"
      },
      {
        "text": "人生最遗憾的，莫过于，轻易地放弃了不该放弃的，固执地，坚持了不该坚持的。",
        "source": "柏拉图《理想国》"
      },
      {
        "text": "你的一生只有一次，不要让别人来替你决定该怎么活。",
        "source": "杰克·伦敦《马丁·伊登》"
      },
      {
        "text": "如果你不出去走走，你就会以为这就是世界。",
        "source": "托马斯·曼《魔山》"
      },
      {
        "text": "真正的爱是不需要理由的。",
        "source": "加西亚·马尔克斯《霍乱时期的爱情》"
      },
      {
        "text": "时间是最好的良药，它能治愈一切创伤。",
        "source": "大仲马《基督山伯爵》"
      },
      {
        "text": "你必须学会在黑暗中寻找光明。",
        "source": "海伦·凯勒《假如给我三天光明》"
      },
      {
        "text": "命运掌握在自己手中，而不是别人嘴里。",
        "source": "莎士比亚《裘力斯·凯撒》"
      },
      {
        "text": "人生就像一盘棋，走错一步，满盘皆输。",
        "source": "塞万提斯《堂吉诃德》"
      },
      {
        "text": "不要害怕犯错，因为那是通往成功的必经之路。",
        "source": "爱默生《散文集》"
      },
      {
        "text": "每个人都是一个月亮，总有一个阴暗面，从来不让人看见。",
        "source": "马克·吐温《赤道漫游记》"
      },
      {
        "text": "你必须学会在逆境中生存。",
        "source": "笛福《鲁滨逊漂流记》"
      },
      {
        "text": "真正的朋友是在你最需要的时候伸出援手的人。",
        "source": "伊索《伊索寓言》"
      },
      {
        "text": "不要为明天忧虑，因为明天自有明天的忧虑；一天的难处一天当就够了。",
        "source": "《圣经·马太福音》"
      },
      {
        "text": "只有用心才能看清事物的本质，真正重要的东西是肉眼无法看见的。",
        "source": "圣埃克苏佩里《小王子》"
      },
      {
        "text": "在爱情的字典里，没有‘如果’，只有‘必须’。",
        "source": "简·奥斯汀《傲慢与偏见》"
      },
      {
        "text": "你必须学会在孤独中寻找力量。",
        "source": "梭罗《瓦尔登湖》"
      },
      {
        "text": "人生就像一本书，愚蠢的人一页一页地翻，聪明的人用心去读。",
        "source": "雨果《悲惨世界》"
      },
      {
        "text": "不要让别人的意见淹没了你内心的声音。",
        "source": "乔布斯《斯坦福大学演讲》"
      },
      {
        "text": "你必须为了自己的梦想而奋斗。",
        "source": "歌德《浮士德》"
      },
      {
        "text": "真正的幸福不是拥有很多，而是计较得少。",
        "source": "叔本华《人生的智慧》"
      },
      {
        "text": "人生就像一场旅行，重要的不是目的地，而是沿途的风景。",
        "source": "罗伯特·路易斯·史蒂文森《游记》"
      },
      {
        "text": "你必须学会在失败中吸取教训。",
        "source": "巴尔扎克《人间喜剧》"
      },
      {
        "text": "时间是检验真理的唯一标准。",
        "source": "培根《新工具》"
      },
      {
        "text": "不要害怕改变，因为那是成长的必经之路。",
        "source": "卡夫卡《城堡》"
      },
      {
        "text": "真正的爱情是两个灵魂的契合。",
        "source": "勃朗特《呼啸山庄》"
      },
      {
        "text": "人生就像一首歌，唱出自己的旋律。",
        "source": "惠特曼《草叶集》"
      },
      {
        "text": "你必须学会在黑暗中寻找希望。",
        "source": "但丁《神曲》"
      },
      {
        "text": "命运总是眷顾有准备的人。",
        "source": "巴斯德"
      },
      {
        "text": "如果这世界上真有奇迹，那只是努力的另一个名字。",
        "source": "尼采"
      },
      {
        "text": "这世界是如此喧哗，让沉默的人显得有点傻。",
        "source": "李宗盛（化用歌词）"
      },
      {
        "text": "任何一样东西，你渴望拥有它，它就盛开。一旦你拥有它，它就凋零。",
        "source": "普鲁斯特《追忆似水年华》"
      },
      {
        "text": "我听见回声，来自山谷和心间，以寂寞的镰刀收割空旷的灵魂。",
        "source": "泰戈尔《飞鸟集》"
      },
      {
        "text": "你不能等待别人来安排你的人生，自己想要的，自己争取。",
        "source": "张爱玲"
      },
      {
        "text": "所谓无底深渊，下去，也是前程万里。",
        "source": "木心《素履之往》"
      },
      {
        "text": "一个人如果向往光明，就会不顾一切地去追寻。",
        "source": "赫尔曼·黑塞《悉达多》"
      },
      {
        "text": "在人类面前，没有什么是不可战胜的。",
        "source": "马克·吐温"
      },
      {
        "text": "世上所有的相遇，都是久别重逢。",
        "source": "白落梅《世间所有相遇都是久别重逢》"
      },
      {
        "text": "人生没有白走的路，每一步都算数。",
        "source": "李宗盛"
      },
      {
        "text": "只要你一直走，总会到达某个地方。",
        "source": "刘易斯·卡罗尔《爱丽丝梦游仙境》"
      },
      {
        "text": "那些没有消灭你的东西，会使你变得更强壮。",
        "source": "尼采《偶像的黄昏》"
      },
      {
        "text": "你的心是你唯一的指南针。",
        "source": "村上春树《海边的卡夫卡》"
      },
      {
        "text": "不要在最能吃苦的年纪选择安逸。",
        "source": "青春文学"
      },
      {
        "text": "我们总要习惯任何人的忽冷忽热，也要看淡任何人的渐行渐远。",
        "source": "张爱玲"
      },
      {
        "text": "世界上最遥远的距离不是生与死，而是我站在你面前，你却不知道我爱你。",
        "source": "泰戈尔《飞鸟集》"
      },
      {
        "text": "真正的离别没有长亭古道，没有劝君更尽一杯酒，就是在一个和平时一样的清晨，有的人留在昨天了。",
        "source": "《我的阿勒泰》"
      },
      {
        "text": "你若安好，便是晴天。",
        "source": "林徽因"
      },
      {
        "text": "人生就像一盒巧克力，你永远不知道下一块是什么味道。",
        "source": "阿甘正传（电影同名小说）"
      },
      {
        "text": "有些路，只能一个人走。",
        "source": "龙应台《目送》"
      },
      {
        "text": "当你凝视深渊时，深渊也在凝视你。",
        "source": "尼采《善恶的彼岸》"
      },
      {
        "text": "我爱你，不光因为你的样子，还因为和你在一起时，我的样子。",
        "source": "罗伊·克里夫特《爱》"
      },
      {
        "text": "不要为过去的悲伤而哭泣，要为曾经的拥有而微笑。",
        "source": "加西亚·马尔克斯《百年孤独》"
      },
      {
        "text": "你必须非常努力，才能看起来毫不费力。",
        "source": "鸭子定律"
      },
      {
        "text": "人生最美妙的事情就是：你一直在努力，然后你越来越好。",
        "source": "佚名"
      },
      {
        "text": "真正的朋友会接受你的过去，支持你的现在，鼓舞你的将来。",
        "source": "佚名"
      },
      {
        "text": "不要被别人的眼光所束缚，勇敢地做你自己。",
        "source": "爱默生《自我信赖》"
      },
      {
        "text": "生命太短暂，没时间遗憾，若不是终点，请微笑一直向前。",
        "source": "三毛"
      },
      {
        "text": "你不能左右天气，但可以改变心情。",
        "source": "佚名"
      },
      {
        "text": "与其诅咒黑暗，不如燃起蜡烛。",
        "source": "安娜·埃莉诺·罗斯福"
      },
      {
        "text": "每一次失败都是成功的垫脚石。",
        "source": "爱迪生"
      },
      {
        "text": "人生就像骑自行车，想保持平衡就得往前走。",
        "source": "爱因斯坦"
      },
      {
        "text": "不要害怕生活，生活是美好的。",
        "source": "高尔基"
      },
      {
        "text": "成功不是将来才有的，而是从决定去做的那一刻起，持续累积而成。",
        "source": "佚名"
      },
      {
        "text": "你无法改变过去，但可以创造未来。",
        "source": "佚名"
      },
      {
        "text": "真正的爱是给予，而不是索取。",
        "source": "托尔斯泰"
      },
      {
        "text": "人生最大的敌人是自己。",
        "source": "佛家语"
      },
      {
        "text": "无论你有多么渺小，你都有你的光芒。",
        "source": "佚名"
      },
      {
        "text": "不要等待机会，而要创造机会。",
        "source": "佚名"
      },
      {
        "text": "人生没有彩排，每一天都是现场直播。",
        "source": "佚名"
      },
      {
        "text": "你必须相信自己，这是成功的秘诀。",
        "source": "卓别林"
      },
      {
        "text": "时间就像海绵里的水，只要愿挤，总还是有的。",
        "source": "鲁迅"
      },
      {
        "text": "人生就像一场马拉松，不在于瞬间的爆发，而在于途中的坚持。",
        "source": "佚名"
      },
      {
        "text": "你改变不了环境，但你可以改变自己。",
        "source": "佚名"
      },
      {
        "text": "真正的勇敢不是没有恐惧，而是带着恐惧依然前行。",
        "source": "曼德拉"
      },
      {
        "text": "不要为失败找借口，要为成功找方法。",
        "source": "佚名"
      },
      {
        "text": "人生就像一面镜子，你对它笑，它就对你笑。",
        "source": "佚名"
      },
      {
        "text": "你必须学会在风雨中跳舞。",
        "source": "维维安·格林"
      },
      {
        "text": "不要把时间浪费在不值得的人和事上。",
        "source": "佚名"
      },
      {
        "text": "人生最重要的不是你所处的位置，而是你所朝的方向。",
        "source": "奥利弗·温德尔·霍姆斯"
      },
      {
        "text": "如果你的心是敞开的，世界就会向你敞开。",
        "source": "佚名"
      },
      {
        "text": "真正的幸福来源于内心的平静。",
        "source": "达赖喇嘛"
      },
      {
        "text": "人生没有绝对的公平，但有绝对的努力。",
        "source": "佚名"
      },
      {
        "text": "你必须学会在孤独中享受自我。",
        "source": "佚名"
      },
      {
        "text": "不要让别人的错误惩罚自己。",
        "source": "康德"
      },
      {
        "text": "人生就像一场赌博，只有敢于下注的人才能赢。",
        "source": "佚名"
      },
      {
        "text": "你必须学会在逆境中寻找机遇。",
        "source": "佚名"
      },
      {
        "text": "真正的智慧是懂得何时该放下。",
        "source": "佚名"
      },
      {
        "text": "人生没有过不去的坎，只有过不去的心情。",
        "source": "佚名"
      },
      {
        "text": "你必须学会在黑暗中点亮自己的灯。",
        "source": "佚名"
      },
      {
        "text": "不要害怕被拒绝，因为那是你成长的机会。",
        "source": "佚名"
      },
      {
        "text": "人生就像一场旅行，重要的不是目的地，而是沿途的心情。",
        "source": "佚名"
      },
      {
        "text": "你必须学会在痛苦中寻找力量。",
        "source": "佚名"
      },
      {
        "text": "真正的爱是成全，而不是占有。",
        "source": "佚名"
      },
      {
        "text": "人生没有永远的赢家，也没有永远的输家。",
        "source": "佚名"
      },
      {
        "text": "你必须学会在失败中站起来。",
        "source": "佚名"
      },
      {
        "text": "不要把希望寄托在别人身上，自己才是最可靠的。",
        "source": "佚名"
      },
      {
        "text": "人生就像一场游戏，只有规则，没有公平。",
        "source": "佚名"
      },
      {
        "text": "你必须学会在变化中寻找不变。",
        "source": "佚名"
      },
      {
        "text": "真正的勇敢是敢于面对真实的自己。",
        "source": "佚名"
      },
      {
        "text": "人生没有完美的剧本，只有不断修改的台词。",
        "source": "佚名"
      },
      {
        "text": "你必须学会在喧嚣中保持宁静。",
        "source": "佚名"
      },
      {
        "text": "不要为未知的未来而担忧，要为当下的生活而努力。",
        "source": "佚名"
      },
      {
        "text": "人生就像一杯茶，只有细细品味才能知其真味。",
        "source": "佚名"
      },
      {
        "text": "你必须学会在平凡中发现伟大。",
        "source": "佚名"
      },
      {
        "text": "真正的智慧是懂得如何与自己和解。",
        "source": "佚名"
      },
      {
        "text": "不要害怕从头再来，因为这一次你不会从零开始，而是从经验开始。",
        "source": "佚名"
      },
      {
        "text": "人生是一场永不落幕的演出，我们都是舞台上的主角。",
        "source": "莎士比亚《皆大欢喜》"
      },
      {
        "text": "你必须学会在风雨中坚定信念。",
        "source": "佚名"
      },
      {
        "text": "真正的爱是包容，而不是苛责。",
        "source": "佚名"
      },
      {
        "text": "人生没有永远的黑暗，只有暂时被遮蔽的光明。",
        "source": "佚名"
      },
      {
        "text": "你必须学会在困境中寻找出路。",
        "source": "佚名"
      },
      {
        "text": "不要把成功看作是最终目标，它只是你人生旅途中的一个驿站。",
        "source": "佚名"
      },
      {
        "text": "人生就像一场梦，醒来后一切都将烟消云散。",
        "source": "佚名"
      },
      {
        "text": "你必须学会在孤独中寻找陪伴。",
        "source": "佚名"
      },
      {
        "text": "真正的勇敢是敢于追求自己的梦想。",
        "source": "佚名"
      },
      {
        "text": "人生没有彩排，每一天都是新的开始。",
        "source": "佚名"
      },
      {
        "text": "你必须学会在失败中吸取经验。",
        "source": "佚名"
      },
      {
        "text": "不要让别人的意见左右你的决定。",
        "source": "佚名"
      },
      {
        "text": "人生就像一本书，只有自己才能写好它。",
        "source": "佚名"
      },
      {
        "text": "你必须学会在逆境中坚持到底。",
        "source": "佚名"
      },
      {
        "text": "真正的智慧是懂得如何生活。",
        "source": "佚名"
      },
      {
        "text": "人生没有永远的敌人，也没有永远的朋友。",
        "source": "佚名"
      },
      {
        "text": "你必须学会在痛苦中寻找解脱。",
        "source": "佚名"
      },
      {
        "text": "不要把时间浪费在无意义的争吵上。",
        "source": "佚名"
      },
      {
        "text": "人生就像一场马拉松，只有坚持到最后才能胜利。",
        "source": "佚名"
      },
      {
        "text": "你必须学会在变化中适应环境。",
        "source": "佚名"
      },
      {
        "text": "真正的勇敢是敢于面对挑战。",
        "source": "佚名"
      },
      {
        "text": "人生没有完美的结局，只有不断追求的过程。",
        "source": "佚名"
      },
      {
        "text": "你必须学会在喧嚣中寻找宁静。",
        "source": "佚名"
      },
      {
        "text": "人的脆弱和坚强都超乎自己的想像。",
        "source": "莫泊桑《一生》"
      },
      {
        "text": "我大清早起，站在人家屋角上哑哑的啼。",
        "source": "鲁迅《秋夜》"
      },
      {
        "text": "长的是苦难，短的是人生。",
        "source": "张爱玲《公寓生活记趣》"
      },
      {
        "text": "我来不及认真地年轻，待明白过来时，只能选择认真地老去。",
        "source": "三毛"
      },
      {
        "text": "如果你认识从前的我，也许你会原谅现在的我。",
        "source": "张爱玲《倾城之恋》"
      },
      {
        "text": "这世界上有些事就是为了让你干了以后后悔而设，所以你不管干了什么事，都不要后悔。",
        "source": "王小波《未来世界》"
      },
      {
        "text": "在清水里泡三次，在血水里浴三次，在碱水里煮三次，我们就会纯净得不能再纯净了。",
        "source": "列夫·托尔斯泰《苦难的历程》"
      },
      {
        "text": "心之所向，素履以往，生如逆旅，一苇以航。",
        "source": "七堇年《尘曲》"
      },
      {
        "text": "白昼之光，岂知夜色之深。",
        "source": "尼采《查拉图斯特拉如是说》"
      },
      {
        "text": "一切真理开始时总是在少数人手里，总是受到大多数人的压力。这是一个规律。",
        "source": "王小波"
      },
      {
        "text": "有些人的存在就是为了提醒我们，这个世界还可以更糟。",
        "source": "王尔德"
      },
      {
        "text": "你若爱，生活哪里都可爱。你若恨，生活哪里都可恨。",
        "source": "丰子恺《豁然开朗》"
      },
      {
        "text": "如果真相是种伤害，请选择谎言。如果谎言是一种伤害，请选择沉默。如果沉默是一种伤害，请选择离开。",
        "source": "徐志摩"
      },
      {
        "text": "一个人只拥有此生此世是不够的，他还应该拥有诗意的世界。",
        "source": "王小波"
      },
      {
        "text": "哪里会有人喜欢孤独，不过是不喜欢失望。",
        "source": "村上春树《挪威的森林》"
      },
      {
        "text": "我行过许多地方的桥，看过许多次数的云，喝过许多种类的酒，却只爱过一个正当最好年龄的人。",
        "source": "沈从文《湘行散记》"
      },
      {
        "text": "当你老了，回顾一生，就会发觉：什么时候出国读书，什么时候决定做第一份职业、何时选定了对象而恋爱、什么时候结婚，其实都是命运的巨变。只是当时站在三岔路口，眼见风云千樯，你作出选择的那一日，在日记上，相当沉闷和平凡，当时还以为是生命中普通的一天。",
        "source": "陶杰《杀鹌鹑的少女》"
      },
      {
        "text": "每个人生来都是君王，但大多数在流亡中死去。",
        "source": "奥斯卡·王尔德"
      },
      {
        "text": "一个人知道自己为什么而活，就可以忍受任何一种生活。",
        "source": "尼采"
      },
      {
        "text": "人生不相见，动如参与商。",
        "source": "杜甫《赠卫八处士》"
      },
      {
        "text": "这短短的一生，我们最终都会失去。你不妨大胆一些，爱一个人，攀一座山，追一个梦。",
        "source": "梁海音《大鱼海棠》"
      },
      {
        "text": "我用尽了全力，过着平凡的一生。",
        "source": "毛姆《月亮与六便士》"
      },
      {
        "text": "世界上的事情，最忌讳的就是个十全十美，你看那天上的月亮，一旦圆满了，马上就要亏厌；树上的果子，一旦熟透了，马上就要坠落。凡事总要稍留欠缺，才能持恒。",
        "source": "莫言《檀香刑》"
      },
      {
        "text": "我不要儿子，我要女儿——只要一个，像你的。",
        "source": "钱钟书《围城》"
      },
      {
        "text": "我读的书愈多，就愈亲近世界，愈明了生活的意义，愈觉得生活的重要。",
        "source": "高尔基"
      },
      {
        "text": "不管前方的路有多苦，只要走的方向正确，不管多么崎岖不平，都比站在原地更接近幸福。",
        "source": "宫崎骏《千与千寻》"
      },
      {
        "text": "请不要相信我的美丽，也不要相信我的爱情，在涂满了老干妈的面包上，我就是那一抹最纯粹的绝望。",
        "source": "网友恶搞，化用文学腔调"
      },
      {
        "text": "岁月极美，在于它必然的流逝。春花、秋月、夏日、冬雪。",
        "source": "三毛《岁月》"
      },
      {
        "text": "因为懂得，所以慈悲。",
        "source": "张爱玲"
      },
      {
        "text": "你不能做我的诗，正如我不能做你的梦。",
        "source": "胡适《梦与诗》"
      },
      {
        "text": "我是个百依百顺的孩子，至死不变，但只顺从我自己。",
        "source": "萨特"
      },
      {
        "text": "不要问丧钟为谁而鸣，它就为你而鸣。",
        "source": "约翰·多恩"
      },
      {
        "text": "在时间的大钟上，只有两个字——现在。",
        "source": "莎士比亚"
      },
      {
        "text": "人最软弱的地方，是舍不得。",
        "source": "佚名"
      },
      {
        "text": "最卑贱不过感情，最凉不过人心。",
        "source": "白落梅"
      },
      {
        "text": "我甚至连他的一张照片都没有。他只活在我的记忆里。",
        "source": "玛格丽特·杜拉斯《情人》"
      },
      {
        "text": "世界以痛吻我，要我报之以歌。",
        "source": "泰戈尔《飞鸟集》"
      },
      {
        "text": "你来人间一趟，你要看看太阳，和你的心上人，一起走在街上。",
        "source": "海子《夏天的太阳》"
      },
      {
        "text": "从前的日色变得慢，车，马，邮件都慢，一生只够爱一个人。",
        "source": "木心《从前慢》"
      },
      {
        "text": "真正的成熟，是渐渐地明白：自己的世界自己做主，无需别人来评判。",
        "source": "佚名"
      },
      {
        "text": "你如果出色地完成了某件事，那你应该再做一些其他的精彩事儿。不要在前一件事上徘徊太久，想想接下来该做什么。",
        "source": "乔布斯"
      },
      {
        "text": "那些让你痛苦的，最终也会让你强大。",
        "source": "佚名"
      },
      {
        "text": "与其在意别人的背弃和不善，不如经营自己的尊严和美好。",
        "source": "可可·香奈儿"
      },
      {
        "text": "我们终此一生，就是要摆脱他人的期待，找到真正的自己。",
        "source": "伍绮诗《无声告白》"
      },
      {
        "text": "不要向任何人诉苦，因为20%的人不关心，剩下的80%听了会很高兴。",
        "source": "佚名"
      },
      {
        "text": "生活是属于每个人自己的感受，不属于任何别人的看法。",
        "source": "余华《活着》"
      },
      {
        "text": "你现在的付出，都会是一种沉淀，它们会默默铺路，只为让你成为更好的人。",
        "source": "佚名"
      },
      {
        "text": "愿你的生命有足够多的云翳，来造成一个美丽的黄昏。",
        "source": "冰心《谈生命》"
      },
      {
        "text": "不要试图去填满生命的空白，因为，音乐就来自那空白深处。",
        "source": "泰戈尔"
      },
      {
        "text": "你所见到的，只不过是自己的倒影；你所听到的，只不过是自己的回声。",
        "source": "纪伯伦"
      },
      {
        "text": "任何事情，只要心甘情愿，总是能够变得简单。",
        "source": "张爱玲"
      },
      {
        "text": "只有在人群中，才能认识自己。",
        "source": "歌德"
      },
      {
        "text": "你没有如期归来，而这正是离别的意义。",
        "source": "北岛《白日梦》"
      },
      {
        "text": "我希望有个如你一般的人，如山间清爽的风，如古城温暖的光。从清晨到夜晚，由山野到书房。只要最后是你，就好。",
        "source": "张嘉佳《从你的全世界路过》"
      },
      {
        "text": "你以为最酸的感觉是吃醋吗？不是，最酸的感觉是没权吃醋。",
        "source": "佚名"
      },
      {
        "text": "有些事，只能一个人做。有些关，只能一个人过。有些路啊，只能一个人走。",
        "source": "龙应台《目送》"
      },
      {
        "text": "如果你爱一个人，先要使自己现在或将来百分之百的值得他爱，至于他爱不爱你，那是他的事，你可以如此希望，但不必勉强去索取。",
        "source": "亦舒"
      },
      {
        "text": "我一直以为人是慢慢变老的，其实不是，人是一瞬间变老的。",
        "source": "村上春树《舞！舞！舞！》"
      },
      {
        "text": "不要因为结束而哭泣，微笑吧，为你的曾经拥有。",
        "source": "加西亚·马尔克斯"
      },
      {
        "text": "世界上最远的距离，不是爱，不是恨，而是熟悉的人，渐渐得陌生。",
        "source": "佚名"
      },
      {
        "text": "我们都在不断赶路忘记了出路，在失望中追求偶尔的满足。",
        "source": "林夕"
      },
      {
        "text": "如果世界上曾经有那个人出现过，其他人都会变成将就。而我不愿意将就。",
        "source": "顾漫《何以笙箫默》"
      },
      {
        "text": "你是一树一树的花开，是燕在梁间呢喃，——你是爱，是暖，是希望，你是人间的四月天！",
        "source": "林徽因《你是人间四月天》"
      },
      {
        "text": "人是为了活着本身而活着的，而不是为了活着之外的任何事物所活着。",
        "source": "余华《活着》"
      },
      {
        "text": "孤独不是一种脾性，而是一种无奈。",
        "source": "林语堂"
      },
      {
        "text": "爱情原本从来就是个将错就错的玩笑。",
        "source": "席慕蓉"
      },
      {
        "text": "这世界上的事情，最忌讳的就是个十全十美。",
        "source": "莫言"
      },
      {
        "text": "有时候，你放弃了某人，并不是因为你不再在乎，而是因为你意识到他已不在乎了。",
        "source": "佚名"
      },
      {
        "text": "我将于茫茫人海中访我唯一灵魂之伴侣；得之，我幸；不得，我命。如此而已。",
        "source": "徐志摩《致梁启超》"
      },
      {
        "text": "不要问我从哪里来，我的故乡在远方。",
        "source": "三毛《橄榄树》"
      },
      {
        "text": "人生如逆旅，我亦是行人。",
        "source": "苏轼《临江仙》"
      },
      {
        "text": "纵有千年铁门槛，终须一个土馒头。",
        "source": "范成大《重九日行营寿藏之地》"
      },
      {
        "text": "世事洞明皆学问，人情练达即文章。",
        "source": "曹雪芹《红楼梦》"
      },
      {
        "text": "身后有余忘缩手，眼前无路想回头。",
        "source": "曹雪芹《红楼梦》"
      },
      {
        "text": "假作真时真亦假，无为有处有还无。",
        "source": "曹雪芹《红楼梦》"
      },
      {
        "text": "机关算尽太聪明，反算了卿卿性命。",
        "source": "曹雪芹《红楼梦》"
      },
      {
        "text": "好一似食尽鸟投林，落了片白茫茫大地真干净。",
        "source": "曹雪芹《红楼梦》"
      },
      {
        "text": "百足之虫，死而不僵。",
        "source": "曹雪芹《红楼梦》"
      },
      {
        "text": "不是东风压了西风，就是西风压了东风。",
        "source": "曹雪芹《红楼梦》"
      },
      {
        "text": "千里搭长棚，没有个不散的筵席。",
        "source": "曹雪芹《红楼梦》"
      },
      {
        "text": "万两黄金容易得，知心一个也难求。",
        "source": "曹雪芹《红楼梦》"
      },
      {
        "text": "黄金万两容易得，知心一个也难求。",
        "source": "《增广贤文》"
      },
      {
        "text": "画虎画皮难画骨，知人知面不知心。",
        "source": "《增广贤文》"
      },
      {
        "text": "路遥知马力，日久见人心。",
        "source": "《增广贤文》"
      },
      {
        "text": "有缘千里来相会，无缘对面不相逢。",
        "source": "《增广贤文》"
      },
      {
        "text": "命里有时终须有，命里无时莫强求。",
        "source": "《增广贤文》"
      },
      {
        "text": "逢人且说三分话，未可全抛一片心。",
        "source": "《增广贤文》"
      },
      {
        "text": "有意栽花花不发，无心插柳柳成荫。",
        "source": "《增广贤文》"
      },
      {
        "text": "踏破铁鞋无觅处，得来全不费工夫。",
        "source": "《水浒传》"
      },
      {
        "text": "莫愁前路无知己，天下谁人不识君。",
        "source": "高适《别董大》"
      },
      {
        "text": "沉舟侧畔千帆过，病树前头万木春。",
        "source": "刘禹锡《酬乐天扬州初逢席上见赠》"
      },
      {
        "text": "山重水复疑无路，柳暗花明又一村。",
        "source": "陆游《游山西村》"
      },
      {
        "text": "会当凌绝顶，一览众山小。",
        "source": "杜甫《望岳》"
      },
      {
        "text": "长风破浪会有时，直挂云帆济沧海。",
        "source": "李白《行路难》"
      },
      {
        "text": "不畏浮云遮望眼，自缘身在最高层。",
        "source": "王安石《登飞来峰》"
      },
      {
        "text": "欲穷千里目，更上一层楼。",
        "source": "王之涣《登鹳雀楼》"
      },
      {
        "text": "人生得意须尽欢，莫使金樽空对月。",
        "source": "李白《将进酒》"
      },
      {
        "text": "天生我材必有用，千金散尽还复来。",
        "source": "李白《将进酒》"
      },
      {
        "text": "今朝有酒今朝醉，明日愁来明日愁。",
        "source": "罗隐《自遣》"
      },
      {
        "text": "菩提本无树，明镜亦非台。本来无一物，何处惹尘埃。",
        "source": "惠能《菩提偈》"
      }
    ]
  },
  "《音乐答案之书》": {
    "answers": [
      {
        "text": "有些事你现在不必问，有些人你永远不必等。",
        "source": "《梦醒时分》"
      },
      {
        "text": "我和我最后的倔强，握紧双手绝对不放。",
        "source": "《倔强》"
      },
      {
        "text": "既然不能逗留，何不在离开的时候，一边享受，一边泪流。",
        "source": "《十年》"
      },
      {
        "text": "得不到的永远在骚动，被偏爱的都有恃无恐。",
        "source": "《红玫瑰》"
      },
      {
        "text": "不要回头看，也不要问为什么。",
        "source": "《不要说话》"
      },
      {
        "text": "如果对于明天没有要求，牵牵手就像旅游。",
        "source": "《十年》"
      },
      {
        "text": "就算失望，不能绝望。",
        "source": "《倔强》"
      },
      {
        "text": "我就是我，是颜色不一样的烟火。",
        "source": "《我》"
      },
      {
        "text": "有时候，有时候，我会相信一切有尽头。",
        "source": "《红豆》"
      },
      {
        "text": "相聚离开都有时候，没有什么会永垂不朽。",
        "source": "《红豆》"
      },
      {
        "text": "只要你一个眼神肯定，我的爱就有意义。",
        "source": "《勇气》"
      },
      {
        "text": "爱真的需要勇气，来面对流言蜚语。",
        "source": "《勇气》"
      },
      {
        "text": "挥别错的才能和对的相逢。",
        "source": "《分手快乐》"
      },
      {
        "text": "其实爱对了人，情人节每天都过。",
        "source": "《分手快乐》"
      },
      {
        "text": "你退半步的动作认真的吗，小小的动作伤害还那么大。",
        "source": "《认真的雪》"
      },
      {
        "text": "最美的不是下雨天，是曾与你躲过雨的屋檐。",
        "source": "《不能说的秘密》"
      },
      {
        "text": "也许时间是一种解药，也是我现在正服下的毒药。",
        "source": "《彩虹》"
      },
      {
        "text": "断了的弦再怎么连，我的感觉你已听不见。",
        "source": "《断了的弦》"
      },
      {
        "text": "转身离开，分手说不出来。",
        "source": "《珊瑚海》"
      },
      {
        "text": "能不能给我一首歌的时间，紧紧的把那拥抱变成永远。",
        "source": "《给我一首歌的时间》"
      },
      {
        "text": "雨下整夜，我的爱溢出就像雨水。",
        "source": "《七里香》"
      },
      {
        "text": "我一路向北，离开有你的季节。",
        "source": "《一路向北》"
      },
      {
        "text": "听妈妈的话，别让她受伤。",
        "source": "《听妈妈的话》"
      },
      {
        "text": "我知道你我都没有错，只是忘了怎么退后。",
        "source": "《退后》"
      },
      {
        "text": "我落泪，情绪零碎，你的世界一幕幕纷飞。",
        "source": "《我落泪情绪零碎》"
      },
      {
        "text": "为你弹奏肖邦的夜曲，纪念我死去的爱情。",
        "source": "《夜曲》"
      },
      {
        "text": "谁在用琵琶弹奏一曲东风破，岁月在墙上剥落看见小时候。",
        "source": "《东风破》"
      },
      {
        "text": "天青色等烟雨，而我在等你。",
        "source": "《青花瓷》"
      },
      {
        "text": "如果邪恶是华丽残酷的乐章，它的终场我会亲手写上。",
        "source": "《夜的第七章》"
      },
      {
        "text": "不要这么容易就想放弃，就像我说的，追不到的梦想，换个梦不就得了。",
        "source": "《稻香》"
      },
      {
        "text": "笑一个吧，功成名就不是目的，让自己快乐快乐这才叫做意义。",
        "source": "《稻香》"
      },
      {
        "text": "原谅我这一生不羁放纵爱自由。",
        "source": "《海阔天空》"
      },
      {
        "text": "多少次，迎着冷眼与嘲笑，从没有放弃过心中的理想。",
        "source": "《海阔天空》"
      },
      {
        "text": "今天我，寒夜里看雪飘过，怀着冷却了的心窝漂远方。",
        "source": "《海阔天空》"
      },
      {
        "text": "钟声响起归家的讯号，在他生命里，仿佛带点唏嘘。",
        "source": "《光辉岁月》"
      },
      {
        "text": "一生经过彷徨的挣扎，自信可改变未来。",
        "source": "《光辉岁月》"
      },
      {
        "text": "曾梦想走天涯，看一看世界的繁华。",
        "source": "《曾经的你》"
      },
      {
        "text": "每一次难过的时候，就独自看一看大海。",
        "source": "《曾经的你》"
      },
      {
        "text": "总想起身边走在路上的朋友，有多少正在醒来。",
        "source": "《曾经的你》"
      },
      {
        "text": "没有什么能够阻挡，你对自由的向往。",
        "source": "《蓝莲花》"
      },
      {
        "text": "穿过幽暗的岁月，也曾感到彷徨。",
        "source": "《蓝莲花》"
      },
      {
        "text": "当你低头的瞬间，才发觉脚下的路。",
        "source": "《蓝莲花》"
      },
      {
        "text": "生活不止眼前的苟且，还有诗和远方的田野。",
        "source": "《生活不止眼前的苟且》"
      },
      {
        "text": "你赤手空拳来到人世间，为找到那片海不顾一切。",
        "source": "《生活不止眼前的苟且》"
      },
      {
        "text": "我曾经跨过山和大海，也穿过人山人海。",
        "source": "《平凡之路》"
      },
      {
        "text": "我曾经拥有着的一切，转眼都飘散如烟。",
        "source": "《平凡之路》"
      },
      {
        "text": "我曾经失落失望失掉所有方向，直到看见平凡才是唯一的答案。",
        "source": "《平凡之路》"
      },
      {
        "text": "徘徊着的，在路上的，你要走吗？",
        "source": "《平凡之路》"
      },
      {
        "text": "易碎的，骄傲着，那也曾是我的模样。",
        "source": "《平凡之路》"
      },
      {
        "text": "那就这样吧，再爱都曲终人散啦。",
        "source": "《那就这样吧》"
      },
      {
        "text": "想哭就到我怀里哭，就像初相识的时候一样。",
        "source": "《那就这样吧》"
      },
      {
        "text": "如果你愿意一层一层一层的剥开我的心，你会发现你会讶异，你是我最压抑最深处的秘密。",
        "source": "《洋葱》"
      },
      {
        "text": "只要你过得比我好，过得比我好，什么事都难不倒。",
        "source": "《只要你过得比我好》"
      },
      {
        "text": "把悲伤留给自己，你的美丽让你带走。",
        "source": "《把悲伤留给自己》"
      },
      {
        "text": "后来，我总算学会了如何去爱。可惜你，早已远去，消失在人海。",
        "source": "《后来》"
      },
      {
        "text": "初恋这件小事，是因为那个人，才变得重要。",
        "source": "《初恋那件小事》"
      },
      {
        "text": "为你我受冷风吹，寂寞时候流眼泪。",
        "source": "《为你我受冷风吹》"
      },
      {
        "text": "有人问我你究竟是哪里好，这么多年我还忘不了。",
        "source": "《当爱已成往事》"
      },
      {
        "text": "有一天你会知道，人生没有我并不会不同。",
        "source": "《当爱已成往事》"
      },
      {
        "text": "我对你仍有爱意，我对自己无能为力。",
        "source": "《无能为力》"
      },
      {
        "text": "我们说好不分离，要一直一直在一起。",
        "source": "《时间煮雨》"
      },
      {
        "text": "风吹雨成花，时间追不上白马。",
        "source": "《时间煮雨》"
      },
      {
        "text": "也许承诺不过因为没把握。",
        "source": "《因为爱情》"
      },
      {
        "text": "所以一切都是童话，是因为没人愿意醒来。",
        "source": "《童话》"
      },
      {
        "text": "你哭着对我说，童话里都是骗人的。",
        "source": "《童话》"
      },
      {
        "text": "闭上眼睛就能看见你，你却不在我身边。",
        "source": "《想见你想见你想见你》"
      },
      {
        "text": "失去你的风景，像座废墟，像失落帝国连不到你的世纪。",
        "source": "《想见你想见你想见你》"
      },
      {
        "text": "我只在乎你，心甘情愿感染你的气息。",
        "source": "《我只在乎你》"
      },
      {
        "text": "任时光匆匆流去，我只在乎你。",
        "source": "《我只在乎你》"
      },
      {
        "text": "甜蜜蜜，你笑得甜蜜蜜，好像花儿开在春风里。",
        "source": "《甜蜜蜜》"
      },
      {
        "text": "我不愿让你一个人，一个人在人海浮沉。",
        "source": "《我不愿让你一个人》"
      },
      {
        "text": "你是我心中最美的云彩，斟满美酒让你留下来。",
        "source": "《最炫民族风》"
      },
      {
        "text": "留下来，或者我跟你走。",
        "source": "《海角七号》(电影原声/主题曲延伸)"
      },
      {
        "text": "因为爱情，不会轻易悲伤，所以一切都是幸福的模样。",
        "source": "《因为爱情》"
      },
      {
        "text": "爱情不停站，想开往地老天荒需要多勇敢。",
        "source": "《爱情转移》"
      },
      {
        "text": "把一个人的温暖转移到另一个的胸膛，让上次犯的错反省出梦想。",
        "source": "《爱情转移》"
      },
      {
        "text": "流浪几张双人床，换过几次信仰，才让戒指义无反顾的交换。",
        "source": "《爱情转移》"
      },
      {
        "text": "回忆是抓不到的月光握紧就变黑暗。",
        "source": "《爱情转移》"
      },
      {
        "text": "烧完美好青春换一个老伴。",
        "source": "《爱情转移》"
      },
      {
        "text": "你是我最重要的决定，我愿意每天在你身边苏醒。",
        "source": "《最重要的决定》"
      },
      {
        "text": "幸福是一件多么豪华的事情。",
        "source": "《最重要的决定》"
      },
      {
        "text": "孤单是一个人的狂欢，狂欢是一群人的孤单。",
        "source": "《叶子》"
      },
      {
        "text": "我一个人吃饭旅行到处走走停停，也一个人看书写信自己对话谈心。",
        "source": "《叶子》"
      },
      {
        "text": "没有你的日子里，我会更加珍惜自己。",
        "source": "《大约在冬季》"
      },
      {
        "text": "轻轻的我将离开你，请将眼角的泪拭去。",
        "source": "《大约在冬季》"
      },
      {
        "text": "你的承诺我的执着，所有的痛我一个人承受。",
        "source": "《承诺》"
      },
      {
        "text": "我感动天感动地，怎么感动不了你。",
        "source": "《感动天感动地》"
      },
      {
        "text": "死了都要爱，不淋漓尽致不痛快。",
        "source": "《死了都要爱》"
      },
      {
        "text": "宇宙毁灭心还在。",
        "source": "《死了都要爱》"
      },
      {
        "text": "离歌且莫翻新阕，一曲能教肠寸结。",
        "source": "《离歌》"
      },
      {
        "text": "想留不能留才最寂寞，没说完温柔只剩离歌。",
        "source": "《离歌》"
      },
      {
        "text": "哪怕周围再多人，感觉还是一个人。",
        "source": "《寂寞的季节》"
      },
      {
        "text": "在所有人事已非的景色里，我最喜欢你。",
        "source": "《喜欢你》"
      },
      {
        "text": "每一次，都在徘徊孤单中坚强。",
        "source": "《隐形的翅膀》"
      },
      {
        "text": "每一次，就算很受伤也不闪泪光。",
        "source": "《隐形的翅膀》"
      },
      {
        "text": "我知道，我一直有双隐形的翅膀，带我飞，飞过绝望。",
        "source": "《隐形的翅膀》"
      },
      {
        "text": "我相信我就是我，我相信明天。",
        "source": "《我相信》"
      },
      {
        "text": "我相信青春没有地平线。",
        "source": "《我相信》"
      },
      {
        "text": "想飞上天，和太阳肩并肩，世界等着我去改变。",
        "source": "《我相信》"
      },
      {
        "text": "阳光总在风雨后，乌云上有晴空。",
        "source": "《阳光总在风雨后》"
      },
      {
        "text": "请相信有彩虹，风风雨雨都接受。",
        "source": "《阳光总在风雨后》"
      },
      {
        "text": "如果骄傲没被现实大海冷冷拍下，又怎会懂得要多努力，才走得到远方。",
        "source": "《最初的梦想》"
      },
      {
        "text": "最初的梦想紧握在手上，最想要去的地方，怎么能在半路就返航。",
        "source": "《最初的梦想》"
      },
      {
        "text": "往前一步是黄昏，退后一步是人生。",
        "source": "《宽容》"
      },
      {
        "text": "伤心总是难免的，你又何苦一往情深。",
        "source": "《梦醒时分》"
      },
      {
        "text": "因为爱过，所以慈悲；因为懂得，所以宽容。",
        "source": "《宽容》"
      },
      {
        "text": "太美的承诺因为太年轻。",
        "source": "《女孩的心思男孩你别猜》"
      },
      {
        "text": "谁的青春没有浅浅的瘀青。",
        "source": "《青春修炼手册》"
      },
      {
        "text": "跟着我左手右手一个慢动作，右手左手慢动作重播。",
        "source": "《青春修炼手册》"
      },
      {
        "text": "长亭外，古道边，芳草碧连天。",
        "source": "《送别》"
      },
      {
        "text": "天之涯，地之角，知交半零落。",
        "source": "《送别》"
      },
      {
        "text": "一壶浊酒尽余欢，今宵别梦寒。",
        "source": "《送别》"
      },
      {
        "text": "但愿人长久，千里共婵娟。",
        "source": "《但愿人长久》"
      },
      {
        "text": "人有悲欢离合，月有阴晴圆缺，此事古难全。",
        "source": "《但愿人长久》"
      },
      {
        "text": "剪不断，理还乱，是离愁，别是一般滋味在心头。",
        "source": "《相见欢》"
      },
      {
        "text": "我的世界为你留住春天。",
        "source": "《春天花会开》"
      },
      {
        "text": "春天花会开，鸟儿自由自在。",
        "source": "《春天花会开》"
      },
      {
        "text": "夜空中最亮的星，能否听清，那仰望的人，心底的孤独和叹息。",
        "source": "《夜空中最亮的星》"
      },
      {
        "text": "我祈祷拥有一颗透明的心灵，和会流泪的眼睛。",
        "source": "《夜空中最亮的星》"
      },
      {
        "text": "给我再去相信的勇气，越过谎言去拥抱你。",
        "source": "《夜空中最亮的星》"
      },
      {
        "text": "每当我找不到存在的意义，每当我迷失在黑夜里。",
        "source": "《夜空中最亮的星》"
      },
      {
        "text": "夜空中最亮的星，请指引我靠近你。",
        "source": "《夜空中最亮的星》"
      },
      {
        "text": "如果有一天，我老无所依，请把我留在，在那时光里。",
        "source": "《春天里》"
      },
      {
        "text": "还记得许多年前的春天，那时的我还没剪去长发。",
        "source": "《春天里》"
      },
      {
        "text": "如果没有你，没有过去，我不会有伤心。",
        "source": "《如果没有你》"
      },
      {
        "text": "如果没有你，我在哪里，又有什么可惜。",
        "source": "《如果没有你》"
      },
      {
        "text": "反正最后每个人都孤独。",
        "source": "《如果没有你》"
      },
      {
        "text": "开始的开始，我们都是孩子。",
        "source": "《北京东路的日子》"
      },
      {
        "text": "最后的最后，渴望变成天使。",
        "source": "《北京东路的日子》"
      },
      {
        "text": "那些年错过的大雨，那些年错过的爱情。",
        "source": "《那些年》"
      },
      {
        "text": "好想拥抱你，拥抱错过的勇气。",
        "source": "《那些年》"
      },
      {
        "text": "曾经想征服全世界，到最后回首才发现，这世界滴滴点点全部都是你。",
        "source": "《那些年》"
      },
      {
        "text": "时间煮雨，岁月缝花。",
        "source": "《时间煮雨》"
      },
      {
        "text": "我们终究在时光里走散。",
        "source": "《走散》"
      },
      {
        "text": "慢慢喜欢你，慢慢的亲密，慢慢聊自己，慢慢和你走在一起。",
        "source": "《慢慢喜欢你》"
      },
      {
        "text": "慢慢的陪你慢慢的老去，因为慢慢是个最好的原因。",
        "source": "《慢慢喜欢你》"
      },
      {
        "text": "说谎的人要吞一千根针。",
        "source": "《说谎》"
      },
      {
        "text": "我没有说谎，我何必说谎。",
        "source": "《说谎》"
      },
      {
        "text": "爱一个人，是不是应该有默契。",
        "source": "《说谎》"
      },
      {
        "text": "别说你也爱我，也不想我难过。",
        "source": "《别说你也爱我》"
      },
      {
        "text": "就放手吧，别想他。",
        "source": "《就放手吧》"
      },
      {
        "text": "我们没能走到最后，这是我能想到的最好的结果。",
        "source": "《遗憾》"
      },
      {
        "text": "与其让你在我怀中枯萎，宁愿你犯错后悔。",
        "source": "《遗憾》"
      },
      {
        "text": "莫非要你尝尽了苦悲，才懂真情可贵。",
        "source": "《遗憾》"
      },
      {
        "text": "当这个世界一步一步华丽到荒芜，请放心我还是你们的信徒。",
        "source": "《我就是我》"
      },
      {
        "text": "让我感谢你，赠我空欢喜。",
        "source": "《花事了》"
      },
      {
        "text": "心里的雨倾盆而下，也沾不湿她的发。",
        "source": "《心雨》"
      },
      {
        "text": "你发如雪，凄美了离别，我焚香感动了谁。",
        "source": "《发如雪》"
      },
      {
        "text": "繁华如三千东流水，我只取一瓢爱了解。",
        "source": "《发如雪》"
      },
      {
        "text": "狼牙月，伊人憔悴，我举杯，饮尽了风雪。",
        "source": "《发如雪》"
      },
      {
        "text": "谁在悬崖沏一壶茶，温热前世的牵挂。",
        "source": "《发如雪》"
      },
      {
        "text": "为你弹奏肖邦的夜曲，纪念我死去的爱情。",
        "source": "《夜曲》"
      },
      {
        "text": "失去你，我连呼吸都觉得多余。",
        "source": "《夜曲》"
      },
      {
        "text": "思念太猖狂，一个冷不防，挣脱了捆绑。",
        "source": "《思念是一种病》"
      },
      {
        "text": "当你在穿山越岭的另一边，我在孤独的路上没有尽头。",
        "source": "《思念是一种病》"
      },
      {
        "text": "一辈子有多少的来不及，发现已经失去，最重要的东西。",
        "source": "《思念是一种病》"
      },
      {
        "text": "我们曾相爱，想到就心酸。",
        "source": "《心酸》"
      },
      {
        "text": "岁月是一场有去无回的旅行，好的坏的都是风景。",
        "source": "《岁月神偷》"
      },
      {
        "text": "时间是让人猝不及防的东西，晴时有风阴有时雨。",
        "source": "《岁月神偷》"
      },
      {
        "text": "争不过朝夕，又念着往昔，偷走了青丝却留住一个你。",
        "source": "《岁月神偷》"
      },
      {
        "text": "能不能蒙上眼睛，就可以不伤心。",
        "source": "《眼泪》"
      },
      {
        "text": "眼泪是魔鬼，眼泪是吸血鬼。",
        "source": "《眼泪》"
      },
      {
        "text": "你不知道我为什么离开你，我坚持不能说放任你哭泣。",
        "source": "《你不知道的事》"
      },
      {
        "text": "多的是，你不知道的事。",
        "source": "《你不知道的事》"
      },
      {
        "text": "蝴蝶眨几次眼睛，才学会飞行。",
        "source": "《你不知道的事》"
      },
      {
        "text": "夜空中的星星，坠落了几颗，才懂得珍惜。",
        "source": "《你不知道的事》"
      },
      {
        "text": "只要有爱，就会有期待。",
        "source": "《有爱就会有期待》"
      },
      {
        "text": "爱存在，这美丽新世界。",
        "source": "《美丽新世界》"
      },
      {
        "text": "有一种悲伤，是你的名字停留在我的过往。",
        "source": "《有一种悲伤》"
      },
      {
        "text": "陪伴我呼吸，决定我微笑模样，无法遗忘。",
        "source": "《有一种悲伤》"
      },
      {
        "text": "有一种悲伤，是笑得不如往常，就好像没有你在一样。",
        "source": "《有一种悲伤》"
      },
      {
        "text": "你是我唯一想要的了解。",
        "source": "《唯一》"
      },
      {
        "text": "Baby 你就是我的唯一，两个世界都变形，回去谈何容易。",
        "source": "《唯一》"
      },
      {
        "text": "确认过眼神，我遇上对的人。",
        "source": "《醉赤壁》"
      },
      {
        "text": "我用尽一生一世来将你供养，只期盼你停住流转的目光。",
        "source": "《爱的供养》"
      },
      {
        "text": "请赐予我无限爱与被爱的力量，让我能安心在菩提下静静的观想。",
        "source": "《爱的供养》"
      },
      {
        "text": "那一年让一生改变，时间有着无形的剑。",
        "source": "《岁月无情》"
      },
      {
        "text": "有些故事还没讲完那就算了吧。",
        "source": "《那些花儿》"
      },
      {
        "text": "那些心情在岁月中已经难辨真假。",
        "source": "《那些花儿》"
      },
      {
        "text": "如今这里荒草丛生没有了鲜花，好在曾经拥有你们的春秋和冬夏。",
        "source": "《那些花儿》"
      },
      {
        "text": "他们都老了吧？他们在哪里呀？我们就这样，各自奔天涯。",
        "source": "《那些花儿》"
      },
      {
        "text": "故事的最后你好像还是说了，拜拜。",
        "source": "《晴天》"
      },
      {
        "text": "为你翘课的那一天，花落的那一天，教室的那一间，我怎么看不见。",
        "source": "《晴天》"
      },
      {
        "text": "刮风这天我试过握着你手，但偏偏雨渐渐大到我看你不见。",
        "source": "《晴天》"
      },
      {
        "text": "还要多久我才能在你身边，等到放晴的那天也许我会比较好一点。",
        "source": "《晴天》"
      },
      {
        "text": "想把你写成一首歌，想养一只猫。",
        "source": "《关于我爱你》"
      },
      {
        "text": "我拥有的都是侥幸啊，我失去的都是人生。",
        "source": "《关于我爱你》"
      },
      {
        "text": "当你看拥挤的街头，我们不过是宇宙的一颗尘埃。",
        "source": "《尘埃》"
      },
      {
        "text": "其实你是个心狠又手辣的小偷，我的心我的呼吸和名字都偷走。",
        "source": "《小偷》"
      },
      {
        "text": "我想摸你的头发，只是简单的试探啊。",
        "source": "《我想摸你的头发》"
      },
      {
        "text": "我知道那些夏天，就像青春一样回不来。",
        "source": "《安和桥》"
      },
      {
        "text": "代替梦想的也只能是勉为其难。",
        "source": "《安和桥》"
      },
      {
        "text": "我知道吹过的牛逼也会随青春一笑了之。",
        "source": "《安和桥》"
      },
      {
        "text": "让我再看你一遍，从南到北。",
        "source": "《安和桥》"
      },
      {
        "text": "你总是心太软，心太软，把所有问题都自己扛。",
        "source": "《心太软》"
      },
      {
        "text": "相爱总是简单，相处太难。",
        "source": "《心太软》"
      },
      {
        "text": "不是你的，就别再勉强。",
        "source": "《心太软》"
      },
      {
        "text": "只要为你活一天，这是我心愿。",
        "source": "《只要为你活一天》"
      },
      {
        "text": "冷冷的冰雨在脸上胡乱的拍，暖暖的眼泪跟寒雨混成一块。",
        "source": "《冰雨》"
      },
      {
        "text": "眼前的黑不是黑，你说的白是什么白。",
        "source": "《你是我的眼》"
      },
      {
        "text": "如果我能看得见，就能轻易的分辨白天黑夜。",
        "source": "《你是我的眼》"
      },
      {
        "text": "你是我的眼，带我领略四季的变换。",
        "source": "《你是我的眼》"
      },
      {
        "text": "你是我的眼，带我穿越拥挤的人潮。",
        "source": "《你是我的眼》"
      },
      {
        "text": "我怀念的是无话不说，我怀念的是一起做梦。",
        "source": "《我怀念的》"
      },
      {
        "text": "我怀念的是争吵以后，还是想要爱你的冲动。",
        "source": "《我怀念的》"
      },
      {
        "text": "谁忘了那关于爱情的规则，多少两人漫步变成街上一个人哭着。",
        "source": "《我怀念的》"
      },
      {
        "text": "太爱了，所以我，没有哭，没有说。",
        "source": "《我怀念的》"
      },
      {
        "text": "有时候感觉乏味，有时候感觉很累。",
        "source": "《有时候》"
      },
      {
        "text": "也许放弃，才能靠近你。",
        "source": "《盛夏的果实》"
      },
      {
        "text": "不再见又何妨，回忆里有你就不算悲凉。",
        "source": "《盛夏的果实》"
      },
      {
        "text": "时间摧毁了所有的美好，但却摧毁不了我对你的记忆。",
        "source": "《记忆》"
      },
      {
        "text": "你存在的意义，在于你能给我带来勇气。",
        "source": "《勇气》"
      },
      {
        "text": "你笑起来真好看，像春天的花一样。",
        "source": "《你笑起来真好看》"
      },
      {
        "text": "把所有的烦恼所有的忧愁，统统都吹散。",
        "source": "《你笑起来真好看》"
      },
      {
        "text": "不要太在乎别人的看法，做自己就好。",
        "source": "《做自己》"
      },
      {
        "text": "生活不是偶像剧，没有那么多的一见钟情。",
        "source": "《生活》"
      },
      {
        "text": "每一天都是崭新的一天，不要被昨天的悲伤所束缚。",
        "source": "《崭新的一天》"
      },
      {
        "text": "只要心中有光，哪里都是舞台。",
        "source": "《光》"
      },
      {
        "text": "爱笑的人运气都不会太差。",
        "source": "《爱笑》"
      },
      {
        "text": "人生没有彩排，每一天都是现场直播。",
        "source": "《现场直播》"
      },
      {
        "text": "跌倒了没关系，拍拍身上的灰尘，继续前行。",
        "source": "《前行》"
      },
      {
        "text": "不要害怕失败，失败是成功之母。",
        "source": "《失败》"
      },
      {
        "text": "有时候，闭上眼睛才能看清世界。",
        "source": "《闭眼》"
      },
      {
        "text": "让心静下来，倾听内心的声音。",
        "source": "《倾听》"
      },
      {
        "text": "时间会证明一切，不要急于求成。",
        "source": "《时间》"
      },
      {
        "text": "缘分是本书，翻得不经意会错过，读得太认真会流泪。",
        "source": "《缘分》"
      },
      {
        "text": "有些东西失去了，就永远也找不回来了。",
        "source": "《失去》"
      },
      {
        "text": "珍惜眼前人，不要等到失去了才后悔莫及。",
        "source": "《珍惜》"
      },
      {
        "text": "相遇是缘，相识是份，相知是情，相爱是命。",
        "source": "《相遇》"
      },
      {
        "text": "前世的五百次回眸，才换来今生的一次擦肩而过。",
        "source": "《擦肩而过》"
      },
      {
        "text": "人生若只如初见，何事秋风悲画扇。",
        "source": "《初见》(化用词句入歌)"
      },
      {
        "text": "情不知所起，一往而深。",
        "source": "《情深》(化用戏文入歌)"
      },
      {
        "text": "问世间情为何物，直教人生死相许。",
        "source": "《问情》(化用词句入歌)"
      },
      {
        "text": "只愿得一人心，白首不相离。",
        "source": "《白头吟》"
      },
      {
        "text": "陪伴是最长情的告白。",
        "source": "《陪伴》"
      },
      {
        "text": "你若安好，便是晴天。",
        "source": "《晴天》"
      },
      {
        "text": "岁月静好，现世安稳。",
        "source": "《岁月静好》"
      },
      {
        "text": "执子之手，与子偕老。",
        "source": "《偕老》(化用诗经入歌)"
      },
      {
        "text": "愿得一人心，白首不分离。",
        "source": "《愿得一人心》"
      },
      {
        "text": "爱是一道光，如此美妙。",
        "source": "《欧若拉》"
      },
      {
        "text": "指引我们想要的未来。",
        "source": "《欧若拉》"
      },
      {
        "text": "魔力北极光，奇幻的预言。",
        "source": "《欧若拉》"
      },
      {
        "text": "红尘滚滚，痴痴情深，聚散终有时。",
        "source": "《红尘》"
      },
      {
        "text": "花开花落，云卷云舒，一切皆有定数。",
        "source": "《定数》"
      },
      {
        "text": "人生如梦，梦如人生，何必太执着。",
        "source": "《人生如梦》"
      },
      {
        "text": "看破红尘，方能超脱生死。",
        "source": "《超脱》"
      },
      {
        "text": "心无挂碍，无挂碍故，无有恐怖。",
        "source": "《心经》(常被谱曲入歌)"
      },
      {
        "text": "远离颠倒梦想，究竟涅槃。",
        "source": "《心经》"
      },
      {
        "text": "菩提本无树，明镜亦非台。",
        "source": "《菩提偈》(常被谱曲入歌)"
      },
      {
        "text": "本来无一物，何处惹尘埃。",
        "source": "《菩提偈》"
      },
      {
        "text": "Let it be, let it be. (顺其自然，随它去吧。)",
        "source": "《Let It Be》"
      },
      {
        "text": "There will be an answer, let it be. (终会有一个答案，顺其自然。)",
        "source": "《Let It Be》"
      },
      {
        "text": "Don't stop believing, hold on to that feeling. (不要停止相信，坚持那份感觉。)",
        "source": "《Don't Stop Believin'》"
      },
      {
        "text": "You may say I'm a dreamer, but I'm not the only one. (你可以说我是个梦想家，但我不是唯一的一个。)",
        "source": "《Imagine》"
      },
      {
        "text": "We are the champions, my friends. (朋友们，我们是冠军。)",
        "source": "《We Are The Champions》"
      },
      {
        "text": "And we'll keep on fighting 'til the end. (我们会一直战斗到最后。)",
        "source": "《We Are The Champions》"
      },
      {
        "text": "I will survive, hey, hey! (我会活下去的，嘿，嘿！)",
        "source": "《I Will Survive》"
      },
      {
        "text": "As long as I know how to love, I know I'll stay alive. (只要我知道如何去爱，我就知道我会活下去。)",
        "source": "《I Will Survive》"
      },
      {
        "text": "What a wonderful world. (多么美好的世界。)",
        "source": "《What a Wonderful World》"
      },
      {
        "text": "I see trees of green, red roses too. (我看见绿树和红玫瑰。)",
        "source": "《What a Wonderful World》"
      },
      {
        "text": "I watch them bloom for me and you. (我看着它们为你我绽放。)",
        "source": "《What a Wonderful World》"
      },
      {
        "text": "Yesterday, all my troubles seemed so far away. (昨天，我所有的烦恼似乎都很遥远。)",
        "source": "《Yesterday》"
      },
      {
        "text": "Now it looks as though they're here to stay. (现在看来它们似乎要留下来了。)",
        "source": "《Yesterday》"
      },
      {
        "text": "Oh, I believe in yesterday. (哦，我相信昨天。)",
        "source": "《Yesterday》"
      },
      {
        "text": "Bridge over troubled water, I will lay me down. (在狂风暴雨的水面上，我愿化作一座桥。)",
        "source": "《Bridge Over Troubled Water》"
      },
      {
        "text": "When you're weary, feeling small, when tears are in your eyes, I will dry them all. (当你疲倦、感到渺小、当泪水在你眼中时，我会为你拭去。)",
        "source": "《Bridge Over Troubled Water》"
      },
      {
        "text": "You raise me up, so I can stand on mountains. (你鼓舞了我，让我能挺立在群山之巅。)",
        "source": "《You Raise Me Up》"
      },
      {
        "text": "You raise me up, to walk on stormy seas. (你鼓舞了我，让我能走过狂风暴雨的海面。)",
        "source": "《You Raise Me Up》"
      },
      {
        "text": "I am strong, when I am on your shoulders. (当你让我靠在你的肩上时，我变得坚强。)",
        "source": "《You Raise Me Up》"
      },
      {
        "text": "You raise me up, to more than I can be. (你鼓舞了我，让我超越了自己。)",
        "source": "《You Raise Me Up》"
      },
      {
        "text": "Everything's gonna be alright. (一切都会好起来的。)",
        "source": "《Three Little Birds》"
      },
      {
        "text": "Don't worry about a thing. (不要担心任何事情。)",
        "source": "《Three Little Birds》"
      },
      {
        "text": "Cause every little thing gonna be alright. (因为每一件小事都会好起来的。)",
        "source": "《Three Little Birds》"
      },
      {
        "text": "It's my life, it's now or never. (这是我的人生，把握现在，机会不再。)",
        "source": "《It's My Life》"
      },
      {
        "text": "I ain't gonna live forever. (我不会永远活下去。)",
        "source": "《It's My Life》"
      },
      {
        "text": "I just want to live while I'm alive. (我只想在活着的时候好好生活。)",
        "source": "《It's My Life》"
      },
      {
        "text": "We don't need no education. (我们不需要教育(思想控制)。)",
        "source": "《Another Brick in the Wall》"
      },
      {
        "text": "We don't need no thought control. (我们不需要思想控制。)",
        "source": "《Another Brick in the Wall》"
      },
      {
        "text": "All you need is love. (你只需要爱。)",
        "source": "《All You Need Is Love》"
      },
      {
        "text": "Love is all you need. (爱是你需要的一切。)",
        "source": "《All You Need Is Love》"
      },
      {
        "text": "Hello darkness, my old friend. (你好黑暗，我的老朋友。)",
        "source": "《The Sound of Silence》"
      },
      {
        "text": "I've come to talk with you again. (我又来和你交谈了。)",
        "source": "《The Sound of Silence》"
      },
      {
        "text": "The answer, my friend, is blowin' in the wind. (朋友，答案在风中飘荡。)",
        "source": "《Blowin' in the Wind》"
      },
      {
        "text": "How many roads must a man walk down, before you call him a man? (一个人要走多少条路，才能称其为男人？)",
        "source": "《Blowin' in the Wind》"
      },
      {
        "text": "Knock, knock, knockin' on heaven's door. (敲，敲，敲击天堂之门。)",
        "source": "《Knockin' On Heaven's Door》"
      },
      {
        "text": "Mama, take this badge off of me, I can't use it anymore. (妈妈，帮我摘下这枚徽章，我再也用不上它了。)",
        "source": "《Knockin' On Heaven's Door》"
      },
      {
        "text": "It's a long way to the top if you wanna rock 'n' roll. (如果你想玩摇滚，通往顶峰的路还很漫长。)",
        "source": "《It's A Long Way To The Top》"
      },
      {
        "text": "Born to be wild. (生来狂野。)",
        "source": "《Born To Be Wild》"
      },
      {
        "text": "Get your motor runnin', head out on the highway. (发动你的引擎，驶向高速公路。)",
        "source": "《Born To Be Wild》"
      },
      {
        "text": "Looking for adventure, and whatever comes our way. (寻找冒险，以及任何迎面而来的事物。)",
        "source": "《Born To Be Wild》"
      },
      {
        "text": "I still haven't found what I'm looking for. (我仍然没有找到我所寻找的。)",
        "source": "《I Still Haven't Found What I'm Looking For》"
      },
      {
        "text": "I have climbed highest mountains, I have run through the fields. (我攀登过最高峰，我奔跑过田野。)",
        "source": "《I Still Haven't Found What I'm Looking For》"
      },
      {
        "text": "Only to be with you, only to be with you. (只为与你在一起，只为与你在一起。)",
        "source": "《I Still Haven't Found What I'm Looking For》"
      },
      {
        "text": "Hotel California, such a lovely place, such a lovely face. (加州旅馆，如此可爱的地方，如此可爱的面容。)",
        "source": "《Hotel California》"
      },
      {
        "text": "You can check out any time you like, but you can never leave! (你随时都可以结账，但你永远无法离开！)",
        "source": "《Hotel California》"
      },
      {
        "text": "Smells like teen spirit. (闻起来像少年心气。)",
        "source": "《Smells Like Teen Spirit》"
      },
      {
        "text": "With the lights out, it's less dangerous. (熄灭灯光后，危险就少了一些。)",
        "source": "《Smells Like Teen Spirit》"
      },
      {
        "text": "Here we are now, entertain us. (我们现在在这里，娱乐我们吧。)",
        "source": "《Smells Like Teen Spirit》"
      },
      {
        "text": "I will always love you. (我会永远爱你。)",
        "source": "《I Will Always Love You》"
      },
      {
        "text": "And I hope life treats you kind, and I hope you have all you've dreamed of. (我希望生活能善待你，我希望你能拥有你所梦想的一切。)",
        "source": "《I Will Always Love You》"
      }
    ]
  }
}


path: interaction_model.json
content: {
  "version": "1.0.0",
  "language": "zh-CN",
  "invocationName": "答案之书",
  "intents": [
    {
      "name": "LaunchIntent",
      "description": "欢迎用户进入答案之书",
      "samples": [
        "打开答案之书",
        "开始",
        "欢迎",
        "我想进入答案之书"
      ]
    },
    {
      "name": "AskAnswerIntent",
      "description": "提交自然语言问题，由系统在电影、文学、音乐书库中返回随机答案，也可显式指定书库",
      "slots": [
        {
          "name": "question",
          "type": "text"
        }
      ],
      "samples": [
        "{question}",
        "我想问{question}",
        "请帮我看看{question}",
        "用电影答案之书问{question}",
        "用文学答案之书问{question}",
        "用音乐答案之书问{question}"
      ]
    },
    {
      "name": "SwitchBookIntent",
      "description": "在上一题上下文基础上切换到电影、文学或音乐书库重新抽取",
      "slots": [
        {
          "name": "book_name",
          "type": "book"
        }
      ],
      "samples": [
        "那用电影版的再测一次",
        "换电影之书",
        "换文学之书",
        "换音乐之书",
        "那用文学版再来一次",
        "那用音乐版再来一次"
      ]
    },
    {
      "name": "DailyFortuneIntent",
      "description": "抽取每日一签",
      "samples": [
        "每日一签",
        "来一张今日签文",
        "今天的签"
      ]
    },
    {
      "name": "FallbackIntent",
      "description": "处理纯数字、乱码或无法识别的输入",
      "samples": [
        "123456",
        "？？？？",
        "......"
      ]
    }
  ]
}


path: main.py
content: #!/usr/bin/env python3
from __future__ import annotations

import argparse

from service import WELCOME_MESSAGE, handle_request, normalize_text


def run_interactive_session(user_id: str) -> None:
    print(WELCOME_MESSAGE)
    while True:
        try:
            message = input("> ").strip()
        except EOFError:
            print()
            break
        if message.lower() in {"exit", "quit"}:
            break
        print(handle_request(user_id, message))
        print()


def build_parser() -> argparse.ArgumentParser:
    parser = argparse.ArgumentParser(description="答案之书.skill 文本技能入口")
    parser.add_argument("message", nargs="*", help="要发送给答案之书.skill 的消息")
    parser.add_argument("--user-id", default="demo-user", help="用于持久化状态的用户标识")
    parser.add_argument("--interactive", action="store_true", help="进入本地 REPL 交互模式")
    return parser


def main() -> None:
    parser = build_parser()
    args = parser.parse_args()

    if args.interactive:
        run_interactive_session(args.user_id)
        return

    message = normalize_text(" ".join(args.message))
    print(handle_request(args.user_id, message))


if __name__ == "__main__":
    main()


path: requirements.txt
content: # No external runtime dependencies.


path: router.py
content: from __future__ import annotations

import random
import re
from dataclasses import dataclass

MOVIE_BOOK = "《电影答案之书》"
LITERARY_BOOK = "《文学答案之书》"
MUSIC_BOOK = "《音乐答案之书》"
DEFAULT_BOOKS = (MOVIE_BOOK, LITERARY_BOOK, MUSIC_BOOK)

SWITCH_BOOK_ALIASES = [
    ("电影答案之书", MOVIE_BOOK),
    ("电影之书", MOVIE_BOOK),
    ("电影版", MOVIE_BOOK),
    ("电影", MOVIE_BOOK),
    ("文学答案之书", LITERARY_BOOK),
    ("文学之书", LITERARY_BOOK),
    ("文学版", LITERARY_BOOK),
    ("文学", LITERARY_BOOK),
    ("音乐答案之书", MUSIC_BOOK),
    ("音乐之书", MUSIC_BOOK),
    ("音乐版", MUSIC_BOOK),
    ("音乐", MUSIC_BOOK),
]

EXPLICIT_BOOK_PATTERNS = {
    MOVIE_BOOK: [
        re.compile(r"(用|请用|给我用|翻开|打开).{0,4}电影(答案之书|之书|版)?"),
        re.compile(r"电影(答案之书|之书|版).{0,4}(问|看看|测|回答)"),
    ],
    LITERARY_BOOK: [
        re.compile(r"(用|请用|给我用|翻开|打开).{0,4}文学(答案之书|之书|版)?"),
        re.compile(r"文学(答案之书|之书|版).{0,4}(问|看看|测|回答)"),
    ],
    MUSIC_BOOK: [
        re.compile(r"(用|请用|给我用|翻开|打开).{0,4}音乐(答案之书|之书|版)?"),
        re.compile(r"音乐(答案之书|之书|版).{0,4}(问|看看|测|回答)"),
    ],
}

SWITCH_HINTS = ("换", "换成", "再测", "再来", "重新", "再试", "用")
SWITCH_FILLER_PHRASES = [
    "那就",
    "那用",
    "那",
    "的",
    "请",
    "帮我",
    "给我",
    "一下",
    "再测一次",
    "再来一次",
    "再试一次",
    "再测",
    "再来",
    "再试",
    "一次",
    "版本",
    "版的",
    "之书",
    "答案之书",
    "用",
    "换成",
    "换",
    "吧",
    "呀",
    "啊",
    "重新",
]

ROUTING_SIGNALS = {
    MOVIE_BOOK: {
        "keywords": {
            "电影": 2.4,
            "镜头": 2.8,
            "结局": 1.8,
            "台词": 2.6,
            "主角": 2.0,
            "配乐": 2.0,
            "荧幕": 2.2,
            "导演": 1.8,
            "剧情": 2.2,
        },
        "regex": [
            (r"(像|如同).{0,8}(电影|镜头|结局)", 2.4),
            (r"(这段|这一场|这次).{0,10}(像什么电影|会是什么结局)", 2.6),
        ],
    },
    LITERARY_BOOK: {
        "keywords": {
            "文学": 2.4,
            "名著": 2.8,
            "小说": 2.4,
            "诗": 1.8,
            "诗句": 2.2,
            "章节": 2.0,
            "书页": 2.0,
            "段落": 1.8,
            "句子": 1.6,
            "注脚": 2.0,
        },
        "regex": [
            (r"(像|如同).{0,8}(小说|诗|章节|名著)", 2.2),
            (r"(写进|放进).{0,8}(小说|书里|章节)", 2.0),
        ],
    },
    MUSIC_BOOK: {
        "keywords": {
            "音乐": 2.6,
            "歌词": 2.8,
            "旋律": 2.4,
            "歌单": 2.6,
            "歌曲": 2.6,
            "副歌": 2.2,
            "前奏": 2.0,
            "耳机": 1.8,
            "节拍": 2.0,
            "唱片": 1.8,
            "听歌": 2.6,
        },
        "regex": [
            (r"(像|如同).{0,8}(一首歌|歌词|旋律)", 2.4),
            (r"(适合|想听|该听).{0,8}(什么歌|哪首歌|什么音乐)", 2.6),
        ],
    },
}


@dataclass(frozen=True)
class RouteDecision:
    book_name: str
    confidence: float
    scores: dict[str, float]
    reasons: list[str]


def find_book_alias(user_input: str, aliases: list[tuple[str, str]]) -> str | None:
    for alias, book_name in aliases:
        if alias in user_input:
            return book_name
    return None


def detect_switch_book_intent(user_input: str) -> str | None:
    requested_book = find_book_alias(user_input, SWITCH_BOOK_ALIASES)
    if not requested_book:
        return None
    if not any(hint in user_input for hint in SWITCH_HINTS):
        return None

    residual = user_input
    for alias, _book_name in SWITCH_BOOK_ALIASES:
        residual = residual.replace(alias, " ")
    for filler in SWITCH_FILLER_PHRASES:
        residual = residual.replace(filler, " ")

    residual = re.sub(r"[，。！？!?、,.~～\s]+", "", residual)
    if residual:
        return None
    return requested_book


def detect_explicit_book(user_input: str) -> RouteDecision | None:
    for book_name, patterns in EXPLICIT_BOOK_PATTERNS.items():
        for pattern in patterns:
            if pattern.search(user_input):
                return RouteDecision(book_name, 0.98, {book_name: 9.5}, [f"explicit:{book_name}"])
    return None


def score_implicit_books(user_input: str) -> tuple[dict[str, float], dict[str, list[str]]]:
    scores = {book_name: 0.0 for book_name in ROUTING_SIGNALS}
    reasons = {book_name: [] for book_name in ROUTING_SIGNALS}

    for book_name, rules in ROUTING_SIGNALS.items():
        for keyword, weight in rules["keywords"].items():
            if keyword in user_input:
                scores[book_name] += weight
                reasons[book_name].append(f"kw:{keyword}")

        for pattern, weight in rules["regex"]:
            if re.search(pattern, user_input):
                scores[book_name] += weight
                reasons[book_name].append(f"re:{pattern}")

    return scores, reasons


def resolve_confidence(scores: dict[str, float], book_name: str) -> float:
    ordered_scores = sorted(scores.values(), reverse=True)
    top_score = ordered_scores[0]
    second_score = ordered_scores[1] if len(ordered_scores) > 1 else 0.0
    margin = top_score - second_score

    if top_score <= 0:
        return 0.35
    if top_score >= 4 or margin >= 2:
        return min(0.92, 0.58 + top_score / 16)
    if top_score >= 2:
        return min(0.8, 0.46 + top_score / 18)
    if book_name in DEFAULT_BOOKS:
        return 0.35
    return 0.4


def route_question_to_book(user_input: str) -> RouteDecision:
    explicit_decision = detect_explicit_book(user_input)
    if explicit_decision is not None:
        return explicit_decision

    scores, reasons = score_implicit_books(user_input)
    ordered = sorted(scores.items(), key=lambda item: item[1], reverse=True)
    top_book, top_score = ordered[0]
    second_score = ordered[1][1] if len(ordered) > 1 else 0.0

    if top_score < 2 or top_score - second_score < 0.8:
        fallback_book = random.choice(DEFAULT_BOOKS)
        return RouteDecision(fallback_book, 0.35, scores, ["fallback:random"])

    confidence = resolve_confidence(scores, top_book)
    return RouteDecision(top_book, confidence, scores, reasons[top_book])


def select_book(user_input: str) -> str:
    return route_question_to_book(user_input).book_name


path: service.py
content: from __future__ import annotations

import dataclasses
import functools
import json
import os
import random
import re
from datetime import datetime, timezone
from pathlib import Path

from router import detect_switch_book_intent, route_question_to_book
from storage import UserState, load_user_state, save_user_state

BASE_DIR = Path(__file__).resolve().parent
DUPLICATE_WINDOW_SECONDS = 300

WELCOME_MESSAGE = """欢迎翻开答案之书。

此刻馆内向你敞开的，是三座各有气质的书架：用银幕对白照亮犹疑的《电影答案之书》，用名句与章节安放心绪的《文学答案之书》，以及用歌词与旋律替情绪命名的《音乐答案之书》。

你可以把问题直接交给我，我会在这三本书之间替你随机翻开最适合的一页；若你心里已有偏爱的语气，也可以亲手指定想问的那一本，让电影回答你的悬念，让文学安放你的心事，让音乐替你唱出未说出口的话。若想领走今天的一句微光，回复“每日一签”。

现在，请把那个最牵动你心绪的问题，轻轻放到桌上。"""
FALLBACK_MESSAGE = "抱歉，图书馆灯光太暗，我没看清。请用文字提出具体的疑问。"
DUPLICATE_MESSAGE = "你刚刚已经问过这个问题了，《答案之书》不接受反复试探，请相信你的第一直觉。刚才给你的指引是：\n{last_answer}"
SWITCH_WITHOUT_CONTEXT_MESSAGE = "你还没有上一题可以换书重测，请先提出一个问题。"
HISTORY_DISABLED_MESSAGE = "借阅记录功能已关闭，当前版本不会保存或展示历史记录。"
STANDARD_RESPONSE_TEMPLATE = """我感受到了你的困惑。
正在为你翻开 {book_name}...

它给你的指引是：
{answer_block}"""

LAUNCH_PHRASES = {"", "开始", "打开答案之书", "欢迎", "进入答案之书", "launch", "start"}
HISTORY_PHRASES = {"查看记录", "历史记录", "查看历史", "我的记录", "浏览记录"}
DAILY_PHRASES = {"每日一签", "今日一签", "今天的签", "来一张今日签文"}
LEGACY_UNSUPPORTED_PHRASES = {"生成卡片", "生成贺卡"}


@dataclasses.dataclass(frozen=True)
class AnswerEntry:
    text: str
    source: str | None = None


@dataclasses.dataclass(frozen=True)
class BookCatalog:
    books: dict[str, list[AnswerEntry]]
    content_mode: str
    notice: str | None = None


def get_books_path() -> Path:
    return Path(os.getenv("ANSWER_LIBRARY_BOOKS", BASE_DIR / "data" / "books.json"))


def parse_answer_string(raw_text: str) -> AnswerEntry:
    line = raw_text.strip()
    if "——" in line:
        text_part, source_part = line.rsplit("——", 1)
        source = source_part.strip() or None
    else:
        text_part = line
        source = None

    text = text_part.strip().strip('"').strip("“”").strip()
    if not text:
        raise ValueError("Answer text cannot be empty.")
    return AnswerEntry(text=text, source=source)


def load_answer_entry(raw_entry: object) -> AnswerEntry:
    if isinstance(raw_entry, dict):
        text = str(raw_entry.get("text", "")).strip()
        source = str(raw_entry.get("source", "")).strip() or None
        if not text:
            raise ValueError("Answer entry is missing text.")
        return AnswerEntry(text=text, source=source)
    if isinstance(raw_entry, str):
        return parse_answer_string(raw_entry)
    raise ValueError(f"Unsupported answer entry type: {type(raw_entry).__name__}")


@functools.lru_cache(maxsize=4)
def load_books_from_path(books_path: str) -> BookCatalog:
    with Path(books_path).open("r", encoding="utf-8") as handle:
        raw_books = json.load(handle)

    meta = raw_books.get("_meta", {}) if isinstance(raw_books, dict) else {}
    content_mode = str(meta.get("content_mode", "provided"))
    notice = meta.get("notice")
    books: dict[str, list[AnswerEntry]] = {}
    for book_name, payload in raw_books.items():
        if str(book_name).startswith("_"):
            continue
        answers = [load_answer_entry(item) for item in payload.get("answers", [])]
        if not answers:
            raise ValueError(f"Book {book_name} has no answers configured.")
        books[book_name] = answers
    return BookCatalog(books=books, content_mode=content_mode, notice=str(notice) if notice else None)


def load_books() -> BookCatalog:
    return load_books_from_path(str(get_books_path().resolve()))


def normalize_text(user_input: str) -> str:
    return re.sub(r"\s+", " ", user_input or "").strip()


def is_launch_intent(user_input: str) -> bool:
    return user_input in LAUNCH_PHRASES


def is_history_intent(user_input: str) -> bool:
    return user_input in HISTORY_PHRASES


def is_daily_fortune_intent(user_input: str) -> bool:
    return user_input in DAILY_PHRASES


def is_unsupported_legacy_intent(user_input: str) -> bool:
    return user_input in LEGACY_UNSUPPORTED_PHRASES


def is_invalid_input(user_input: str) -> bool:
    if not user_input:
        return False
    if re.search(r"[A-Za-z\u4e00-\u9fff]", user_input):
        return False
    return re.fullmatch(r"[\W\d_]+", user_input, re.UNICODE) is not None


def draw_answer(books: dict[str, list[AnswerEntry]], book_name: str) -> AnswerEntry:
    return random.choice(books[book_name])


def render_answer_block(answer: AnswerEntry) -> str:
    if answer.source:
        return f"「 {answer.text} 」\n出处：{answer.source}"
    return f"「 {answer.text} 」"


def format_standard_response(book_name: str, answer: AnswerEntry) -> str:
    return STANDARD_RESPONSE_TEMPLATE.format(book_name=book_name, answer_block=render_answer_block(answer))


def persist_answer_context(
    state: UserState,
    question: str,
    answer: AnswerEntry,
    book_name: str,
    now: datetime,
    *,
    update_last_context: bool = True,
) -> None:
    answer_display = render_answer_block(answer)
    state.history_log = []
    if update_last_context:
        state.last_question = question
        state.last_answer = answer_display
        state.last_book = book_name
        state.last_timestamp = int(now.timestamp())
    save_user_state(state)


def handle_request(user_id: str, user_input: str, now: datetime | None = None) -> str:
    current_time = (now or datetime.now(timezone.utc)).astimezone()
    normalized_input = normalize_text(user_input)
    state = load_user_state(user_id)
    catalog = load_books()

    if is_launch_intent(normalized_input):
        return WELCOME_MESSAGE

    if is_invalid_input(normalized_input):
        return FALLBACK_MESSAGE

    if is_unsupported_legacy_intent(normalized_input):
        return FALLBACK_MESSAGE

    if is_history_intent(normalized_input):
        return HISTORY_DISABLED_MESSAGE

    if is_daily_fortune_intent(normalized_input):
        selected_book = random.choice(list(catalog.books))
        answer = draw_answer(catalog.books, selected_book)
        persist_answer_context(
            state,
            normalized_input,
            answer,
            selected_book,
            current_time,
            update_last_context=False,
        )
        return f"【每日一签】\n{render_answer_block(answer)}"

    switch_book = detect_switch_book_intent(normalized_input)
    if switch_book:
        if not state.last_question:
            return SWITCH_WITHOUT_CONTEXT_MESSAGE
        current_question = state.last_question
        selected_book = switch_book
        bypass_duplicate_check = True
    else:
        current_question = normalized_input
        selected_book = route_question_to_book(normalized_input).book_name
        bypass_duplicate_check = False

    if selected_book not in catalog.books:
        selected_book = random.choice(list(catalog.books))

    if (
        not bypass_duplicate_check
        and state.last_question == current_question
        and state.last_timestamp is not None
        and int(current_time.timestamp()) - state.last_timestamp < DUPLICATE_WINDOW_SECONDS
    ):
        return DUPLICATE_MESSAGE.format(last_answer=state.last_answer or "")

    answer = draw_answer(catalog.books, selected_book)
    persist_answer_context(state, current_question, answer, selected_book, current_time)
    return format_standard_response(selected_book, answer)


path: skill.json
content: {
  "name": "book-of-answers-skill",
  "display_name": "答案之书.skill",
  "version": "1.0.0",
  "description": "把问题轻轻放下，让电影、文学与音乐为你翻出一句带出处的回答。",
  "language": "zh-CN",
  "runtime": {
    "type": "python3",
    "entry_point": "main.py",
    "callable": "handle_request"
  },
  "storage": {
    "type": "sqlite",
    "path": "data/book-of-answers-skill.sqlite3"
  },
  "data_sources": {
    "books": "data/books.json"
  },
  "interaction_model": "interaction_model.json",
  "intents": [
    "LaunchIntent",
    "AskAnswerIntent",
    "SwitchBookIntent",
    "DailyFortuneIntent",
    "FallbackIntent"
  ]
}


path: storage.py
content: from __future__ import annotations

import json
import os
import sqlite3
from dataclasses import dataclass, field
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent


@dataclass
class UserState:
    user_id: str
    last_question: str | None = None
    last_answer: str | None = None
    last_book: str | None = None
    last_timestamp: int | None = None
    history_log: list[dict[str, str]] = field(default_factory=list)


def get_db_path() -> Path:
    return Path(os.getenv("ANSWER_LIBRARY_DB", BASE_DIR / "data" / "book-of-answers-skill.sqlite3"))


def connect_db() -> sqlite3.Connection:
    db_path = get_db_path()
    db_path.parent.mkdir(parents=True, exist_ok=True)
    conn = sqlite3.connect(db_path)
    conn.row_factory = sqlite3.Row
    conn.execute(
        """
        CREATE TABLE IF NOT EXISTS user_state (
            user_id TEXT PRIMARY KEY,
            last_question TEXT,
            last_answer TEXT,
            last_book TEXT,
            last_timestamp INTEGER,
            history_log TEXT NOT NULL DEFAULT '[]'
        )
        """
    )
    conn.commit()
    return conn


def parse_history_log(raw_history_log: str | None) -> list[dict[str, str]]:
    try:
        parsed = json.loads(raw_history_log or "[]")
    except json.JSONDecodeError:
        return []

    if not isinstance(parsed, list):
        return []

    history_log: list[dict[str, str]] = []
    for item in parsed:
        if not isinstance(item, dict):
            continue
        history_log.append(
            {
                "date": str(item.get("date", "")),
                "question": str(item.get("question", "")),
                "book_name": str(item.get("book_name", "")),
                "answer": str(item.get("answer", "")),
            }
        )
    return history_log


def coerce_optional_str(value: object) -> str | None:
    if value is None:
        return None
    return str(value)


def coerce_optional_int(value: object) -> int | None:
    if value is None:
        return None
    try:
        return int(value)
    except (TypeError, ValueError):
        return None


def load_user_state(user_id: str) -> UserState:
    with connect_db() as conn:
        row = conn.execute(
            """
            SELECT user_id, last_question, last_answer, last_book, last_timestamp, history_log
            FROM user_state
            WHERE user_id = ?
            """,
            (user_id,),
        ).fetchone()

    if row is None:
        return UserState(user_id=user_id)

    return UserState(
        user_id=str(row["user_id"]),
        last_question=coerce_optional_str(row["last_question"]),
        last_answer=coerce_optional_str(row["last_answer"]),
        last_book=coerce_optional_str(row["last_book"]),
        last_timestamp=coerce_optional_int(row["last_timestamp"]),
        history_log=parse_history_log(row["history_log"]),
    )


def save_user_state(state: UserState) -> None:
    with connect_db() as conn:
        conn.execute(
            """
            INSERT INTO user_state (
                user_id,
                last_question,
                last_answer,
                last_book,
                last_timestamp,
                history_log
            ) VALUES (?, ?, ?, ?, ?, ?)
            ON CONFLICT(user_id) DO UPDATE SET
                last_question = excluded.last_question,
                last_answer = excluded.last_answer,
                last_book = excluded.last_book,
                last_timestamp = excluded.last_timestamp,
                history_log = excluded.history_log
            """,
            (
                state.user_id,
                state.last_question,
                state.last_answer,
                state.last_book,
                state.last_timestamp,
                json.dumps(state.history_log, ensure_ascii=False),
            ),
        )
        conn.commit()


path: tests/test_integration.py
content: import os
import tempfile
import unittest
from datetime import datetime, timedelta, timezone
from pathlib import Path
from unittest.mock import patch

import main
from service import AnswerEntry
from storage import connect_db, load_user_state


class AnswerLibraryIntegrationTests(unittest.TestCase):
    def setUp(self) -> None:
        self.temp_dir = tempfile.TemporaryDirectory()
        self.db_path = Path(self.temp_dir.name) / "integration.sqlite3"
        os.environ["ANSWER_LIBRARY_DB"] = str(self.db_path)
        self.user_id = "integration-user"
        self.base_time = datetime(2026, 4, 14, 9, 0, 0, tzinfo=timezone.utc)

    def tearDown(self) -> None:
        os.environ.pop("ANSWER_LIBRARY_DB", None)
        self.temp_dir.cleanup()

    def test_daily_fortune_does_not_overwrite_switchable_question_context(self) -> None:
        with patch("router.random.choice", return_value="《文学答案之书》"), patch(
            "service.draw_answer",
            return_value=AnswerEntry(text="凡是过去，皆为序章。", source="莎士比亚《暴风雨》"),
        ):
            main.handle_request(self.user_id, "明天会好吗", now=self.base_time)

        with patch(
            "service.random.choice",
            side_effect=[
                "《音乐答案之书》",
                AnswerEntry(text="有时候，有时候，我会相信一切有尽头。", source="《红豆》"),
            ],
        ):
            main.handle_request(self.user_id, "每日一签", now=self.base_time + timedelta(minutes=1))

        with patch(
            "service.draw_answer",
            return_value=AnswerEntry(text="跑，阿甘，快跑！", source="《阿甘正传》"),
        ):
            response = main.handle_request(
                self.user_id,
                "换电影之书",
                now=self.base_time + timedelta(minutes=2),
            )

        self.assertIn("《电影答案之书》", response)
        state = load_user_state(self.user_id)
        self.assertEqual(state.last_question, "明天会好吗")

    def test_legacy_card_phrase_does_not_mutate_context(self) -> None:
        with patch("router.random.choice", return_value="《音乐答案之书》"), patch(
            "service.draw_answer",
            return_value=AnswerEntry(text="我就是我，是颜色不一样的烟火。", source="《我》"),
        ):
            main.handle_request(self.user_id, "明天会好吗", now=self.base_time)

        response = main.handle_request(self.user_id, "生成卡片", now=self.base_time + timedelta(seconds=10))

        state = load_user_state(self.user_id)
        self.assertEqual(state.last_question, "明天会好吗")
        self.assertEqual(response, "抱歉，图书馆灯光太暗，我没看清。请用文字提出具体的疑问。")

    def test_dirty_sqlite_state_recovers_without_crashing(self) -> None:
        with connect_db() as conn:
            conn.execute(
                """
                INSERT INTO user_state (
                    user_id,
                    last_question,
                    last_answer,
                    last_book,
                    last_timestamp,
                    history_log
                ) VALUES (?, ?, ?, ?, ?, ?)
                """,
                (
                    self.user_id,
                    12345,
                    67890,
                    "《电影答案之书》",
                    "not-a-timestamp",
                    "{bad-json",
                ),
            )
            conn.commit()

        with patch("router.random.choice", return_value="《文学答案之书》"), patch(
            "service.draw_answer",
            return_value=AnswerEntry(text="满地都是六便士，他却抬头看见了月亮。", source="毛姆《月亮与六便士》"),
        ):
            response = main.handle_request(self.user_id, "一个新的问题", now=self.base_time)

        self.assertIn("《文学答案之书》", response)
        state = load_user_state(self.user_id)
        self.assertEqual(state.last_question, "一个新的问题")
        self.assertEqual(state.history_log, [])


if __name__ == "__main__":
    unittest.main()


path: tests/test_main.py
content: import os
import tempfile
import unittest
from datetime import datetime, timedelta, timezone
from pathlib import Path
from unittest.mock import patch

import main
from router import route_question_to_book
from service import AnswerEntry
from storage import load_user_state


class AnswerLibraryTests(unittest.TestCase):
    def setUp(self) -> None:
        self.temp_dir = tempfile.TemporaryDirectory()
        self.db_path = Path(self.temp_dir.name) / "book-of-answers-skill-test.sqlite3"
        os.environ["ANSWER_LIBRARY_DB"] = str(self.db_path)
        self.user_id = "test-user"
        self.base_time = datetime(2026, 4, 14, 10, 0, 0, tzinfo=timezone.utc)

    def tearDown(self) -> None:
        os.environ.pop("ANSWER_LIBRARY_DB", None)
        self.temp_dir.cleanup()

    def test_duplicate_question_within_five_minutes_returns_last_answer_with_source(self) -> None:
        with patch(
            "service.draw_answer",
            return_value=AnswerEntry(
                text="希望是件好东西，也许是世上最好的东西，好东西从不会消逝。",
                source="《肖申克的救赎》",
            ),
        ), patch("router.random.choice", return_value="《电影答案之书》"):
            main.handle_request(self.user_id, "明天会好吗", now=self.base_time)

        duplicate_response = main.handle_request(
            self.user_id,
            "明天会好吗",
            now=self.base_time + timedelta(seconds=120),
        )

        self.assertIn("你刚刚已经问过这个问题了", duplicate_response)
        self.assertIn("出处：《肖申克的救赎》", duplicate_response)

    def test_switch_book_follow_up_reuses_last_question_and_bypasses_duplicate_check(self) -> None:
        with patch("router.random.choice", return_value="《文学答案之书》"), patch(
            "service.draw_answer",
            return_value=AnswerEntry(text="凡是过去，皆为序章。", source="莎士比亚《暴风雨》"),
        ):
            main.handle_request(self.user_id, "明天会好吗", now=self.base_time)

        with patch(
            "service.draw_answer",
            return_value=AnswerEntry(
                text="跑，阿甘，快跑！",
                source="《阿甘正传》",
            ),
        ):
            response = main.handle_request(
                self.user_id,
                "那用电影版的再测一次",
                now=self.base_time + timedelta(seconds=60),
            )

        self.assertIn("《电影答案之书》", response)
        self.assertIn("出处：《阿甘正传》", response)
        state = load_user_state(self.user_id)
        self.assertEqual(state.last_question, "明天会好吗")
        self.assertEqual(state.last_book, "《电影答案之书》")

    def test_daily_fortune_uses_daily_prefix_and_source(self) -> None:
        with patch(
            "service.random.choice",
            side_effect=[
                "《音乐答案之书》",
                AnswerEntry(text="我和我最后的倔强，握紧双手绝对不放。", source="《倔强》"),
            ],
        ):
            response = main.handle_request(self.user_id, "每日一签", now=self.base_time)

        self.assertEqual(response, "【每日一签】\n「 我和我最后的倔强，握紧双手绝对不放。 」\n出处：《倔强》")

    def test_welcome_message_introduces_three_books_and_features(self) -> None:
        response = main.handle_request(self.user_id, "", now=self.base_time)
        self.assertIn("欢迎翻开答案之书", response)
        self.assertIn("《电影答案之书》", response)
        self.assertIn("《文学答案之书》", response)
        self.assertIn("《音乐答案之书》", response)
        self.assertIn("每日一签", response)

    def test_history_intent_returns_disabled_message(self) -> None:
        response = main.handle_request(self.user_id, "查看记录", now=self.base_time)
        self.assertEqual(response, "借阅记录功能已关闭，当前版本不会保存或展示历史记录。")

    def test_history_log_is_not_retained_after_answer(self) -> None:
        with patch(
            "service.draw_answer",
            return_value=AnswerEntry(text="凡是过去，皆为序章。", source="莎士比亚《暴风雨》"),
        ), patch("router.random.choice", return_value="《文学答案之书》"):
            main.handle_request(self.user_id, "明天会好吗", now=self.base_time)

        state = load_user_state(self.user_id)
        self.assertEqual(state.history_log, [])

    def test_default_route_is_random_between_three_books(self) -> None:
        with patch("router.random.choice", return_value="《音乐答案之书》"):
            decision = route_question_to_book("我只是想知道接下来会怎样")
        self.assertEqual(decision.book_name, "《音乐答案之书》")
        self.assertIn("fallback:random", decision.reasons)

    def test_router_prefers_movie_for_movie_language(self) -> None:
        decision = route_question_to_book("如果这是一部电影，现在会走向什么结局")
        self.assertEqual(decision.book_name, "《电影答案之书》")
        self.assertGreaterEqual(decision.confidence, 0.6)

    def test_router_prefers_literary_for_literary_language(self) -> None:
        decision = route_question_to_book("请用文学答案之书回答我，这一章该怎么写下去")
        self.assertEqual(decision.book_name, "《文学答案之书》")
        self.assertGreaterEqual(decision.confidence, 0.8)

    def test_router_prefers_music_for_music_language(self) -> None:
        decision = route_question_to_book("适合听什么歌，我想从歌词里找答案")
        self.assertEqual(decision.book_name, "《音乐答案之书》")
        self.assertGreaterEqual(decision.confidence, 0.6)

    def test_standard_response_contains_source_line(self) -> None:
        with patch(
            "service.draw_answer",
            return_value=AnswerEntry(text="凡是过去，皆为序章。", source="莎士比亚《暴风雨》"),
        ), patch("router.random.choice", return_value="《文学答案之书》"):
            response = main.handle_request(self.user_id, "明天会好吗", now=self.base_time)

        self.assertIn("出处：莎士比亚《暴风雨》", response)


if __name__ == "__main__":
    unittest.main()


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (HIGH)