概述
智能题库API提供标准化的题库调用接口,支持开发者快速集成题库功能到自己的应用中。所有接口均采用RESTful设计风格,返回JSON格式数据。
基础信息
- 接口域名:https://api.tiku-api.com
- API版本:v1
- 请求方式:GET/POST
- 数据格式:JSON
- 编码格式:UTF-8
接口鉴权
所有API接口调用均需要进行身份验证,目前支持API Key + Signature的鉴权方式。
获取API Key
- 注册并登录平台账号
- 进入「开发者中心」-「应用管理」
- 创建新应用,获取API Key和API Secret
请求头参数
| 参数名 | 是否必填 | 说明 |
|---|---|---|
| Api-Key | 是 | 平台分配的API Key |
| Timestamp | 是 | 当前时间戳(秒) |
| Signature | 是 | 签名串,计算方式见下方 |
签名计算方式
Signature = MD5(Api-Key + Api-Secret + Timestamp)
// Python示例
import hashlib
import time
api_key = "your_api_key"
api_secret = "your_api_secret"
timestamp = str(int(time.time()))
# 计算签名
sign_str = api_key + api_secret + timestamp
signature = hashlib.md5(sign_str.encode()).hexdigest()
print(f"Signature: {signature}")
题库查询接口
接口地址:/v1/question/query
请求方式:POST
请求参数
| 参数名 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| subject | string | 是 | 学科代码(math/english/physics等) |
| grade | string | 是 | 学段代码(primary/junior/senior等) |
| type | string | 否 | 题型(single/blank/essay等) |
| difficulty | int | 否 | 难度(1-简单,2-中等,3-困难) |
| page | int | 否 | 页码,默认1 |
| page_size | int | 否 | 每页数量,默认20,最大100 |
返回示例
{
"code": 0,
"msg": "success",
"data": {
"total": 1250,
"page": 1,
"page_size": 20,
"list": [
{
"id": "q123456",
"content": "计算:2+3×4 = ?",
"subject": "math",
"grade": "primary",
"type": "single",
"difficulty": 2,
"options": [
{"key": "A", "value": "14"},
{"key": "B", "value": "20"},
{"key": "C", "value": "10"},
{"key": "D", "value": "18"}
],
"create_time": "2025-01-15 10:30:00"
},
// 更多题目...
]
}
}
错误码说明
| 错误码 | 说明 | 解决方案 |
|---|---|---|
| 0 | 成功 | - |
| 1001 | API Key不存在 | 检查API Key是否正确 |
| 1002 | 签名验证失败 | 检查签名计算方式和参数 |
| 1003 | 请求超时 | 检查Timestamp是否在有效期内 |
| 2001 | 参数错误 | 检查请求参数是否完整、格式是否正确 |
| 2002 | 暂无数据 | 调整查询条件 |
| 3001 | 调用次数超限 | 升级套餐或联系客服 |
| 5000 | 服务器内部错误 | 联系技术支持 |
调用示例
Python示例
import requests
import hashlib
import time
import json
# 配置信息
API_KEY = "your_api_key"
API_SECRET = "your_api_secret"
BASE_URL = "https://api.tiku-api.com/v1"
# 生成签名
def generate_signature(api_key, api_secret, timestamp):
sign_str = api_key + api_secret + timestamp
return hashlib.md5(sign_str.encode()).hexdigest()
# 题库查询
def query_questions():
timestamp = str(int(time.time()))
signature = generate_signature(API_KEY, API_SECRET, timestamp)
# 请求头
headers = {
"Api-Key": API_KEY,
"Timestamp": timestamp,
"Signature": signature,
"Content-Type": "application/json"
}
# 请求参数
data = {
"subject": "math",
"grade": "primary",
"type": "single",
"difficulty": 2,
"page": 1,
"page_size": 10
}
# 发送请求
response = requests.post(
f"{BASE_URL}/question/query",
headers=headers,
json=data
)
# 处理响应
if response.status_code == 200:
result = response.json()
if result["code"] == 0:
print("查询成功!")
print(f"总数:{result['data']['total']}")
print(f"题目列表:{result['data']['list']}")
else:
print(f"查询失败:{result['msg']}")
else:
print(f"请求失败:{response.status_code}")
if __name__ == "__main__":
query_questions()
Java示例
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class TikuApiClient {
private static final String API_KEY = "your_api_key";
private static final String API_SECRET = "your_api_secret";
private static final String BASE_URL = "https://api.tiku-api.com/v1";
// 生成MD5签名
public static String generateSignature(String apiKey, String apiSecret, String timestamp) {
try {
String signStr = apiKey + apiSecret + timestamp;
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytes = md.digest(signStr.getBytes());
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return "";
}
}
// 题库查询
public static void queryQuestions() {
OkHttpClient client = new OkHttpClient();
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
String signature = generateSignature(API_KEY, API_SECRET, timestamp);
// 请求头
Map params = new HashMap<>();
params.put("subject", "math");
params.put("grade", "primary");
params.put("type", "single");
params.put("difficulty", 2);
params.put("page", 1);
params.put("page_size", 10);
MediaType JSON_TYPE = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON.toJSONString(params), JSON_TYPE);
Request request = new Request.Builder()
.url(BASE_URL + "/question/query")
.addHeader("Api-Key", API_KEY)
.addHeader("Timestamp", timestamp)
.addHeader("Signature", signature)
.post(body)
.build();
try {
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
String responseBody = response.body().string();
System.out.println("查询结果:" + responseBody);
} else {
System.out.println("请求失败:" + response.code());
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
queryQuestions();
}
}