歇后语查询实战:用 num 参数做"每日一语"小程序全链路设计
# 歇后语查询实战:用 num 参数做"每日一语"小程序全链路设计
- **接口/接入点**:歇后语查询 · 1635-1
- **是否免费**:是
- **请求方式**:POST / GET
- **返回格式**:JSON
- **适用人群**:小程序开发者、产品经理、内容运营
- **阅读时间**:约 8 分钟
## 核心要点
- "每日一语"本质 = 定时拉取 `num=1`(或几条)→ 落库 → 前端展示 → 按日去重。
- 免费接口也要控制频率:用本地缓存/落库避免每次打开都打接口。
- 结合"缓存去重"思路,保证连日不重复、体验稳定。
## Why:为什么做"每日一语"
公众号、小程序、企业内部文化墙都爱用"每日一语"做轻互动。歇后语查询免费、无需分类、返回即 `question`+`answer`,天然适合做"今天歇后语"。本文给一套从定时任务到前端卡片的可落地设计。
## What:接口速览
| 项 | 值 |
|----|----|
| 接口地址 | `https://route.showapi.com/1635-1?appKey={your_appKey}` |
| 请求参数 | `num`(选填,随机返回几条) |
| 返回 | `showapi_res_body.contentlist` 数组 |
| 计费 | 免费(设使用档次限制) |
## How:全链路设计
### 步骤 1 — 数据表设计
```sql
CREATE TABLE daily_xiehouyu (
id INT PRIMARY KEY AUTO_INCREMENT,
question VARCHAR(255) NOT NULL,
answer VARCHAR(255) NOT NULL,
show_date DATE NOT NULL UNIQUE, -- 每天一条
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
```
### 步骤 2 — 定时任务拉取(每天 0 点)
```python
import requests, datetime, sqlite3
def fetch_one():
r = requests.post("https://route.showapi.com/1635-1",
params={"appKey": "YOUR_APPKEY"},
data={"num": "1"}, timeout=15)
body = r.json()["showapi_res_body"]
if body.get("ret_code") != "0":
raise RuntimeError(body.get("remark"))
item = body["contentlist"][0]
return item["question"], item["answer"]
def save_today():
today = datetime.date.today()
q, a = fetch_one()
conn = sqlite3.connect("app.db")
conn.execute(
"INSERT OR IGNORE INTO daily_xiehouyu(question,answer,show_date) VALUES(?,?,?)",
(q, a, today))
conn.commit(); conn.close()
```
### 步骤 3 — 前端卡片展示
```html
<div class="card">
<p class="q">{{ question }}</p>
<p class="a">{{ answer }}</p>
</div>
```
### 步骤 4 — 避免连日重复(去重)
底层语料有限(`allNum` 示例 19),随机可能撞车。两个办法:
1. 落库时 `INSERT OR IGNORE` + 唯一约束,撞了就重拉(带重试上限)。
2. 本地维护"已用集合",拉到重复项就再请求一次(见缓存去重篇)。
## 返回示例与解析
```json
{
"showapi_res_body": {
"ret_code": "0",
"remark": "查询成功",
"contentlist": [ { "question": "刘备摔阿斗", "answer": "收买人心" } ]
}
}
```
## 进阶 / 边界
- **频率控制**:免费接口有档次限制,定时任务(每天 1 次)完全够用;绝不要每次页面打开都实时打接口。
- **失败兜底**:拉取失败时用上一次缓存或默认歇后语,保证页面不空。
- **语料有限**:`allNum` 较小,长期"每日一语"会循环;可配合本地题库累积,循环周期更长。
## FAQ
**Q:num=1 一定只返回 1 条吗?**
A:`num` 表示随机返回几条,传 `1` 即期望 1 条;以实际 `contentlist` 长度为准,代码取 `contentlist[0]` 前先判空。
**Q:每天定时拉取会超免费档位吗?**
A:每天 1 次调用量级极小,正常不会;具体档位以官方说明为准。
**Q:怎么保证不重复?**
A:落库用日期唯一约束 + 撞重重试;或本地维护已用集合去重(见缓存去重篇)。
**Q:前端能直接调接口吗?**
A:AppKey 放前端有泄露风险,建议走自己的后端中转(本文设计就是后端定时落库、前端读库)。
**Q:没有分类,能做"主题日"吗?**
A:接口无 category 入参,主题化需用本地标签化方案(见分类 workaround 篇)。
## 相关能力 / 下一步阅读
- [免费接口也要稳:歇后语查询本地缓存与去重策略](https://www.showapi.com/guides/xiehouyu-cache-dedup-1635)
- [歇后语查询没有分类参数?本地标签化与分主题展示的 workaround](https://www.showapi.com/guides/xiehouyu-category-workaround-1635)
- **本系列共 13 篇**:查看[歇后语查询指南总目录](https://www.showapi.com/guides/xiehouyu-guides-1635)