Appearance
论坛帖子搜索接口
用于根据关键词搜索帖子,支持按分类、板块筛选,可指定搜索范围(标题、内容、标签等),包含分页查询及签名验证机制。
请求地址 GET / POST
http
https://nobase.cn/api/bbs/post_search请求参数
| 参数名 | 位置 | 类型 | 必选 | 说明 |
|---|---|---|---|---|
| appid | query | string | ✅ 是 | 应用唯一标识,从开发者中心获取 |
| keyword | query | string | ✅ 是 | 搜索关键词,不可为空 |
| signature | query | string | ✅ 是 | 应用签名,与后台配置一致,用于验证请求合法性 |
| class | query | string | ❌ 否 | 帖子分类,不填则不限制分类 |
| uid | query | string | ❌ 否 | 板块ID,不填则不限制板块 |
| page | query | int | ❌ 否 | 页码,默认1(第一页) |
| limit | query | int | ❌ 否 | 每页条数,默认10条 |
| search_type | query | string | ❌ 否 | 搜索范围,默认default;可选值:default(标题+内容)、title(仅标题)、content(仅内容)、label(仅标签)、username(仅用户名) |
返回示例
成功响应(搜索到帖子)
json
{
"code": 200,
"msg": "success",
"data": {
"posts": [
{
"id": "3001",
"username": "dev_user",
"icon": "https://example.com/avatar/dev.png",
"nickname": "开发爱好者",
"title": "PHP数据库操作技巧",
"content": "分享几个PHP操作MySQL的实用技巧...",
"post_like": 18,
"post_see": 245,
"comment": 6,
"label": "PHP,数据库",
"classification": "技术",
"uid": "board_tech",
"other": "扩展信息",
"release_time": "2025-10-17 09:15:00",
"up_time": "2025-10-17 10:20:00"
},
// 更多帖子...
],
"pagination": {
"total": 32,
"page": 1,
"limit": 10,
"totalPage": 4
},
"search_info": {
"keyword": "PHP",
"search_type": "default",
"class": "技术",
"uid": "all"
}
}
}失败响应(参数问题)
json
{
"code": 204,
"msg": "fail",
"data": "接口参数错误:缺少appid"
}json
{
"code": 204,
"msg": "fail",
"data": "接口参数错误:缺少搜索关键词keyword"
}失败响应(无匹配结果)
json
{
"code": 404,
"msg": "fail",
"data": "未找到匹配'Java'的帖子数据"
}失败响应(签名/状态异常)
json
{
"code": 402,
"msg": "fail",
"data": "用户访问被限制:签名校验失败!"
}json
{
"code": 404,
"msg": "fail",
"data": "应用审核中!"
}json
{
"code": 407,
"msg": "fail",
"data": "该板块不存在!"
}返回数据结构
| 参数名 | 类型 | 说明 |
|---|---|---|
| code | number | 状态码:200=搜索成功;204=参数缺失/错误;402=签名失败;404=资源不存在/状态异常/无匹配结果;407=板块不存在/应用配置不存在 |
| msg | string | 状态描述:success=成功,fail=失败 |
| data | object/string | 响应数据:成功时为包含搜索结果的对象;失败时为错误原因字符串 |
data.posts 字段说明(帖子列表)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | string | 帖子唯一标识 |
| username | string | 发帖用户账号 |
| icon | string | 用户头像URL |
| nickname | string | 用户昵称 |
| title | string | 帖子标题 |
| content | string | 帖子内容 |
| post_like | number | 帖子点赞数 |
| post_see | number | 帖子浏览量 |
| comment | number | 帖子评论数 |
| label | string | 帖子标签,多标签用逗号分隔 |
| classification | string | 帖子分类 |
| uid | string | 帖子所属板块ID |
| other | string | 附加信息 |
| release_time | string | 发布时间(格式:YYYY-MM-DD HH:MM:SS) |
| up_time | string | 最后更新时间(格式:YYYY-MM-DD HH:MM:SS) |
data.pagination 字段说明(分页信息)
| 字段名 | 类型 | 说明 |
|---|---|---|
| total | number | 匹配搜索条件的帖子总条数 |
| page | number | 当前页码 |
| limit | number | 每页条数 |
| totalPage | number | 总页数(ceil(total/limit)) |
data.search_info 字段说明(搜索条件)
| 字段名 | 类型 | 说明 |
|---|---|---|
| keyword | string | 搜索关键词 |
| search_type | string | 搜索范围类型 |
| class | string | 筛选的分类(all表示不限制) |
| uid | string | 筛选的板块(all表示不限制) |
代码示例
javascript
// 搜索关键词“教程”,限制分类为“技术”
const params = new URLSearchParams({
appid: "your_app_id",
keyword: "教程",
class: "技术",
search_type: "default", // 默认搜索标题+内容
page: 1,
limit: 15,
signature: "your_signature"
});
fetch("https://nobase.cn/api/bbs/post_search", {
method: "POST",
body: params,
headers: { "Content-Type": "application/x-www-form-urlencoded" }
})
.then(res => res.json())
.then(res => {
if (res.code === 200) {
console.log("搜索结果:", res.data.posts);
console.log("分页信息:", res.data.pagination);
console.log("搜索条件:", res.data.search_info);
} else {
console.error("搜索失败:", res.data);
}
});python
import requests
# 搜索标签包含“Python”的帖子,不限制板块和分类
params = {
"appid": "your_app_id",
"keyword": "Python",
"search_type": "label", # 仅搜索标签
"page": 2,
"limit": 10,
"signature": "your_signature"
}
response = requests.get(
"https://nobase.cn/api/bbs/post_search",
params=params,
timeout=8
)
res_data = response.json()
if res_data["code"] == 200:
print(f"找到{res_data['data']['pagination']['total']}条结果:", res_data["data"]["posts"])
else:
print("搜索错误:", res_data["data"])核心逻辑说明
1. 验证流程
- 参数校验:检查
appid、keyword和signature是否存在,缺失则返回204错误; - 应用与开发者校验:通过
appid查询应用信息,验证开发者账号的存在性及匹配性,不存在或不匹配返回404; - 签名校验:结合请求参数及动态获取的开发者标识验证
signature,失败返回402; - 状态校验:
- 开发者账号状态需为“正常”,应用不可处于“停用”或“审核中”状态;
- 开发者VIP未逾期,否则返回逾期提示(如“已逾期(1天)”)。
2. 搜索规则
- 基础筛选:仅搜索状态为“正常”(
state=1)或“直接发布”(state=4)的帖子; - 条件组合:
- 若传递
class,仅返回该分类下的帖子; - 若传递
uid,仅返回该板块下的帖子(需验证板块存在性,否则返回407);
- 若传递
- 搜索范围:根据
search_type决定匹配字段:default:匹配标题或内容(模糊搜索);title:仅匹配标题(模糊搜索);content:仅匹配内容(模糊搜索);label:仅匹配标签(模糊搜索);username:仅匹配发帖用户名(模糊搜索);
- 分页处理:通过
page和limit计算起始位置((page-1)*limit),默认按ID正序排列。
3. 结果返回逻辑
- 成功时返回包含
posts(匹配的帖子列表)、pagination(分页信息)和search_info(搜索条件)的对象; - 无匹配结果时返回“未找到匹配'关键词'的帖子数据”(404状态);
- 帖子列表包含完整信息(所属板块、分类、互动数据等),便于前端展示筛选条件。
注意事项
参数规范
keyword不可为空或仅含空白字符,建议前端做长度限制(如1-50字符);search_type仅支持指定值,传入其他值将自动按default处理;- 分页参数
page和limit需为正整数,否则使用默认值。
搜索性能
- 大范围搜索(不限制
class和uid)可能耗时较长,建议前端添加加载状态提示; - 频繁搜索相同关键词时,可考虑前端缓存结果,减少接口调用。
- 大范围搜索(不限制
模糊搜索规则
- 所有搜索均为模糊匹配(关键词前后自动加通配符),如搜索“PHP”会匹配“PHP教程”“学PHP”等;
- 标签搜索匹配整个标签(如标签“PHP,教程”可匹配关键词“PHP”或“教程”)。
权限限制
- 接口仅返回当前应用及所属开发者下的帖子,无法跨应用搜索;
- 若
uid指定的板块不属于当前应用,将返回“该板块不存在”(407状态)。
扩展说明
search_info字段可用于前端展示当前搜索条件,方便用户调整筛选参数;- 如需精确匹配(而非模糊搜索),需额外开发定制逻辑。

