谜语大全 API 接入教程:随机查询与分页列表实践

适用场景

谜语接口在内容类应用中应用广泛,例如:

  • 微信公众号或聊天机器人中提供每日谜语互动
  • 教育类 App 中添加猜谜环节,提升用户参与度
  • 互动网站中集成“今日谜语” Widget
  • 游戏化营销活动中的随机谜语出题

本文围绕「谜语大全」API 展开,该接口提供三种查询模式,可灵活满足随机或结构化的谜语需求。

接口能力边界

特性说明
请求方式POST
基准 URLhttps://v1.apizero.cn/api/riddle
请求体格式JSON
鉴权方式请求头X-API-Key
速率限制(QPS)5 次/秒
支持模式random(随机一条)、list(分页列表)、types(获取所有类型)

注意:官方文档中未承诺更高级别的 SLA,实际调用时请做好重试与降级策略。

鉴权与请求头

每次请求需在 HTTP Header 中携带 API Key,格式如下:

X-API-Key: 您的密钥 Content-Type: application/json

API Key 需提前从 API 管理后台获取(具体获取方式以平台指引为准)。切勿将密钥硬编码在公开代码仓库中,建议使用环境变量注入。

请求参数详解

请求体为 JSON 对象,各字段说明如下:

字段名类型必填默认值说明
actionstring"random"可选值:"random""list""types"
typestringlist模式有效,小写字母表示谜语类型(如"animal""idiom"
pagestring"1"list模式有效,正整数页码

action 模式说明

  • random:随机返回一条谜语,忽略typepage参数。
  • list:按类型(可选)分页返回多条谜语。若不传type,返回所有类型混排。
  • types:返回该接口支持的所有谜语类型列表(如动物、成语、字谜等)。此模式下忽略typepage

curl 接入示例

以下三个示例分别演示三种模式,请将$APIZERO_API_KEY替换为您的真实密钥。

1. 随机一条谜语

curl -sS \ -X POST \ -H "X-API-Key: $APIZERO_API_KEY" \ -H "Content-Type: application/json" \ -d '{"action": "random"}' \ "https://v1.apizero.cn/api/riddle"

2. 分页列表(查看第 1 页,类型不限)

curl -sS \ -X POST \ -H "X-API-Key: $APIZERO_API_KEY" \ -H "Content-Type: application/json" \ -d '{"action": "list", "page": "1"}' \ "https://v1.apizero.cn/api/riddle"

3. 获取所有谜语类型

curl -sS \ -X POST \ -H "X-API-Key: $APIZERO_API_KEY" \ -H "Content-Type: application/json" \ -d '{"action": "types"}' \ "https://v1.apizero.cn/api/riddle"

以上命令均返回 JSON 格式响应,可使用jq格式化输出:curl ... | jq .

Python 代码示例(requests 库)

假设API_KEY已从环境变量RIDDLE_API_KEY读取,示例代码如下:

import os import requests API_URL = "https://v1.apizero.cn/api/riddle" API_KEY = os.environ.get("RIDDLE_API_KEY") headers = { "X-API-Key": API_KEY, "Content-Type": "application/json" } # 随机一条 def get_random_riddle(): payload = {"action": "random"} resp = requests.post(API_URL, json=payload, headers=headers) return resp.json() # 分页列表 def get_riddle_list(page=1, riddle_type=None): payload = {"action": "list", "page": str(page)} if riddle_type: payload["type"] = riddle_type resp = requests.post(API_URL, json=payload, headers=headers) return resp.json() # 获取所有类型 def get_riddle_types(): payload = {"action": "types"} resp = requests.post(API_URL, json=payload, headers=headers) return resp.json() if __name__ == "__main__": # 示例调用 print("Random riddle:", get_random_riddle()) print("Page 1 list:", get_riddle_list()) print("All types:", get_riddle_types())

注意:生产环境中应添加超时(timeout=10)和异常捕获。

响应结构解读

所有正常响应均遵循以下外层结构:

{ "code": 200, "message": "success", "data": { ... } }
  • code:业务状态码(非 HTTP 状态码),200 表示成功,其他值表示错误。
  • message:状态说明字符串。
  • data:具体数据对象,随action模式不同而不同。

不同模式下的 data 字段

random 模式

返回一个谜语对象,常见字段如下(以官方文档为准):

字段类型说明
idnumber谜语 ID
questionstring谜面
answerstring谜底
typestring谜语类型(小写)
create_timestring创建时间

示例:

{ "code": 200, "message": "success", "data": { "id": 12345, "question": "头戴红帽子,身穿白袍子,走路像公子,说话像猴子。(打一动物)", "answer": "鹅", "type": "animal", "create_time": "2025-01-01 12:00:00" } }
list 模式

data 为分页对象:

{ "code": 200, "message": "success", "data": { "total": 500, "page": 1, "size": 20, "items": [ { "id": 1, "question": "...", "answer": "...", "type": "..." } // ... ] } }
  • total:符合条件的总条数
  • page:当前页码
  • size:每页条数(固定值,以文档为准)
  • items:谜语对象数组
types 模式

data 为类型字符串数组:

{ "code": 200, "message": "success", "data": ["animal", "idiom", "character", "misc"] }

注意:以上字段仅为常见示例,实际返回可能有所不同,请以接口返回为准。

错误处理与常见错误码

HTTP 状态码业务 code说明处理建议
200200成功正常解析 data
200400参数错误(如 action 值非法)检查请求体格式
200401API Key 无效或缺失检查请求头 X-API-Key
200429超过 QPS 限制(5 次/秒)添加重试间隔(如指数退避)
200500服务器内部错误稍后重试,若持续则反馈官方
4xx/5xx-网络级错误捕获异常,记录日志

最佳实践

  • 解析code而非仅依赖 HTTP 状态码(所有业务响应均为 200)。
  • 实现重试逻辑:遇到 429 至少等待 1 秒再试;500 等临时错误可重试 2-3 次。

工程化注意事项

  1. 密钥管理:使用环境变量(如.env文件)或密钥管理服务,禁止硬编码。
  2. 限流处理:QPS 5,建议在客户端加令牌桶限流,避免程序过快调用触发 429。
  3. 缓存策略:对于 list 模式的分页数据,可设置短时缓存(如 60 秒),减少重复请求。types 模式可缓存更长时间(如 1 小时)因为类型列表变动极低。
  4. 日志与监控:记录每次请求的 URL、耗时、状态码,便于排查问题。
  5. 接口变更:定期检查官方文档(https://apizero.cn/aidocs/riddle)获取更新。
  6. 备用方案:若接口临时不可用,可准备本地谜语库作为降级。

参考文档

  • 官方文档页:https://apizero.cn/aidocs/riddle
  • 原始接口定义:https://apizero.cn/aidocs/riddle/raw.md