引言
在接入图片鉴黄(NSFW检测)API时,大部分开发者遇到的障碍并非接口本身复杂,而是错误信息含混、参数传递不当、后端选择不匹配等细节问题。本文依据官方文档,从请求构造到响应解析,逐一拆解高频错误场景,并提供可复现的排查步骤。
适用场景
该接口适用于社区图片审核、UGC内容过滤、直播截图审查等场景。支持多种检测后端(本地NudeNet/百度/腾讯/阿里),统一返回decision(block/review/pass)及分类得分。
接口能力边界
- 请求方式:POST
- 地址:
https://v1.apizero.cn/api/image-nsfw - QPS限制:2次/秒
- 图片输入:支持URL或base64,最大尺寸以文档为准(建议单边≤4096px)
- 后端选择:
auto(自动调度)、nudenet(本地)、baidu、tencent、aliyun(云端三方) - 超时范围:3~60秒,默认为空(使用服务端默认值)
请求参数与鉴权
鉴权方式
在请求头中携带X-API-Key。示例如下:
-H "X-API-Key: $APIZERO_API_KEY"若未提供或密钥无效,返回401 Unauthorized。
请求体字段
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
image_url | string | 否(与image_b64二选一) | 图片HTTP(S) URL |
image_b64 | string | 否 | 图片base64编码,可含data:URI前缀 |
backend | string | 否 | 检测后端,默认auto |
timeout | number | 否 | 超时秒数(3~60),空值使用服务端默认 |
注意:
image_url与image_b64必须且只能提供其一,同时提供时以image_url为准。
curl 接入示例
以下是一个直接可用的请求样例(需替换占位API Key和图片地址):
curl -sS \ -X POST \ -H "X-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"image_url": "https://example.com/photo.jpg", "backend": "auto", "timeout": ""}' \ "https://v1.apizero.cn/api/image-nsfw"若使用base64,请求体改为:
{ "image_b64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...", "backend": "nudenet", "timeout": 10 }返回值解读
成功响应(HTTP 200)示例:
{ "code": 200, "desc": "success", "decision": "pass", "label": "normal", "score": 0.8511, "categories": { "normal": 1, "porn": 0, "sexy": 0 }, "backend": "nudenet", "detections": [ { "box": [381, 291, 528, 575], "cls": "FACE_FEMALE", "score": 0.8511 } ], "input": { "source": "https://...", "type": "url", "mime": "image/jpeg", "width": 1080, "height": 1920, "size_bytes": 993377, "sha256": "f9a414bd6925f6c870e18d75252cbd764ce964fb..." }, "elapsed_ms": 115, "raw": { "nudenet": [ { "box": [381, 291, 528, 575], "class": "FACE_FEMALE", "score": 0.8510541915893555 } ] }, "notes": [], "tips": "极数本源 · https://apizero.cn" }关键字段说明
code:业务状态码。200表示成功;其他值(如400、401、500等)对应HTTP状态码。decision:审核结果。pass(通过)、review(人工复审)、block(拦截)。label:语义标签,normal/porn/sexy。categories:三个维度得分(0~1),之和不一定为1。detections:检测框列表(仅NudeNet后端返回,云端可能返回空)。raw:后端原始结果,用于调试。elapsed_ms:整个请求耗时(毫秒)。
常见错误与排查
1. 401 Unauthorized —— 鉴权失败
现象:返回HTTP 401,code可能为401。
原因:
- API Key未在请求头中传递
- API Key无效或已过期
- 请求头键名写错(如
X-API-Key而非X-Api-Key)
排查:确认环境变量$APIZERO_API_KEY是否正确设置;检查头拼写。
2. 400 Bad Request —— 参数错误
现象:HTTP 400,响应中desc可能包含“invalid image_url”或“missing parameter”。
常见原因:
- 未提供
image_url或image_b64 - 提供的URL不可访问(返回非200状态码或内容非图片)
- base64编码错误(如缺少
data:image/...;base64,前缀) timeout值超出3~60范围backend拼写错误(如nudnet)
排查步骤:
- 先用简单curl测试:仅传
image_url,backend留空或auto。 - 检查URL是否可直接在浏览器中打开并显示图片。
- 若使用base64,可用在线工具验证编码正确性。
3. 后端调用错误 —— 返回raw中无数据或desc含异常
现象:HTTP 200,但decision为review或block且无分类分值,或raw字段为空。
原因:
- 云端后端(baidu/tencent/aliyun)超时或网络不可达
- 图片尺寸超过后端限制(例如百度云最大4096px,腾讯云最大10MB)
- 图片内容不符合后端要求(如纯色图、扫描文档被误判)
排查:
- 切换
backend为nudenet,排除网络因素,观察是否正常工作。 - 检查
input.size_bytes是否超过20MB(服务端未明示,但建议≤10MB)。 - 查看
notes字段,部分错误会以字符串形式给出提示。
4. 超时错误 —— HTTP 504 或 请求耗时过长
现象:长时间无响应后返回504 Gateway Timeout,或elapsed_ms超过预期。
原因:
- 图片下载缓慢(源站CDN较差)
- 云端后端响应慢(尤其非高峰时段)
- 设置了过短的
timeout(如3秒)而图片较大
优化:
- 使用CDN或直接上传base64(避免图片下载延迟)
- 设置合理的
timeout,建议10~20秒 - 在
auto模式下,服务端会自动降级到超时更稳定的后端
5.decision含义误读
现象:返回review或block,开发者认为“失败”。
说明:decision是审核建议,并非错误状态。code字段才是真正的业务状态码。即使decision为block,code仍为200表示正常处理完成。
建议:按decision分流:pass直接放行,review入人工队列,block直接拒绝。
6. 图片输入方式选择错误
现象:同时传入image_url和image_b64,结果与预期不符。
规则:当二者都提供时,优先使用image_url。如需使用base64,必须只传image_b64。
7. 跨域/程序调用问题
若在浏览器端直接调用,可能遇到CORS限制。建议通过服务端代理转发。
工程化注意事项
- 重试策略:对于超时(504)或服务端5xx错误,建议指数退避重试,最多3次。
- 后端选择:
auto模式会根据图片特征和网络情况自动选择后端,但若对准确率有特定要求,可固定为nudenet(本地,无外部依赖)或baidu/tencent/aliyun(云端,准确率更高但可能收费)。 - 超时设置:不建议低于5秒;生产环境建议设定为10秒,并结合客户端超时。
- 图片预处理:在发送前对图片进行尺寸缩放(最长边2048px)可降低延迟和失败率。
- 日志记录:记录每次调用的
elapsed_ms、backend、decision及code,便于监控异常趋势。 - 敏感信息处理:API Key不应硬编码;存储在环境变量或密钥管理服务中。
参考文档
- 官方文档页
- 原始接口文档
(以上内容基于API事实卡,所有参数与返回字段均以官方文档为准。)