1. 业务场景
1.1 摄像头管理
(摄像头参数更复杂,建议参考1.2,接口调用视频流类型相对简单)
1.1.1 添加摄像头
接口调用顺序:2.1 -> 2.14 -> 2.4
说明:
2.1:检测是否在线,获取图像长宽参数
2.14:查询算法名称,然后根据算法名称获取算法配置文件,算法配置文件中包含算法参数,详见2.4请求参数说明
2.4:保存添加的摄像头数据
1.1.2 查询摄像头
接口调用顺序:2.7
1.1.3 编辑摄像头
接口调用顺序:2.7 -> 2.10 -> 2.5
说明:
2.7:获取摄像头ID
2.10:取消订阅
2.5:保存编辑后的信息
1.1.4 检测摄像头是否在线
接口调用顺序:2.7 -> 2.5
说明:
2.7:获取摄像头ID
2.5:能正常获取到流信息表示在线
1.1.5 抓拍摄像头图像
接口调用顺序:2.7 -> 2.2
说明:
2.7:获取摄像头ID
2.2:获取base64图片
1.1.6 删除摄像头
接口调用顺序:2.7 -> 2.6
说明:
2.7:获取摄像头ID
2.6:删除
1.1.7 启用/停用摄像头
接口调用顺序:2.7 -> 2.10 -> 2.5
说明:
2.7:获取摄像头ID
2.10:取消订阅
2.5:保存摄像头启用/停用状态
1.1.8 修改排序
接口调用顺序:2.7 -> 2.8
说明:
2.7:获取摄像头ID
2.8:修改排序
1.2 视频流管理
视频流管理前端示例代码(点击此处跳转)
1.2.1 添加视频流
接口调用顺序:2.1 -> 2.14 -> 2.4
说明:
2.1:检测是否在线,获取图像长宽参数
2.14:查询算法名称,然后根据算法名称获取算法配置文件,算法配置文件中包含算法参数,详见2.4请求参数说明
2.4:保存添加的视频流数据
1.2.2 查询视频流
接口调用顺序:2.7
1.2.3 编辑视频流
接口调用顺序:2.7 -> 2.10 -> 2.5
说明:
2.7:获取视频流ID
2.10:取消订阅
2.5:保存编辑后的信息
1.2.4 检测视频流是否在线
接口调用顺序:2.7 -> 2.5
说明:
2.7:获取视频流ID
2.2:能正常获取到流信息表示在线
1.2.5 抓拍视频流图像
接口调用顺序:2.7 -> 2.2
说明:
2.7:获取视频流ID
2.2:获取base64图片
1.2.6 删除视频流
接口调用顺序:2.7 -> 2.6
说明:
2.7:获取视频流ID
2.6:删除
1.2.7 启用/停用视频流
接口调用顺序:2.7 -> 2.10 -> 2.5
说明:
2.7:获取视频流ID
2.10:取消订阅
2.5:保存视频流启用/停用状态
1.2.8 修改排序
接口调用顺序:2.8
说明:
2.7:获取视频流ID
2.8:修改排序
1.3 视频文件管理(建议直接从界面上传文件测试)
1.3.1 添加视频文件
接口调用顺序:2.11-> 2.12 -> 2.1 -> 2.14 -> 2.4
说明:
2.11:上传文件
2.12:获取流地址
2.1:检测是否在线,获取图像长宽参数
2.14:查询算法名称,然后根据算法名称获取算法配置文件,算法配置文件中包含算法参数,详见2.4请求参数说明
2.4:保存添加的视频文件数据
1.3.2 查询视频文件
接口调用顺序:2.7
1.3.3 编辑视频文件
接口调用顺序:2.7 -> 2.10 -> 2.5
说明:
2.7:获取视频文件ID
2.10:取消订阅
2.5:保存编辑后的信息
1.3.4 检测视频文件是否在线
接口调用顺序:2.5
1.3.5 抓拍视频文件图像
接口调用顺序:2.7 -> 2.12 -> 2.2
说明:
2.7:获取摄像头ID
2.12:文件转为视频流
2.2:获取base64图片
1.3.6 删除视频文件
接口调用顺序:2.7 -> 2.6
说明:
2.7:获取视频文件ID
2.6:删除
1.3.7 下载视频文件
接口调用顺序:2.7 -> 2.13
说明:
2.7:获取视频文件ID
2.13:获取视频文件路径
通过http://盒子IP/staticdata/路径,即可获取视频文件
1.3.8 重新播放视频文件
接口调用顺序:2.7 -> 2.12
说明:
2.7:获取视频文件ID
2.12:视频文件转为视频流
1.3.9 启用/停用视频文件
接口调用顺序:2.7 -> 2.10 -> 2.5
说明:
2.7:获取视频文件ID
2.10:取消订阅
2.5:保存视频文件启用/停用状态
1.3.10 修改排序
接口调用顺序:2.7 -> 2.8
说明:
2.7:获取视频文件ID
2.8:修改排序
2. 原子接口
2.1. 检测是否在线
- 接口功能描述:新增数据源时需要传入告警图片大小、编码格式,需要先通过此接口获取;
- 接口路径:[GET]http://盒子IP:9089/ks/stream/attr;
- 请求参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
stream | String | 是 | 视频流地址 |
rtsp_transport | String | 否 | 可选参数,缺省值为“tcp”,建议与新增数据源接口中的参数info-> rtsp_transport的值保持一致 |
表. 请求参数
- 请求示例;
项目 | 详情 |
---|---|
请求格式 | Query String |
stream | rtsp://xxx/main/av\_stream |
rtsp_transport | tcp |
表. 请求参数
- 响应参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
error_code | Int | 是 | 返回响应码 0: 成功 -1: 客户端错误 -2: 服务端错误 |
message | String | 是 | 返回响应信息 |
data | Object | 是 | 如果数据源在线返回数据源信息,如果数据源不在线,返回空对象 |
- 响应示例。
项目 | 详情 |
---|---|
报文格式 | JSON |
报文内容 | { "data": { "codec": "h265", "fps": 25, "size": [1280, 720] }, "error_code": 0, "message": { "zh": "获取流状态成功!", "en": "Get stream status successful!" } } |
2.2. 获取数据源画面
- 接口功能描述:获取数据源画面,绘制检测区域时调用获取;
- 接口路径:[GET]http://盒子IP:9089/ks/stream/image;
- 请求参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
stream | String | 是 | 视频流地址 |
draw_size | String | 是 | 通过检测是否在线接口获取到的size,如[1280,720] |
表. 请求参数
- 请求示例;
项目 | 详情 |
---|---|
请求格式 | Query String |
stream | rtsp://xxx/main/av\_stream |
draw_size | [1280,720] |
- 响应参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
error_code | Int | 是 | 返回响应码 0: 成功 -1: 客户端错误 -2: 服务端错误 |
message | String | 是 | 返回响应信息 |
data | String | 是 | 返回base64图片数据 |
- 响应示例。
项目 | 详情 |
---|---|
报文格式 | JSON |
报文内容 | { "data": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQ…", "error_code": 0, "message": { "zh": "获取图像成功!", "en": "Get image successful!" } } |
2.3. onvif
- 接口功能描述:获取数据源信息,如品牌、码流地址等;
- 接口路径:[GET]http://盒子IP:9091/ks/source/onvif;
- 请求参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
username | String | 是 | 数据源onvif用户 |
password | String | 是 | 数据源onvif密码 |
ip | String | 是 | 数据源IP地址 |
port | Int | 是 | onvif协议端口,默认80 |
表. 请求参数
- 请求示例;
项目 | 详情 |
---|---|
请求格式 | Query String |
username | admin |
password | Admin123 |
ip | 192.168.1.201 |
port | 80 |
- 响应参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
error_code | Int | 是 | 返回响应码 0: 成功 -1: 客户端错误 -2: 服务端错误 |
message | String | 是 | 返回响应信息 |
data | Null/Object | 是 | null |
- 响应示例。
项目 | 详情 |
---|---|
报文格式 | JSON |
报文内容 | { "data": { ... }, "error_code": 0, "message": { "zh": "通过onvif获取摄像头信息成功!", "en": "Get camera information by onvif successful!" } } |
2.4. 新增数据源
- 接口功能描述:新增数据源并配置相关算法、检测区域等;
- 接口路径:[POST] http://盒子IP:9091/ks/source;
- 请求参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
id | String | 否 | 数据源标识,可以传,不传则自动生成。注意:当协议为gb28181时,必须传id,且id为SIP用户名,比如:34020000002000000002 |
type | String | 是 | 摄像头:camera 视频流:stream 视频文件:video |
desc | String | 是 | 描述,注意同一个盒子不同数据源描述不可重复 |
ipv4 | String | 否 | ip地址 |
stream | String | 是 | 流地址 |
info | Object | 否 | 当type为stream时参数格式如下: { "rtsp_transport": "tcp" } |
draw_size | Array | 是 | 告警图片大小[宽, 高],检测是否在线接口返回的size |
encoding | String | 是 | h264或h265,检测是否在线接口返回的codec |
video_record | Int | 是 | 是否录制视频,1录制,0不录制 |
alg | Object | 否 | 获取算法配置文件(json格式),并填入配置文件中basicParams字段的内容,basicParams字段中给出参数的格式以及默认值。获取算法配置文件的接口(GET):http://盒子IP:9092/algsjson/算法名称.json,其中算法名称为算法英文名称,可通过算法列表接口获取算法名称。 时间布控计划参数在算法配置中,示例: { "helmet": { // 此处省略其他配置,具体配置请参考json文件中basicParams字段 //布控计划 "plan": { "1": [[0, 86400]], "2": [[0, 86400]], "3": [[0, 86400]], "4": [[0, 86400]], "5": [[0, 86400]], "6": [[0, 86400]], "7": [[0, 86400]] } } |
表. 请求参数
- 请求示例;
项目 | 详情 |
---|---|
请求格式 | JSON |
报文内容 | { "type": "camera", "desc": "描述", "ipv4": "192.168.1.33", "stream": "rtsp://admin:Admin123@192.168.1.252:554/h264/ch1/main/av\_stream", "info": { "rtsp_transport": "tcp" }, "draw_size": [1280, 720], "encoding": "h264", "video_record": 0, "alg": { "helmet": { "alert_window": { "interval": 5, "length": 5, "threshold": 3, "type": "interval_threshold_window" }, "bbox": { "polygons": [{ "id": "27d590b2-3bc4-4bfb", "name": "test", "polygon": [ [391, 598], [403, 451], [711, 440], [650, 591] ] } ] }, //布控计划 "plan": { "1": [[0, 86400]], "2": [[0, 86400]], "3": [[0, 86400]], "4": [[0, 86400]], "5": [[0, 86400]], "6": [[0, 86400]], "7": [[0, 86400]] }, "hazard_level": "", "alg_type": "general", "model_args": { "helmet_classify": { "conf_thres": 0.7 }, "helmet": { "conf_thres": 0.35 }, "person": { "conf_thres": 0.6 } }, "reserved_args": { "ch_name": "测试算法", "sound_text": "测试检测报警" } } } } |
- 响应参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
error_code | Int | 是 | 返回响应码 0: 成功 -1: 客户端错误 -2: 服务端错误 |
message | String | 是 | 返回响应信息 |
data | Null/Object | 是 | null |
- 响应示例;
项目 | 详情 |
---|---|
报文格式 | JSON |
报文内容 | { "data": null, "error_code": 0, "message": { "zh": "添加数据源成功!", "en": "Add source successful!" } } |
2.5. 编辑数据源
- 接口功能描述:编辑数据源信息;
- 接口路径:[PUT] http://盒子IP:9091/ks/source;
- 请求参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
id | String | 是 | 参考“新增数据源”章节 |
type | String | 否 | 参考“新增数据源”章节 |
desc | String | 否 | 参考“新增数据源”章节 |
ipv4 | String | 否 | 参考“新增数据源”章节 |
stream | String | 否 | 参考“新增数据源”章节 |
info | Object | 否 | 参考“新增数据源”章节 |
draw_size | Array | 否 | 参考“新增数据源”章节 |
alg | Object | 否 | 参考“新增数据源”章节 |
video_record | Number | 否 | 参考“新增数据源”章节 |
status | Bool | 否 | -1:停用,1:启用 |
表. 请求参数
- 请求示例;
项目 | 详情 |
---|---|
请求格式 | JSON |
报文内容 | 参考“新增数据源”章节 |
- 响应参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
error_code | Int | 是 | 返回响应码 0: 成功 -1:失败 |
message | String | 是 | 返回响应信息 |
data | Object | 是 | 返回数据 |
- 响应示例。
项目 | 详情 |
---|---|
报文格式 | JSON |
报文内容 | { "data": null, "error_code": 0, "message": { "zh": "更新数据源成功!", "en": "Update source successful!" } } |
2.6. 删除数据源
- 接口功能描述:删除数据源;
- 接口路径:[DELETE] http://盒子IP:9091/ks/source;
- 请求参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
id | String | 是 | 数据源ID |
表. 请求参数
- 请求示例;
项目 | 详情 |
---|---|
请求格式 | JSON |
报文格式 | { "id": "65a78309522e4b4eec7605e0" } |
- 响应参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
error_code | Int | 是 | 返回响应码 0: 成功 -1: 客户端错误 -2: 服务端错误 |
message | String | 是 | 返回响应信息 |
data | Object | 是 | 返回数据 |
- 响应示例;
项目 | 详情 |
---|---|
报文格式 | JSON |
报文内容 | { "data": null, "error_code": 0, "message": { "zh": "删除数据源成功!", "en": "Delete source successful!" } } |
2.7. 查询数据源
- 接口功能描述:查询数据源,不传参表示查询所有数据源;
- 接口路径:[GET] http://盒子IP:9091/ks/source;
- 请求参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
id | String | 否 | 数据源ID |
表. 请求参数
- 响应参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
error_code | Int | 是 | 返回响应码 0: 成功 -1: 客户端错误 -2: 服务端错误 |
message | String | 是 | 返回响应信息 |
data | Object | 是 | 返回数据 |
- 响应示例;
项目 | 详情 |
---|---|
报文格式 | JSON |
报文内容 | { "error_code": 0, "message": { "zh": "查询数据源成功!", "en": "Query source successful!" }, "data": [ { "id": "66dec1855dc58a0b1dd9ed5d", "index": 1, "ipv4": "", "desc": "vivie", "type": "stream", "encoding": "h264", "info": "{\"rtsp_transport\": \"tcp\"}", "stream": "rtmp://192.168.1.68/live/vivie", "infer_size": 640, "draw_size": [ 1280, 720 ], "alg": { "car_counting": { "reserved_args": { "ch_name": "车辆计数", "sound_text": "车辆计数告警", "strategy": "center" }, "alert_window": { "type": "threshold_window", "length": 1, "threshold": 1 }, "bbox": { "polygons": [], "lines": [ { "id": "line_34657b8a-8edc-4c02-80ef-a3d5707456d6", "name": "A", "line": [ [25,393], [1216,390] ], "direction": "u+", "action": { "count": "统计" } } ] }, "plan": { "1": [[0,86399]], "2": [[0,86399]], "3": [[0,86399]], "4": [[0,86399]], "5": [[0,86399]], "6": [[0,86399]], "7": [[0,86399]] }, "hazard_level": "", "alg_type": "cross_line_counting", "model_args": { "common": { "conf_thres": 0.5 } } } }, "video_record": 0, "status": 1 } ] } |
2.8. 修改数据源排序
- 接口功能描述:修改数据源排序,用于控制界面显示数据源的顺序;
- 接口路径:[PUT] http://盒子IP:9091/ks/source/index;
- 请求参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
id | String | 是 | 数据源ID |
offset | Int | 是 | 偏移量,-1表示向上偏移一位,1表示向下偏移一位 |
表. 请求参数
- 响应参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
error_code | Int | 是 | 返回响应码 0: 成功 -1: 客户端错误 -2: 服务端错误 |
message | String | 是 | 返回响应信息 |
data | Object | 是 | 返回数据 |
- 响应示例;
项目 | 详情 |
---|---|
报文格式 | JSON |
报文内容 |
2.9. 订阅实时视频流
获取视频流播放前端示例代码(点击此处跳转)
- 接口功能描述:订阅实时画面,获取实时画面播放地址;
- 接口路径:[GET] http://盒子IP:9089/ks/stream/live/subscribe;
- 请求参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
source_id | String | 是 | 数据源ID |
表. 请求参数
- 请求示例;
项目 | 详情 |
---|---|
请求格式 | Query String |
source_id | 6593d066522e4b1f0c6b95f6 |
- 响应参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
error_code | Int | 是 | 返回响应码 0: 成功 -1: 客户端错误 -2: 服务端错误 |
message | String | 是 | 返回响应信息 |
data | Object | 是 | 返回视频流地址 |
- 响应示例;
项目 | 详情 |
---|---|
报文格式 | JSON |
报文内容 | { "data": "webrtc://192.168.1.88/live/d847a577-3e04-42bd-8cb9-c630b5dfbfc8/65ae0cc0522e4b4c6fee314d", "error_code": 0, "message": { "zh": "订阅实时视频流成功!", "en": "Subscribe stream successful!" } } |
2.10. 取消订阅实时视频流
- 接口功能描述:取消订阅实时画面;
- 调用时机:调用编辑数据源接口之前调用此接口;
- 接口路径:[GET] http://盒子IP:9089/ks/stream/live/unsubscribe;
- 请求参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
source_ids | Array | 是 | 数据源ID数组 |
表. 请求参数
- 请求示例;
项目 | 详情 |
---|---|
请求格式 | Query String |
source_ids | ["6593d066522e4b1f0c6b95f6"] |
- 响应参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
error_code | Int | 是 | 返回响应码 0: 成功 -1: 客户端错误 -2: 服务端错误 |
message | String | 是 | 返回响应信息 |
data | Object | 是 | 返回数据 |
- 响应示例
项目 | 详情 |
---|---|
报文格式 | JSON |
报文内容 | { "data": { "65ae0cc0522e4b4c6fee314d": true }, "error_code": 0, "message": { "zh": "取消订阅实时视频流成功!", "en": "Unsubscribe stream successful!" } } |
2.11. 上传文件
- 接口功能描述:上传mp4文件;
- 调用时机:选择mp4文件后,先上传文件;
- 接口路径:[POST] http://盒子IP:9091/ks/source/video;
- 请求参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
video | File | 是 | mp4视频文件 |
表. 请求参数
- 请求示例;
项目 | 详情 |
---|---|
请求格式 | Form Data |
video | (binary) |
- 响应参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
error_code | Int | 是 | 返回响应码 0: 成功 -1: 客户端错误 -2: 服务端错误 |
message | String | 是 | 返回响应信息 |
data | String | 是 | 返回视频ID |
- 响应示例
项目 | 详情 |
---|---|
报文格式 | JSON |
报文内容 | { "data": "68820b101271cb2f45f465bc", "error_code": 0, "message": { "zh": "上传离线视频成功!", "en": "Upload offline video successful!" } } |
2.12. 视频文件转为流地址
- 接口功能描述:视频文件转为流地址;
- 调用时机:上传文件后调用,用于生成流地址;
- 接口路径:[GET] http://盒子IP:9089/ks/stream/video;
- 请求参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
source_id | String | 是 | 数据源ID数组 |
表. 请求参数
- 请求示例;
项目 | 详情 |
---|---|
请求格式 | Query String |
source_id | 68820b101271cb2f45f465bc |
- 响应参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
error_code | Int | 是 | 返回响应码 0: 成功 -1: 客户端错误 -2: 服务端错误 |
message | String | 是 | 返回响应信息 |
data | String | 是 | 流地址 |
- 响应示例
项目 | 详情 |
---|---|
报文格式 | JSON |
报文内容 | { "data": "rtmp://127.0.0.1:1935/live/98effa5a-79f7-4e52-ad6e-d7b034effd4f/68820b101271cb2f45f465bc/video", "error_code": 0, "message": { "zh": "获取离线视频流成功!", "en": "Get offline video stream successful!" } } |
2.13. 获取视频文件路径地址
- 接口功能描述:视频文件转为流地址;
- 调用时机:上传文件后调用,用于生成流地址;
- 接口路径:[GET] http://盒子IP:9091/ks/source/video;
- 请求参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
id | String | 是 | 视频文件ID |
表. 请求参数
- 请求示例;
项目 | 详情 |
---|---|
请求格式 | Query String |
id | 68820b101271cb2f45f465bc |
- 响应参数说明;
参数名称 | 数据类型 | 是否必须 | 说明 |
---|---|---|---|
error_code | Int | 是 | 返回响应码 0: 成功 -1: 客户端错误 -2: 服务端错误 |
message | String | 是 | 返回响应信息 |
data | String | 是 | 文件所在路径 |
- 响应示例
项目 | 详情 |
---|---|
报文格式 | JSON |
报文内容 | { "data": "/home/ema/ks/ks968/data/source/video/684abd7b1271cb0b289c7d6a.mp4", "error_code": 0, "message": { "zh": "下载离线视频成功!", "en": "Download offline video successful!" } } |
2.14. 算法查询
- 接口功能描述:对盒子算法查询;
- 接口路径:[GET] http://盒子IP:9091/ks/alg;
- 请求参数说明:无
- 请求示例;
项目 | 详情 |
---|---|
请求格式 | Query String |
- 响应参数说明;
参数名称 | 数据类型 | 说明 |
---|---|---|
error_code | Int | 返回响应码 0: 成功 -1: 客户端错误 -2: 服务端错误 |
message | String | 返回响应信息 |
data | Object | 返回数据,具体字段看下发接口 |
- 响应示例。
项目 | 详情 |
---|---|
报文格式 | JSON |
报文内容 | { "data": [ { "id": 2, "name": "car_misplaced", "ch_name": "车辆违停", "desc": "适用于园区、街道场景车辆违停识别;支持轿车、卡车、公交车识别;需标记违停区域,并可设置多个违停区域;画面清晰,可辨别车辆;车辆目标不小于画面大小5%;识别距离小于30m最佳(200万@6mm);敏感度值越小,检测越灵敏", "group_name": "车辆管理", "model": "{\"common\": {\"ch_name\": \"车辆检测\", \"label\": {\"class2label\": {\"2\": \"car\", \"7\": \"truck\", \"5\": \"bus\"}, \"label_map\": {\"car\": \"小轿车\", \"truck\": \"货车\", \"bus\": \"公交车\"}}}}", "alert_label": "[]", "process_time": 20, "version": "v6.0" } ], "error_code": 0, "message": { "zh": "查询算法成功!", "en": "Query algorithm successful!" } } |
真诚点赞 诚不我欺
回复