提取链接去水印视频
meowload-api-service 是 FunClaw 对外开放的 MeowLoad 媒体提取能力。调用方只需要申请这一个 capabilityKey,再通过 input.action 选择具体业务动作。
这条能力是同步 data_service:调用成功时会直接返回 MeowLoad 的规范化结果,不创建平台任务,也不自动写入 FunClaw 资产。如果需要把视频或 JSON 结果沉淀为团队资产,调用方需另行使用 application-asset-service 写入。
能力信息
| 字段 | 值 |
|---|---|
| 能力 Key | meowload-api-service |
| 能力名称 | 提取链接去水印视频 |
| 能力类型 | data_service |
| 执行方式 | 同步执行,不创建平台任务 |
| 上游服务 | MeowLoad Native API |
| 服务端配置 | MEOWLOAD_API_KEY,可选 MEOWLOAD_API_BASE_URL、超时和重试配置 |
| 资产写入 | 不自动写资产 |
子能力列表
| action | 子能力 | 适用场景 | 入参 |
|---|---|---|---|
media.extract | 单帖媒体提取 | 提取单个帖子、视频或分享链接中的视频、图片、封面和不同格式地址。包含 Sora2 去水印等单帖提取场景。 | url |
playlist.extract | 主页/播放列表批量提取 | 提取账号主页、播放列表或 profile 页中的帖子列表,支持 cursor 翻页。 | url, cursor? |
subtitle.extract | 视频字幕提取 | 提取视频可用字幕轨,例如 YouTube 字幕。 | url |
credits.query | 查询剩余额度 | 查询当前 FunClaw 服务端 MeowLoad Key 的剩余调用额度。 | 无 |
调用入口
组织显式路径:
POST /api/open/v1/organizations/{orgId}/capabilities/meowload-api-service:execute
Authorization: Bearer <sk-organization-application-api-key>
Content-Type: application/jsonSkill/MCP key-only 路径:
POST /api/open/v1/capabilities/meowload-api-service/execute
Authorization: Bearer <sk-external-agent-or-application-api-key>
Content-Type: application/json请求体统一放在 input 中:
{
"input": {
"action": "media.extract",
"params": {
"url": "https://www.youtube.com/watch?v=jNQXAC9IVRw"
}
}
}使用应用级 Key 时可以传 applicationId;使用组织级、数字员工或 External Agent Key 时通常省略:
{
"applicationId": "organization-application-id",
"input": {
"action": "credits.query",
"params": {}
}
}通用响应结构
外层是 FunClaw 统一开放能力响应,内层 data 是 MeowLoad 能力响应:
{
"capabilityKey": "meowload-api-service",
"message": "SUCCEEDED",
"code": 200,
"data": {
"action": "media.extract",
"provider": "meowload",
"status": "SUCCEEDED",
"data": {},
"trace": {
"requestId": "meowload-request-id",
"elapsedMs": 463,
"upstreamHttpStatus": 200
}
}
}| 字段 | 说明 |
|---|---|
capabilityKey | 固定为 meowload-api-service。 |
message/code | FunClaw 开放能力入口结果。code=200 表示本次同步调用完成。 |
data.action | 本次执行的子能力 action。 |
data.provider | 固定为 meowload。 |
data.status | MeowLoad 业务结果状态,成功时为 SUCCEEDED。 |
data.data | action 级业务数据。不同 action 的结构不同。 |
data.trace | 排障摘要,只包含请求 ID、耗时和上游 HTTP 状态,不包含 API Key。 |
media.extract
单帖媒体提取。给一个帖子、视频或分享链接,返回文本、媒体数组、预览图、资源 URL,以及可选的不同格式地址。
请求示例:
{
"input": {
"action": "media.extract",
"params": {
"url": "https://www.youtube.com/watch?v=jNQXAC9IVRw"
}
}
}字段说明:
| 字段 | 必填 | 说明 |
|---|---|---|
input.action | 是 | 固定为 media.extract。 |
input.params.url | 是 | 单帖、单视频或分享链接。 |
成功响应中的 data.data:
{
"id": "post-or-video-id",
"text": "Me at the zoo",
"createdAt": "2026-07-17T00:00:00Z",
"medias": [
{
"mediaType": "video",
"resourceUrl": "https://cdn.example.com/video.mp4",
"previewUrl": "https://cdn.example.com/cover.jpg",
"headers": {
"Referer": "https://example.com/"
},
"formats": [
{
"quality": 1080,
"qualityNote": "HD",
"videoUrl": "https://cdn.example.com/video-1080.mp4",
"videoProxyUrl": "https://proxy.example.com/video",
"videoExt": "mp4",
"videoSize": 12345678,
"audioUrl": "https://cdn.example.com/audio.m4a",
"audioProxyUrl": "https://proxy.example.com/audio",
"audioExt": "m4a",
"audioSize": 123456,
"separate": 0
}
]
}
]
}返回字段:
| 字段 | 说明 |
|---|---|
id | 上游返回的帖子或视频 ID,可能为空。 |
text | 标题、正文或描述文本。 |
createdAt | 上游创建时间,可能为空。 |
medias[].mediaType | 媒体类型,例如 video、image。 |
medias[].resourceUrl | 主要媒体资源地址。调用方通常优先读取这个字段。 |
medias[].previewUrl | 封面或预览图地址。 |
medias[].headers | 下载或访问资源时上游建议携带的请求头。 |
medias[].formats[] | 不同清晰度、音视频分离或扩展格式列表。 |
formats[].videoUrl | 某个格式的视频地址。 |
formats[].videoProxyUrl | MeowLoad 提供的视频代理地址;当 videoUrl 为 IP 绑定的 googlevideo 临时地址时优先使用。 |
formats[].audioUrl | 某个格式的音频地址,可能为空。 |
formats[].audioProxyUrl | MeowLoad 提供的音频代理地址;音视频分离格式应与 videoProxyUrl 成对使用。 |
formats[].separate | 上游格式标记,用于表示音视频是否分离等状态。 |
playlist.extract
主页/播放列表批量提取。首轮只传 url;如果响应里 hasMore=true 且有 nextCursor,下一轮把 nextCursor 作为 cursor 传回。
请求示例:
{
"input": {
"action": "playlist.extract",
"params": {
"url": "https://www.instagram.com/nike/"
}
}
}翻页请求:
{
"input": {
"action": "playlist.extract",
"params": {
"url": "https://www.instagram.com/nike/",
"cursor": "next-cursor-from-previous-response"
}
}
}字段说明:
| 字段 | 必填 | 说明 |
|---|---|---|
input.action | 是 | 固定为 playlist.extract。 |
input.params.url | 是 | 主页、播放列表或 profile 链接。 |
input.params.cursor | 否 | 上一页响应里的 nextCursor。首轮省略。 |
成功响应中的 data.data:
{
"hasMore": true,
"nextCursor": "cursor-2",
"user": {
"username": "Nike",
"imageUrl": "https://cdn.example.com/avatar.jpg"
},
"posts": [
{
"id": "post-id",
"createdAt": "2026-07-17T00:00:00Z",
"text": "post text",
"postUrl": "https://example.com/p/post-id",
"medias": [
{
"mediaType": "image",
"resourceUrl": "https://cdn.example.com/image.jpg",
"previewUrl": "https://cdn.example.com/preview.jpg",
"formats": []
}
]
}
]
}返回字段:
| 字段 | 说明 |
|---|---|
hasMore | 是否还有下一页。 |
nextCursor | 下一页 cursor。没有下一页时可能为空。 |
user.username | 主页用户名。 |
user.imageUrl | 主页头像。 |
posts[] | 提取到的帖子列表。 |
posts[].postUrl | 原帖链接。 |
posts[].medias[] | 帖子里的媒体数组,结构与 media.extract 的 medias[] 一致。 |
subtitle.extract
字幕提取。给一个视频链接,返回视频摘要和可用字幕轨。
请求示例:
{
"input": {
"action": "subtitle.extract",
"params": {
"url": "https://www.youtube.com/watch?v=example"
}
}
}字段说明:
| 字段 | 必填 | 说明 |
|---|---|---|
input.action | 是 | 固定为 subtitle.extract。 |
input.params.url | 是 | 视频链接。 |
成功响应中的 data.data:
{
"id": "video-id",
"text": "video title",
"description": "video description",
"duration": 120,
"publishedAt": "2026-07-17T00:00:00Z",
"thumbnailUrl": "https://cdn.example.com/thumb.jpg",
"subtitles": [
{
"languageName": "Chinese (China)",
"languageTag": "zh-CN",
"urls": [
{
"url": "https://cdn.example.com/subtitle.srt",
"format": "srt"
}
]
}
]
}返回字段:
| 字段 | 说明 |
|---|---|
id | 视频 ID。 |
text | 视频标题或文本。 |
description | 视频描述。 |
duration | 视频时长,单位由上游返回值决定,通常为秒。 |
publishedAt | 发布时间。 |
thumbnailUrl | 缩略图。 |
subtitles[].languageName | 字幕语言名称。 |
subtitles[].languageTag | 字幕语言标签,例如 zh-CN、en。 |
subtitles[].urls[] | 字幕文件地址列表。 |
subtitles[].urls[].format | 字幕格式,例如 srt、vtt。 |
credits.query
查询 FunClaw 服务端当前 MeowLoad Key 的剩余额度。该 action 不需要 url。
请求示例:
{
"input": {
"action": "credits.query",
"params": {}
}
}成功响应中的 data.data:
{
"availableCredits": 497
}availableCredits 可能是数字,也可能是上游返回的字符串;调用方不要假设一定是整数类型。
授权说明
授权检查发生在 FunClaw 层,而不是 MeowLoad 层:
- 应用级 API Key:应用必须被授予
meowload-api-service。 - 组织级 admin API Key:组织直接授权或组织应用授权里必须包含
meowload-api-service。 - 数字员工 / External Agent API Key:对应数字员工必须被授予
meowload-api-service。 - 仅授予
funclaw-mcp-server不等于授予所有业务能力;MCP 入口仍会按当前 Key 的业务能力清单过滤。
边界与注意事项
- 该能力只返回提取结果,不下载文件、不转存对象存储、不写平台资产。
- 返回的
resourceUrl、videoUrl、audioUrl可能是短期或 IP 绑定地址;对应代理字段存在时优先使用videoProxyUrl/audioProxyUrl。 - 如果
headers非空,调用方下载对应媒体时应保留这些 header。 media.extract和playlist.extract的媒体结构一致,调用方可以复用同一套解析逻辑。playlist.extract的分页由上游cursor控制,FunClaw 不做本地分页缓存。trace只用于排障,不应作为业务主键或幂等键。
常见错误
| HTTP 状态 | 原因 |
|---|---|
400 | 缺少 action、缺少必填 url、params 不是对象,或传入了当前 action 不支持的字段。 |
401 | 未提供 Authorization: Bearer <sk-...>,或使用用户登录 token 调用开放能力执行入口。 |
403 | 当前 API Key 没有被授予 meowload-api-service。 |
402 | MeowLoad 上游额度耗尽,FunClaw 错误 reason 包含 MEOWLOAD_QUOTA_EXHAUSTED。 |
502 | MeowLoad Key 配置错误、上游不可用、上游鉴权失败或返回非 JSON。 |
典型错误响应:
{
"capabilityKey": "meowload-api-service",
"message": "api key capability not granted",
"code": 403,
"data": {
"error": {
"code": "OPEN_CAPABILITY_FORBIDDEN",
"status": 403,
"type": "FORBIDDEN",
"reason": "api key capability not granted"
}
}
}