news 2026/9/18 9:34:04

watermarks-remover HTTP API速查手册:接入/inspect、/clean、/detect端点到你的产品(附curl与OpenAPI示例)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
watermarks-remover HTTP API速查手册:接入/inspect、/clean、/detect端点到你的产品(附curl与OpenAPI示例)

watermarks-remover HTTP API速查手册:接入/inspect、/clean、/detect端点到你的产品(附curl与OpenAPI示例)

【免费下载链接】watermarks-removerA privacy-first app that strips AI watermarks from content you own.项目地址: https://gitcode.com/gh_mirrors/wa/watermarks-remover

watermarks-remover 是一个隐私优先的 AI 水印去除工具,能把文本、图片和文件中的 AI 来源标记(隐形 Unicode、C2PA/EXIF/XMP 元数据等)从你拥有的内容中剥离。它的清洗管线通过一个仅依赖 Python 标准库的 HTTP 服务对外提供——你的产品只需发几个 JSON 请求,就能接入完整的检查、检测与清洗能力,无需安装任何依赖。

本文是一份速查手册:3 个核心端点/inspect/clean/detect的请求格式、curl 示例、批量接口与 OpenAPI 规范,全部一次讲清。


一键启动:3 种方式把服务跑起来

服务入口是 service/scripts/server.py,默认监听http://127.0.0.1:8765(仅回环地址,面向可信网络设计)。

方式一:直接运行(Python 3.10+,零依赖)

python3 service/scripts/server.py --host 127.0.0.1 --port 8765 # 或者用 Makefile 目标:make serve

方式二:Docker 核心镜像(预装 exiftool / qpdf / c2patool)

docker run --rm -p 127.0.0.1:8765:8765 --read-only --tmpfs /tmp watermarks-remover

方式三:docker compose(可扩展检测器与重型后端)

docker compose up -d # 仅核心服务 docker compose --profile harness up -d # + MarkLLM / MarkDiffusion

compose 栈定义见 compose.yaml,核心镜像构建见 service/Dockerfile。启动后先探活:

curl -s "http://127.0.0.1:8765/health" # {"ok": true, "version": "..."}

端点速查表:9 个路由一览

方法路径作用关键返回
GET/health探活 + 版本okversion
GET/capabilities查询可用的可选工具与后端toolsscorerspixel_backends
GET/openapi.json动态生成的 OpenAPI 3.0.3 规范完整契约文档
POST/inspect只检查,不修改文件kindsuspiciousreport
POST/detect运行水印检测器detections
POST/clean清洗文件,返回清洗后字节cleaned(base64)、report
POST/inspect/batch批量检查(默认 ≤50 个文件)results[]
POST/detect/batch批量检测results[]
POST/clean/batch批量清洗results[]

💡所有 POST 端点共用同一请求格式:文件以 base64 编码放进file字段,name字段提供原始文件名——服务先按扩展名、再按魔数(magic bytes)自动路由到文本 / 图片 / 容器 / 音视频管线,返回的kind取值为text/image/container/av(无法识别时为unknown)。


/inspect 端点:只读体检,不改动文件

适合在入库、上传前做一次"AI 来源体检"。文本会附带统计风格(stylometry)评分,suspicious字段给出是否可疑的综合判断:

WM="http://127.0.0.1:8765" curl -s -X POST "$WM/inspect" -H 'Content-Type: application/json' \ -d "{\"file\": \"$(base64 < shot.png | tr -d '\n')\", \"name\": \"shot.png\"}"

响应示例(结构):

{ "ok": true, "kind": "image", "suspicious": true, "report": { "...": "各项发现(C2PA、AI 元数据、统计评分等)" } }

⚠️ 注意:/inspect支持可选的"detect": true标志,用于追加已配置的水印检测器结果——它可能调用外部 API 并把文本发送出去,因此是显式开启的选项。


/clean 端点:一键清洗,返回清洗后的文件

这是最核心的端点:传入 base64 文件,返回清洗后的 base64 字节 + 一份操作报告(做了哪些动作、统计数量)。

curl -s -X POST "$WM/clean" -H 'Content-Type: application/json' \ -d "{\"file\": \"$(base64 < notes.md | tr -d '\n')\", \"name\": \"notes.md\"}" # 响应中 "cleaned" 字段即清洗后的 base64 内容

