十万个为什么 API:5 分钟接入,从第一条问答到完整详情
十万个为什么 API快速接入Python示例免费接口科普问答 # 十万个为什么 API:5 分钟接入,从第一条问答到完整详情
> 接口:十万个为什么(apiCode=1706)· 接入点:列表(1706-1) + 详情(1706-2) · 免费 · 请求方式:POST/GET · 返回格式:JSON · 适用人群:新注册用户 / 初级开发者 · 阅读时间:约 6 分钟
## 核心要点
- 十万个为什么 API 是**免费**科普问答接口,先调「列表」用关键词拿到问题 `id`,再调「详情」用 `id` 取完整内容。
- 仅需一个 AppKey 即可跑通两个接入点,无需任何付费或订阅。
- 本篇给可直接运行的 Python / cURL / Node.js 示例,替换 AppKey 即可出结果。
## Why:这跟我有什么关系
如果你是家长类 App、儿童教育产品或科普社区的开发者,想快速给产品加上「孩子问我为什么,我答得上来」的能力,这个接口最直接:传一个关键词(比如"地球"),拿到一批相关问题,点开任意一条就能获取完整科普文字。免费、无需商务对接,适合快速验证想法。
## What:前置条件与接口速览
| 项 | 说明 |
|----|------|
| 接口 | 十万个为什么(apiCode=1706) |
| 接入点 | 列表 `https://route.showapi.com/1706-1`、详情 `https://route.showapi.com/1706-2` |
| 鉴权 | URL 查询参数 `appKey`(在 [AppKey 管理](https://www.showapi.com/console#/myApp) 获取) |
| 请求方式 | POST / GET,表单 `application/x-www-form-urlencoded` |
| 计费 | 免费,注册后默认可调用,有档位限制(细则见[官方档位说明](https://www.showapi.com/free-api)) |
| 返回 | JSON,业务数据在 `showapi_res_body` 内 |
| 集成能力 | MCP、OpenAPI 3.0(YAML/JSON) |
## How:三步跑通
**步骤 1 — 获取 AppKey**
登录后在 [AppKey 管理](https://www.showapi.com/console#/myApp) 拿到你的 AppKey,替换下方 `YOUR_APPKEY`。
**步骤 2 — 调列表接口,拿到问题 id**
列表接入点必填 `keyword`,返回 `contentlist`(数组,每项含 `id` 与 `title`)。
```python
import requests
APP_KEY = "YOUR_APPKEY"
resp = requests.post(
"https://route.showapi.com/1706-1",
data={"keyword": "地球", "page": "1"},
params={"appKey": APP_KEY},
headers={"content-type": "application/x-www-form-urlencoded"},
timeout=10,
)
data = resp.json()
body = data.get("showapi_res_body", {})
if body.get("ret_code") != "0":
raise RuntimeError(f"调用失败:{body.get('remark')}")
for item in body.get("contentlist", []):
print(item["id"], "->", item["title"])
# 例:5ba48fdbc1b458bb0892f6ff -> 地球名片
```
**步骤 3 — 用 id 调详情接口,取完整内容**
详情接入点必填 `id`,返回 `title` 与 `content`(整段科普文本)。
```python
resp = requests.post(
"https://route.showapi.com/1706-2",
data={"id": "5ba48fdbc1b458bb0892f6ff"},
params={"appKey": APP_KEY},
headers={"content-type": "application/x-www-form-urlencoded"},
timeout=10,
)
body = resp.json().get("showapi_res_body", {})
print(body.get("title"))
print(body.get("content"))
```
**cURL 等价写法**
```bash
# 列表
curl -X POST "https://route.showapi.com/1706-1?appKey=YOUR_APPKEY" \
-H "content-type: application/x-www-form-urlencoded" \
-d "keyword=%E5%9C%B0%E7%90%83&page=1"
# 详情
curl -X POST "https://route.showapi.com/1706-2?appKey=YOUR_APPKEY" \
-H "content-type: application/x-www-form-urlencoded" \
-d "id=5ba48fdbc1b458bb0892f6ff"
```
**Node.js(fetch)**
```javascript
const APP_KEY = "YOUR_APPKEY";
const res = await fetch(
`https://route.showapi.com/1706-1?appKey=${APP_KEY}`,
{
method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({ keyword: "地球", page: "1" }),
}
);
const data = await res.json();
const body = data.showapi_res_body;
if (body.ret_code !== "0") throw new Error(body.remark);
body.contentlist.forEach((it) => console.log(it.id, it.title));
```
## 返回示例与解析
列表返回(节选):
```json
{
"showapi_res_code": 0,
"showapi_res_body": {
"remark": "查询成功!",
"allPages": 5,
"ret_code": 0,
"contentlist": [
{"id": "5ba48fdbc1b458bb0892f6ff", "title": "地球名片"},
{"id": "5ba49c07c1b458bb08930161", "title": "地球同步轨道和地球静止轨道"}
],
"currentPage": 1,
"allNum": 210,
"maxResult": 50
}
}
```
- `ret_code`:`"0"` 成功,其他值表示失败(文档未给具体非 0 枚举,失败时看 `remark` 提示)。
- `contentlist`:问题数组,每条含 `id`(详情入参)与 `title`。
- `allNum` / `allPages` / `maxResult`:总数 / 总页数 / 每页上限,用于分页。
## 进阶 / 边界
- **免费 + 档位限制**:接口免费但设有调用档位,具体数字见[官方档位说明](https://www.showapi.com/free-api),本篇不编造。高频场景建议缓存(见[《免费档位下:用缓存策略节省调用次数》](https://www.showapi.com/guides/why100k-free-tier-cache-1706))。
- **必填项**:列表 `keyword` 必填、详情 `id` 必填,缺省会调用失败(看 `remark`)。
- **无订阅/批量**:本接口只有「列表 + 详情」两个同步接入点,文档未提供订阅推送或批量能力。
## FAQ
**Q1:返回 ret_code 不是 0 怎么办?**
看 `showapi_res_body.remark` 的提示文字,通常是必填参数缺失(如 keyword/id 没传)或 AppKey 无效。
**Q2:AppKey 在哪里拿?**
在 [AppKey 管理](https://www.showapi.com/console#/myApp) 获取,作为 URL 查询参数 `appKey` 传入。
**Q3:列表和详情是两个不同的地址吗?**
是的。列表是 `route.showapi.com/1706-1`,详情是 `route.showapi.com/1706-2`,都带同一个 `appKey`。
**Q4:content 里包含视频 URL 吗?**
文档称"提供文章、视频等多媒体内容",但未给出独立的视频字段;实际多媒体结构以接口返回为准,不要预设字段名。
**Q5:免费接口有次数限制吗?**
有档位限制,具体上限以[官方档位说明](https://www.showapi.com/free-api)为准。
## 相关能力 / 下一步阅读
- [十万个为什么 API 返回字段全解:ret_code / contentlist / content 一文读懂](https://www.showapi.com/guides/why100k-response-fields-1706)
- [十万个为什么 API:列表→详情两接入点串联的全链路设计](https://www.showapi.com/guides/why100k-list-detail-flow-1706)
- [十万个为什么 API 免费档位下:用缓存策略节省调用次数](https://www.showapi.com/guides/why100k-free-tier-cache-1706)
- **本系列共 11 篇**:查看[十万个为什么 API 指南总目录](https://www.showapi.com/guides/why100k-guides-1706)