供第三方开发者集成 AI 搜题能力。基础路径:https://你的域名/api
| 协议 | HTTPS(生产环境建议) |
|---|---|
| 格式 | application/json; charset=utf-8 |
| 编码 | UTF-8 |
成功时返回 code、message、data;失败时无 data。
{
"code": 200,
"message": "success",
"data": { }
}
| HTTP | code | 说明 |
|---|---|---|
| 200 | 200 | 成功 |
| 400 | 400 | 参数错误 |
| 401 | 401 | 未认证 |
| 403 | 403 | 无权限 |
| 429 | 429 | 次数不足 |
| 500 | 500 | 服务器错误 |
对接搜题推荐使用 API Key(用户中心 → API 密钥,32 位十六进制字符串)。
| 方式 | 示例 |
|---|---|
| 请求头(推荐) | X-Api-Key: 你的密钥 |
| 备用请求头 | X-User-Key: 你的密钥 |
| 查询参数 | ?api_key=你的密钥 |
| JSON 体 | {"api_key":"你的密钥", ...} |
| Web 登录 | Authorization: Bearer <64位Token> |
同时提供 Key 与 Token 时,API Key 优先。
无需认证,用于检测服务是否可用。
curl -X POST "https://你的域名/api/ask" \
-H "X-Api-Key: 你的密钥" \
-H "Content-Type: application/json" \
-d '{
"type": "0",
"question": "下列哪项是 PHP 的文件扩展名?",
"options": [".php", ".java", ".py", ".go"],
"provider": "deepseek"
}'
{
"code": 200,
"message": "success",
"data": {
"valid": true,
"answer": ["A"],
"provider": "deepseek",
"provider_name": "DeepSeek",
"model": "deepseek-chat",
"duration_ms": 1234
}
}
AI 调用成功即扣 1 次额度,即使 valid 为 false(答案解析失败)。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| type | string | 否 | 题型,默认 0 |
| question | string | 是 | 题目正文 |
| options | array | 否 | 选项(字符串数组,不含 A/B 前缀) |
| blank_count | int | 否 | 填空题空数,别名 blankCount |
| provider | string | 否 | AI 接口 ID,默认系统配置 |
| model | string | 否 | 模型名称 |
| temperature | float | 否 | 采样温度 |
| max_tokens | int | 否 | 最大输出 token |
| type | 题型 | answer 示例 |
|---|---|---|
| 0 | 单选题 | ["A"] |
| 1 | 多选题 | ["A","C"] |
| 2 | 填空题 | ["答案1","答案2"] |
| 3 | 判断题 | ["true"] 或 ["false"] |
| 4 | 简答题 | ["参考答案"] |
| 5 | 名词解释 | ["解释内容"] |
| 6 | 论述题 | ["论述内容"] |
| 7 | 计算题 | ["计算过程"] |
| 15 | 阅读理解 | 子题数组 |
{
"type": "2",
"question": "中国的首都是____,最大城市之一是____。",
"blank_count": 2
}
import requests
resp = requests.post(
"https://你的域名/api/ask",
headers={"X-Api-Key": "你的密钥"},
json={
"type": "0",
"question": "1+1=?",
"options": ["1", "2", "3", "4"],
"provider": "deepseek",
},
timeout=60,
)
data = resp.json()
if data["code"] != 200:
raise RuntimeError(data["message"])
print(data["data"]["answer"])
const resp = await fetch('https://你的域名/api/ask', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Api-Key': '你的密钥',
},
body: JSON.stringify({
type: '0',
question: '1+1=?',
options: ['1', '2', '3', '4'],
}),
});
const json = await resp.json();
if (json.code !== 200) throw new Error(json.message);
console.log(json.data.answer);
$ch = curl_init('https://你的域名/api/ask');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-Api-Key: 你的密钥',
],
CURLOPT_POSTFIELDS => json_encode([
'type' => '0',
'question' => '1+1=?',
'options' => ['1', '2', '3', '4'],
], JSON_UNESCAPED_UNICODE),
CURLOPT_TIMEOUT => 60,
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);
扣费优先级:生效套餐 → 今日免费次数 → 账户余额。
GET/api/auth/me返回 user(含 quota_used、daily_quota、balance)及 subscription(当前套餐,无则为 null)。
| 接口 | 说明 |
|---|---|
| GET /api/user/plans | 可购套餐(无需登录) |
| GET /api/user/subscription | 当前套餐状态 |
| POST /api/user/plans/{id}/purchase | 购买套餐 |
| GET /api/user/orders | 我的订单 |
| 方法 | 路径 | 认证 | 说明 |
|---|---|---|---|
| POST | /api/auth/register | 否 | 注册 |
| POST | /api/auth/login | 否 | 登录,返回 token 与 api_key |
| POST | /api/auth/logout | Token | 退出 |
| GET | /api/auth/me | Key/Token | 当前用户 |
| GET | /api/user/key | Token | 查看 API Key |
| POST | /api/user/key/reset | Token | 重置 API Key |
| GET | /api/user/logs | Key/Token | 搜题日志(支持 keyword、status、date_from 等筛选) |
| GET | /api/providers | 否 | AI 接口列表 |
POST /api/auth/login
{
"username": "demo_user",
"password": "123456"
}
常用 provider ID:
| provider | 名称 |
|---|---|
| deepseek | DeepSeek |
| qwen-dashscope | 通义千问 |
| zhipu-glm | 智谱 GLM |
| kimi | Kimi |
| openai | OpenAI |
| anthropic | Anthropic |
401:检查 API Key 是否正确、用户是否被封禁429:次数不足或套餐 IP 超限,引导购买套餐400:检查 question、options 等参数500:AI 服务异常,可有限重试(建议指数退避)docs/API.md