/clean 的可选参数(options)

完整白名单定义在 service/scripts/server.py#L86-L96——未在白名单中的选项会直接被拒绝(400),不会静默忽略:

选项类型用途
nfkcboolean启用 NFKC 归一化清洗
aggressive_homoglyphsboolean激进清理同形字符
keep_non_ai_metadataboolean保留非 AI 元数据(图片/音视频)
strip_all_metadataboolean显式控制是否剥离全部元数据
also_layer_a_textboolean容器内文本同时做 Unicode 层(Layer A)清洗
remove_pixelstringctrlregen/diffusion,像素级水印移除(需外部后端)
detect_before/detect_afterboolean清洗前后各跑一次检测器,量化"洗掉了什么"
deep_imagesstringauto/always/lossless/never,处理 PDF 内嵌图片里的元数据

一个带选项的实际请求(清洗前后对比检测):

curl -s -X POST "$WM/clean" -H 'Content-Type: application/json' \ -d "{\"file\": \"$(base64 < shot.png | tr -d '\n')\", \"name\": \"shot.png\", \"options\": {\"detect_before\": true, \"detect_after\": true}}"

/detect 端点:只跑检测器,输出水印检测报告

检测与清洗是独立步骤,服务默认绝不调用任何供应商 API。/detect按文件类型分发:

  • 文本→ 已配置的文本水印检测器 + 统计风格评分
  • 图片→ SynthID 像素评分(需配置评分器)
  • 音视频 / 容器→ 附带检查报告
curl -s -X POST "$WM/detect" -H 'Content-Type: application/json' \ -d "{\"file\": \"$(base64 < draft.txt | tr -d '\n')\", \"name\": \"draft.txt\"}" # 响应: {"ok": true, "kind": "text", "detections": [ ... ]}

💡 检测器是"失败即软降级"(fail-soft)设计:未配置、超时或出错的检测器会返回{"available": false, "error": ...}不会阻塞清洗流程。先用GET /capabilities查看当前部署里有哪些检测器可用:

curl -s "$WM/capabilities" | python3 -m json.tool

批量端点:一次请求处理最多 50 个文件

/inspect/batch/detect/batch/clean/batch把单文件管线包在一个files数组里,默认上限 50 个(可用环境变量WATERMARKS_MAX_BATCH_FILES调整):

curl -s -X POST "$WM/clean/batch" -H 'Content-Type: application/json' \ -d '{"files": [ {"file": "SGVsbG8=", "name": "a.md"}, {"file": "V29ybGQ=", "name": "b.txt"}]}'

⚠️ 批量请求的关键特性:单个文件的失败(base64 损坏、未知选项、格式不识别)只体现在该条目的"ok": false+error字符串里,绝不中断整批处理——这是 server.py 的_batch_items明确保证的行为,非常适合对用户上传做并发清洗。


OpenAPI 规范:/openapi.json 随代码自动生成

