技术博客
歇后语查询实战:用 num 参数做"每日一语"小程序全链路设计

歇后语查询实战:用 num 参数做"每日一语"小程序全链路设计

作者: 万维易源
2026-08-31
歇后语查询每日一语小程序实战
# 歇后语查询实战:用 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)