技术博客
故事分享平台如何接入童话故事集 API?内容聚合与展示实践

故事分享平台如何接入童话故事集 API?内容聚合与展示实践

作者: 万维易源
2026-09-02
故事分享平台内容聚合XSS防护
# 故事分享平台如何接入童话故事集 API?内容聚合与展示实践 > 元信息:童话故事集 API(apiCode=1700)· 全接入点 · 免费服务 · 适用人群:内容/社区/教育平台开发者 · 阅读时间约 8 分钟 ## 核心要点 - 平台侧聚合模式:服务端代理持有 AppKey,按分类+关键字批量拉取列表与详情,落库后做聚合展示。 - `content` 是纯文本正文,展示需自行处理段落、换行与字体;渲染前必须转义防 XSS。 - 没有批量接入点,建库靠「分类→列表→详情」逐级调用,必须配合缓存与限流。 ## Why:把接口变成你平台的内容底座 如果你的产品是一个故事分享社区、亲子内容站或校园阅读平台,童话故事集 API 可以充当"经典内容库":你负责分类导航、搜索、收藏、评论等社区能力,故事正文由接口供给。本篇聚焦平台侧的聚合拉取、存储与展示要点。 ## What:平台接入速览 | 能力 | 对应接入点 | 平台侧动作 | |------|-----------|------------| | 分类导航 | 1700-1 | 拉全分类,生成栏目树 | | 内容检索 | 1700-2 | 按分类+关键字拉列表,建索引 | | 正文供给 | 1700-3 | 按 id 取详情,落库缓存 | ## How:服务端代理 + 聚合落库 ```python import requests, sqlite3 APPKEY = "YOUR_APPKEY" conn = sqlite3.connect("stories.db") conn.execute("""CREATE TABLE IF NOT EXISTS story( id TEXT PRIMARY KEY, title TEXT, classify TEXT, content TEXT, cached_at INTEGER)""") def pull_and_store(): # 1) 分类 cats = requests.post(f"https://route.showapi.com/1700-1?appKey={APPKEY}", headers={"content-type": "application/x-www-form-urlencoded"}, timeout=10) cat_list = cats.json()["showapi_res_body"]["storylist"] # 2) 每个分类拉列表(keyword 必填,用能命中的词),再逐篇取详情 for c in cat_list: lst = requests.post(f"https://route.showapi.com/1700-2?appKey={APPKEY}", data={"classifyId": c["classifyId"], "keyword": "故事", "page": "1"}, headers={"content-type": "application/x-www-form-urlencoded"}, timeout=10) for it in lst.json()["showapi_res_body"]["contentlist"]: d = requests.post(f"https://route.showapi.com/1700-3?appKey={APPKEY}", data={"id": it["id"]}, headers={"content-type": "application/x-www-form-urlencoded"}, timeout=10) b = d.json()["showapi_res_body"] conn.execute("INSERT OR REPLACE INTO story VALUES(?,?,?,?,strftime('%s','now'))", (b["id"], b["title"], b["classify"], b["content"])) conn.commit() ``` ```javascript // 前端展示:务必转义 content,防止 XSS function renderContent(content) { const div = document.createElement("div"); div.textContent = content; // textContent 自动转义 return div.innerHTML.split("\n").join("<br>"); } ``` ## 返回示例与解析 - 列表 `contentlist[]`:仅含 `id/title/classifyId`,无正文。 - 详情 `content`:纯文本故事正文,无 HTML、无配图。展示层自行负责排版与配图位。 ## 进阶 / 边界 - **XSS 防护**:`content` 直接进 DOM 有注入风险,务必用 `textContent`/模板转义后渲染,禁止 `innerHTML = content`。 - **版权与署名**:平台展示他人内容应保留来源与必要说明,具体合规以平台运营规范与官方条款为准。 - **增量更新**:全量建库后,用定时任务按分类增量补拉(带缓存 TTL),避免每日全量回源触发档次限制(见[缓存与分页策略](https://www.showapi.com/guides/child-story-cache-1700))。 ## FAQ **Q: 能直接在前端调接口展示吗?** A: 不建议。AppKey 会暴露,且无法做缓存与限流;应由服务端代理持有 AppKey 并落库。 **Q: content 里没有图片,平台怎么配图?** A: 接口只给文字正文,配图由平台按分类/标题自行准备,接口不提供插图。 **Q: 上线的故事会每天变吗?** A: 经典故事正文极稳定,正文变化频率低;分类可能微调,建议动态消费 1700-1。 **Q: 社区 UGC 和接口内容怎么区分?** A: 用来源字段标记(如 `source='showapi'` vs `source='ugc'`),展示与检索时分别处理。 ## 相关能力 / 下一步阅读 - [免费接口也别乱调用:内容缓存与分页拉取策略](https://www.showapi.com/guides/child-story-cache-1700) - [儿童故事小程序全链路设计](https://www.showapi.com/guides/child-story-list-integration-1700) - [童话故事集 API 免费档位说明](https://www.showapi.com/guides/child-story-free-tier-1700) - **本系列共 12 篇**:查看[童话故事集 API 指南总目录](https://www.showapi.com/guides/child-story-guides-1700)