这是本服务最值得称道的设计:GET /openapi.json返回的 OpenAPI 3.0.3 文档是从路由表 + 运行时配置动态生成的(见 server.py#L190-L25 注释与openapi_spec()实现),包含版本、当前允许的全部 options、认证要求,永远不会与实际端点漂移

# 拉取契约,导入 Postman / Swagger Editor 即可生成客户端 curl -s "$WM/openapi.json"

🎁 附带福利:当服务端配置了 API key 时,规范里会自动加入bearerAuth安全方案;CI 用openapi-spec-validator持续校验其合法性。


认证、安全与错误码速查

Bearer 认证:设置环境变量WATERMARKS_SERVER_API_KEY后,所有请求都必须携带:

curl -s -X POST "$WM/clean" \ -H "Authorization: Bearer $WATERMARKS_SERVER_API_KEY" \ -H 'Content-Type: application/json' -d '...'

安全默认值:默认仅绑定回环地址(--host覆盖并打印警告);JSON 请求体有大小上限(超限返回 413);客户端文件名会被安全化,杜绝路径穿越。对外暴露时请经反向代理。

错误码速查

状态码含义常见原因
400请求不合法base64 损坏、缺少file字段、unknown option(选项不在白名单)、deep_images取值错误
401认证失败缺少或错误的Authorization: Bearer <key>
404路径不存在打错端点
413请求体过大超过 JSON 信封大小上限
500内部错误服务端异常(响应体只含internal error,细节见服务日志)

排错时的可靠参考是 HTTP 服务测试套件 tests/test_http_server.py——每个端点的成功与失败路径都有对应用例,行为以它为准。


快速上手清单

  1. make servedocker run起服务,/health探活
  2. GET /capabilities确认本机可用的检测器与工具
  3. 上传前用/inspect体检,suspicious: true再走/clean
  4. 清洗前后想留证据,加"detect_before": true, "detect_after": true
  5. 批量场景用/clean/batch,逐条检查results[].ok
  6. 需要生成客户端?/openapi.json拉走即可

⚖️ 免责提示:watermarks-remover 面向你拥有或获授权处理的内容,用于隐私与卫生目的。统计型文本水印的去除是尽力而为(best-effort),报告中的"已验证移除"与"尽力而为"项请以report字段为准。

延伸阅读

  • 服务入口源码:service/scripts/server.py
  • 部署方案(CLI + API in Docker):docs/plans/ideas/deployment-docker-cli-api.md
  • HTTP 服务行为测试:tests/test_http_server.py
  • 本地自动启动服务(Windows):docs/windows-autostart.md

【免费下载链接】watermarks-removerA privacy-first app that strips AI watermarks from content you own.项目地址: https://gitcode.com/gh_mirrors/wa/watermarks-remover

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 9:33:18

Spark Streaming实训总结:DStream、Kafka与窗口计算核心解析

刚把“头歌Spark Streaming”这套实训完整跑通的那一刻&#xff0c;我最大的感受不是“我学会实时计算了”&#xff0c;而是“以前对DStream的理解简直是半吊子”。实训里每一道关卡都在逼你面对真实的问题&#xff1a;Kafka的offset怎么管理、窗口为什么不能乱设、task序列化为…

作者头像 李华
网站建设 2026/9/18 9:32:58

浏览器插件开发到部署:Manifest V3 打包上架与内网分发实战

浏览器插件这个方向&#xff0c;我从 Manifest V2 一路写到现在&#xff0c;手里攒下来的小工具有二十多个&#xff0c;有自己用的&#xff0c;也有给团队内部做的。浏览器插件的开发门槛其实不高&#xff0c;一个 manifest.json 加上几个 JS 文件就能跑起来&#xff0c;但真正…

作者头像 李华
网站建设 2026/9/18 9:32:43

AI服务器PCIe线缆选型:OCuLink、SFF-8644与CopprLink全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 9:32:24

基于74LS190与JK触发器的交通灯硬件状态机设计

简介&#xff1a;本资源是一份面向电子类专业本科生及数字电路初学者的课程设计实践资料&#xff0c;聚焦交通信号灯控制器的数字逻辑电路实现与Multisim仿真验证。内容完整覆盖十字路口双方向&#xff08;东西/南北&#xff09;交替通行控制&#xff1a;45秒绿灯、5秒黄灯闪烁…

作者头像 李华
网站建设 2026/9/18 9:30:30

Flutter跨平台开发实战:性能优化与混合架构设计

1. 跨平台开发的现状与挑战移动应用开发领域长期面临着"双平台困境"——iOS和Android两大生态系统的技术栈差异&#xff0c;导致企业需要维护两套代码库。根据2022年开发者调查报告&#xff0c;超过78%的团队在跨平台开发时遭遇过以下典型问题&#xff1a;人力成本翻…

作者头像 李华
网站建设 2026/9/18 9:30:00

pyasc 反正弦算子 asin 接口全解析:从 Python 调用到 Ascend C 代码发射

pyasc 反正弦算子 asin 接口全解析&#xff1a;从 Python 调用到 Ascend C 代码发射 【免费下载链接】pyasc 本项目为Python用户提供算子编程接口&#xff0c;支持在昇腾AI处理器上加速计算&#xff0c;接口与Ascend C一一对应并遵守Python原生语法。 项目地址: https://gitc…

作者头像 李华