易盘搜

易盘搜 OpenAPI

API 接口文档

面向服务端调用方,提供受权资源搜索和幂等资源录入能力。公开网页搜索无需 Token,但不会返回资源链接;OpenAPI 必须使用现有 SysApiToken。

接入说明

推荐通过同域网关调用/api/panSeo/openApi/*。所有 OpenAPI 请求都必须通过 x-token 请求头发送由 GVA 签发的 SysApiToken,不支持使用 Authorization Bearer 替代。

方法路径用途
GET/panSeo/openApi/search搜索并返回有效链接
POST/panSeo/openApi/resources/upsert单条幂等录入
POST/panSeo/openApi/resources/batch-upsert批量幂等录入
GET/panSeo/openApi/enrichment/candidates查询当前用户待补全资源
GET/panSeo/openApi/resources/:id/enrichment-context读取安全补全上下文
GET/panSeo/openApi/taxonomies查询分类或标签
POST/panSeo/openApi/tags/ensure幂等获取或创建标签
PATCH/panSeo/openApi/resources/:id/metadata局部回写元数据
GET/panSeo/access/verify验证 Token 与接口权限
GET/panSeo/public/integrations/pan-seo-mcp.skill公开下载 Skill,不含 Token
GET/panSeo/public/integrations/pan-seo-mcp.zip手动下载 ZIP 压缩包,不含 Token

Token 仅应保存在调用方服务端的密钥管理或环境变量中,不要写入浏览器代码、URL 或日志。

新增或更新资源

POST/panSeo/openApi/resources/upsert

完整模式按 source + externalIdresourceKey 或数据库 ID 幂等新增/更新。爬虫最简模式按 Token 所属用户和规范化资源名称归并父资源,分享链接保存在子表中。

参数类型必填说明
IDinteger数据库资源 ID,仅后台或可信内部系统使用
namestring最简模式是爬虫资源名称;与 title 至少提供一个
urlstring最简模式是顶层分享链接;同一父资源内按 URL 去重
extractionCodestring与顶层 url 对应的提取码;最简模式为空时保留已有非空值
availableboolean顶层链接是否可用,默认 true
lastCheckedAtstring/null顶层链接最近检测时间,RFC 3339
resourceKeystring条件必填完整模式全局唯一键;可由 source + externalId 自动生成
sourcestring条件必填完整模式来源系统稳定标识
externalIdstring条件必填完整模式来源系统内唯一 ID
titlestring完整模式是完整模式资源标题;与 name 至少提供一个
slugstring公开 URL 标识;为空时自动生成,发布后保持稳定
summarystring资源摘要和默认 SEO 描述
contentMarkdownstring资源 Markdown 正文
coverUrlstring资源封面绝对 URL
categoryIdinteger/null已存在的分类 ID
statusstringdraft、published 或 offline;最简模式默认 published
publishedAtstring/null发布时间,RFC 3339
seoTitlestring详情页 SEO 标题覆盖
seoDescriptionstring详情页 SEO 描述覆盖
seoKeywordsstringSEO 关键词,也参与搜索
tagIdsinteger[]已存在的标签 ID 数组
linksobject[]资源子链接数组,字段见下表
replaceLinksboolean是否删除本次未提交的旧链接,默认 false

links 子项参数

参数类型必填说明
platformIdinteger平台 ID;省略时根据 URL 自动识别或创建
urlstring绝对 HTTP/HTTPS 分享链接
extractionCodestring提取码;最简模式为空时不清除相同 URL 的已有非空值
remarkstring链接备注
sortinteger升序排序值,默认 0
enabledboolean人工启停状态,默认 true
availableboolean实际可用状态,默认 true
lastCheckedAtstring/null最近检测时间,RFC 3339

最简爬虫请求

{
  "name": "Go Web 开发资料",
  "url": "https://pan.quark.cn/s/demo-resource",
  "extractionCode": "1234",
  "available": true,
  "lastCheckedAt": "2026-08-18T17:30:00+08:00"
}
curl -sS -X POST "$BASE_URL/panSeo/openApi/resources/upsert" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "x-token: $TOKEN" \
  --data '{"name":"Go Web 开发资料","url":"https://pan.quark.cn/s/demo-resource","extractionCode":"1234","available":true}'

最简请求按 Token 所属用户和规范化资源名称归并父资源。先提交百度链接、后提交迅雷链接会追加到同一资源;相同 URL 只刷新子链接,不会重复插入。定时重复提交不会清空人工补录内容或重新发布已下架资源。

完整资源请求

{
  "source": "partner-crawler",
  "externalId": "go-web-20260818-001",
  "title": "Go Web 开发资料",
  "slug": "go-web-guide",
  "summary": "包含 Gin、数据库和部署相关资料。",
  "contentMarkdown": "## 内容介绍\n\n这是一份持续更新的 Go Web 学习资料。",
  "coverUrl": "https://cdn.example.com/covers/go-web.webp",
  "categoryId": 3,
  "status": "published",
  "publishedAt": "2026-08-18T15:20:00+08:00",
  "seoTitle": "Go Web 开发资料下载与学习指南",
  "seoDescription": "检索 Go、Gin、数据库与部署相关学习资料。",
  "seoKeywords": "Go,Gin,Web开发",
  "tagIds": [8, 12],
  "links": [
    {
      "url": "https://pan.quark.cn/s/demo-resource",
      "extractionCode": "1234",
      "remark": "夸克主链接",
      "sort": 10,
      "enabled": true,
      "available": true,
      "lastCheckedAt": "2026-08-18T17:30:00+08:00"
    },
    {
      "url": "https://pan.xunlei.com/s/demo-resource",
      "extractionCode": "5678",
      "remark": "迅雷备用链接",
      "sort": 20,
      "enabled": true,
      "available": true
    }
  ],
  "replaceLinks": false
}
curl -sS -X POST "$BASE_URL/panSeo/openApi/resources/upsert" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "x-token: $TOKEN" \
  --data-binary @resource.json

成功响应

{
  "code": 0,
  "data": {
    "resource": {
      "ID": 101,
      "resourceKey": "partner-crawler:go-web-20260818-001",
      "source": "partner-crawler",
      "externalId": "go-web-20260818-001",
      "title": "Go Web 开发资料",
      "slug": "go-web-guide",
      "status": "published"
    },
    "created": true
  },
  "msg": "录入成功"
}

批量录入

POST/panSeo/openApi/resources/batch-upsert

请求体使用 { "items": [...] },每次最少 1 条、最多 100 条。批量接口逐条执行,调用方必须继续检查data.faileddata.errors。同一批次可以混用最简模式和完整模式。

参数类型必填说明
itemsobject[]资源数组,最少 1 条、最多 100 条
items[].namestring条件必填最简模式资源名称
items[].urlstring条件必填最简模式分享链接
items[].extractionCodestring最简模式提取码
items[].availableboolean最简模式链接可用状态
items[].lastCheckedAtstring/null最近检测时间,RFC 3339
items[].sourcestring条件必填完整模式来源标识
items[].externalIdstring条件必填完整模式外部唯一 ID
items[].titlestring条件必填完整模式资源标题
items[].linksobject[]完整模式子链接,结构与单条接口一致

完整批量请求

{
  "items": [
    {
      "name": "Go Web 开发资料",
      "url": "https://pan.quark.cn/s/go-web-resource",
      "extractionCode": "1234",
      "available": true,
      "lastCheckedAt": "2026-08-18T17:30:00+08:00"
    },
    {
      "name": "Go Web 开发资料",
      "url": "https://pan.xunlei.com/s/go-web-resource",
      "extractionCode": "5678",
      "available": true
    },
    {
      "source": "partner-crawler",
      "externalId": "python-course-001",
      "title": "Python 入门课程",
      "summary": "Python 基础与实战课程资料。",
      "status": "published",
      "links": [
        {
          "url": "https://pan.baidu.com/s/python-course-001",
          "extractionCode": "9abc",
          "remark": "百度网盘",
          "sort": 10,
          "enabled": true,
          "available": true
        }
      ]
    }
  ]
}
curl -sS -X POST "$BASE_URL/panSeo/openApi/resources/batch-upsert" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "x-token: $TOKEN" \
  --data-binary @batch-resources.json

示例前两项名称相同且使用同一 Token:第一项创建父资源和夸克链接,第二项把迅雷链接追加到同一父资源。批量接口固定使用链接合并模式,不支持删除本次未提交的旧链接。

全部成功响应

{
  "code": 0,
  "data": {
    "created": 2,
    "updated": 1,
    "failed": 0,
    "errors": []
  },
  "msg": "批量录入完成"
}

部分失败响应

{
  "code": 0,
  "data": {
    "created": 1,
    "updated": 1,
    "failed": 1,
    "errors": [
      "row 4: invalid resource status"
    ]
  },
  "msg": "批量录入完成"
}

外层 code=0 只表示批量请求已执行,不代表每一项成功。errors 中第一条 item 从row 2 开始编号。

MCP 工具接入

MCP 是实时调用接口的连接层,负责工具发现、参数校验、Token 透传和权限执行;Skill 是给编程工具使用的工作流说明,不包含连接凭证,也不会替代 MCP。要完成自动补全,需要同时配置 MCP 并安装 Skill。

POST/mcp

PanSEO 本身不调用任何模型,也不需要模型供应商密钥。内容由 Codex、Claude Code、Cursor 等外部工具生成;服务端只提供受限读写接口。

七个 PanSEO 工具

MCP 工具后端接口用途
panseo-search-resourcesGET /panSeo/openApi/search受权搜索,返回有效链接与提取码
panseo-add-resourcePOST /panSeo/openApi/resources/upsert仅暴露 name、url、extractionCode 的简易录入
panseo-list-enrichment-candidatesGET /panSeo/openApi/enrichment/candidates默认查询待补全文本;includeCoverOnly=true 时纳入仅缺封面的资源
panseo-get-enrichment-contextGET /panSeo/openApi/resources/:id/enrichment-context获取含当前封面且不含分享链接和提取码的安全上下文
panseo-list-taxonomiesGET /panSeo/openApi/taxonomies查询可用分类或标签
panseo-ensure-tagPOST /panSeo/openApi/tags/ensure幂等获取或创建标签,不能创建分类
panseo-update-metadataPATCH /panSeo/openApi/resources/:id/metadata只更新文本、封面、分类和标签

候选查询默认设置 includeCoverOnly=false,因此仅缺封面的资源不会在普通补全批次中重复出现。只有执行封面专项补全时才设置为true

Token 权限清单

/layout/permission/apiToken 签发 SysApiToken,并确保 Token 所属角色已通过 Casbin 授权所需接口。只做补全时不必授予搜索和新增接口;只做爬虫录入时也不必授予补全写接口。

方法Casbin API 路径建议
GET/panSeo/openApi/search需要搜索链接时授权
POST/panSeo/openApi/resources/upsert需要简易录入时授权
GET/panSeo/openApi/enrichment/candidates补全工作流必需
GET/panSeo/openApi/resources/:id/enrichment-context补全工作流必需
GET/panSeo/openApi/taxonomies补全分类标签时必需
POST/panSeo/openApi/tags/ensure允许新建标签时授权
PATCH/panSeo/openApi/resources/:id/metadata确认后回写时必需

一键添加连接

安装链接只写入 MCP 地址,不携带 Token。安装后按下方配置添加x-token

客户端配置

Codex / ChatGPT Desktop / Codex IDE

写入用户级 ~/.codex/config.toml,或可信项目中的 .codex/config.toml;客户端原生支持 Streamable HTTP。

[mcp_servers.panseo]
url = "https://yps.ppru.cn/mcp"
env_http_headers = { "x-token" = "PANSEO_API_TOKEN" }
default_tools_approval_mode = "writes"

Claude Code

写入项目级 .mcp.json 或用户级配置。把占位符替换为从密钥管理加载的值。

{
  "mcpServers": {
    "panseo": {
      "type": "http",
      "url": "https://yps.ppru.cn/mcp",
      "headers": {
        "x-token": "YOUR_SYS_API_TOKEN"
      }
    }
  }
}

Claude Desktop

若当前版本不能直接添加远程 HTTP 服务,可通过 mcp-remote 桥接;Token 仍只保存在本机配置中。

{
  "mcpServers": {
    "panseo": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://yps.ppru.cn/mcp",
        "--transport",
        "http-only",
        "--header",
        "x-token:YOUR_SYS_API_TOKEN"
      ]
    }
  }
}

Cursor

写入项目级 .cursor/mcp.json 或全局 ~/.cursor/mcp.json。

{
  "mcpServers": {
    "panseo": {
      "url": "https://yps.ppru.cn/mcp",
      "headers": {
        "x-token": "YOUR_SYS_API_TOKEN"
      }
    }
  }
}

VS Code / GitHub Copilot

写入 .vscode/mcp.json;password 输入不会写入配置文件。

{
  "inputs": [
    {
      "type": "promptString",
      "id": "panseo-token",
      "description": "PanSEO SysApiToken",
      "password": true
    }
  ],
  "servers": {
    "panseo": {
      "type": "http",
      "url": "https://yps.ppru.cn/mcp",
      "headers": {
        "x-token": "${input:panseo-token}"
      }
    }
  }
}

Trae

在 Trae 设置 → MCP 中粘贴;保存后重新加载工具列表。

{
  "mcpServers": {
    "panseo": {
      "url": "https://yps.ppru.cn/mcp",
      "headers": {
        "x-token": "YOUR_SYS_API_TOKEN"
      }
    }
  }
}

Cline

在 MCP Servers 配置中粘贴,远程传输类型使用 streamableHttp。

{
  "mcpServers": {
    "panseo": {
      "type": "streamableHttp",
      "url": "https://yps.ppru.cn/mcp",
      "headers": {
        "x-token": "YOUR_SYS_API_TOKEN"
      },
      "disabled": false,
      "autoApprove": []
    }
  }
}

元数据 PATCH 示例

{
  "summary": "根据资源标题整理的简短说明。",
  "contentMarkdown": "## 资源说明\n\n仅描述当前上下文能够确认的信息。",
  "seoTitle": "资源名称与检索说明",
  "seoDescription": "资源页面的克制、可验证描述。",
  "seoKeywords": "资源名称,主题关键词",
  "coverUrl": "https://images.example.com/covers/resource.webp",
  "categoryId": 3,
  "tagIds": [8, 12]
}

所有字段均可选,但至少提交一个。文本字段提交时必须非空;coverUrl 必须是公开可访问、无内嵌账号信息且最多 1024 字符的 HTTP(S) 图片绝对 URL;categoryId=0 清空分类,tagIds=[] 清空标签。未提交字段保持原值。

安装 pan-seo-mcp Skill

Skill 规定“查询候选 → 读取上下文 → 有联网工具时必须联网核验 → 查询分类标签 → 生成带来源的克制草稿 → 用户确认 → 写入 → 重新读取验证”的操作顺序。缺少封面时允许豆瓣、IMDb、TMDB 等稳定的非 bkimg 图片直链,但必须核验资源匹配、图片尺寸和链接稳定性;找不到可靠图片则保持为空。没有联网工具时必须在预览中说明,不能假装完成核验。下载内容不含 Token,MCP 地址来自后台首页 SEO 配置中的规范域名。

下载 .skill 文件下载 ZIP 压缩包https://yps.ppru.cn/api/panSeo/public/integrations/pan-seo-mcp.skill

.skill本质上也是 ZIP 归档,适合安装器直接导入;手动安装可下载https://yps.ppru.cn/api/panSeo/public/integrations/pan-seo-mcp.zip,解压后把pan-seo-mcp目录复制到客户端的 Skills 目录。

客户端一键安装命令
Codexnpx skills add https://yps.ppru.cn/api/panSeo/public/integrations/pan-seo-mcp.skill -g -a codex -y
Claude Codenpx skills add https://yps.ppru.cn/api/panSeo/public/integrations/pan-seo-mcp.skill -g -a claude-code -y
Cursornpx skills add https://yps.ppru.cn/api/panSeo/public/integrations/pan-seo-mcp.skill -g -a cursor -y
Clinenpx skills add https://yps.ppru.cn/api/panSeo/public/integrations/pan-seo-mcp.skill -g -a cline -y
Traenpx skills add https://yps.ppru.cn/api/panSeo/public/integrations/pan-seo-mcp.skill -g -a trae -y
GitHub Copilotnpx skills add https://yps.ppru.cn/api/panSeo/public/integrations/pan-seo-mcp.skill -g -a github-copilot -y

也可以把同一个地址交给支持 Agent Skills 的安装器。安装完成后重启或重新加载编程工具,确认pan-seo-mcp 已出现在 Skill 列表中。

示例提示词

下面的案例可以直接复制。普通补全默认排除“仅缺封面”的资源;封面专项必须显式设置includeCoverOnly=true

普通补全:先处理 10 条

适合首次使用。只生成可审阅草稿,确认后才写入。

使用 $pan-seo-mcp 做一次普通元数据补全。
调用 panseo-list-enrichment-candidates,参数设为 page=1、pageSize=10、includeCoverOnly=false。
逐条读取补全上下文;如果当前工具支持联网搜索,必须逐条联网核验,并在草稿中列出来源页面。
只根据 PanSEO 上下文和已核验信息生成摘要、Markdown 正文、SEO 字段、分类和标签建议,不要虚构剧情、文件内容或版本信息。
仅在找到稳定且可直接访问的图片时建议 coverUrl;允许使用豆瓣、IMDb、TMDB 等非 bkimg 稳定图源。
先展示这 10 条的字段级变更草稿,不要写入。等我确认后再更新,并逐条重新读取验证。

普通补全:处理全部直到队列为空

明确授权连续写入;每轮重新读取第一页,并设置去重和无进展停止条件。

使用 $pan-seo-mcp 补全我名下全部普通待补全资源。我明确授权你在本次任务中连续写入符合下列规则的结果,不需要逐批等待确认。
每轮调用 panseo-list-enrichment-candidates,固定使用 page=1、pageSize=10、includeCoverOnly=false。
逐条读取上下文;有联网搜索工具时必须逐条联网核验并记录来源。只写入可验证的摘要、Markdown 正文、SEO 字段、分类和标签,不得覆盖标题、slug、链接、提取码、状态或发布时间。
每次写入后重新读取该资源验证;一轮结束后重新查询 page=1。持续处理,直到返回的 list 为空。
维护 processedIds 和 failedIds,同一资源本次最多处理一次。单轮没有任何成功更新,或返回结果全部已在 processedIds/failedIds 中时,立即停止,避免死循环。
不要把 includeCoverOnly 改为 true。最后汇总成功、跳过、失败数量及失败原因。

封面专项:先找 10 条

跨页筛选缺封面的资源,只预览可靠图片来源,不改其他字段。

使用 $pan-seo-mcp 为我名下缺少封面的资源准备前 10 条候选草稿,不要写入。
从 page=1、pageSize=10、includeCoverOnly=true 开始查询;只选择 missingFields 包含 coverUrl 的资源,必要时继续翻页,按资源 ID 去重,收集满 10 条或查完全部候选后停止。
逐条读取上下文并联网搜索。必须同时核验来源页面和图片直链确实对应当前资源;允许使用豆瓣、IMDb、TMDB(包括 image.tmdb.org)等稳定的非 bkimg 图源,不要求必须是官方图片。
只建议 coverUrl,不覆盖已有文本、分类、标签或身份字段。找不到可靠封面时保持为空,并说明已检查的来源和跳过原因。
展示资源 ID、标题、建议图片 URL、来源页面和核验结果,等我确认后再写入。

封面专项:处理全部缺封面资源

先只读快照,再处理固定 ID,避免写入导致分页变化后漏项或重复。

使用 $pan-seo-mcp 补全我名下全部缺失封面的资源。我明确授权你在本次任务中连续写入已核验的 coverUrl,不需要逐条等待确认。
第一阶段只读,不要写入:用 pageSize=100、includeCoverOnly=true 从 page=1 开始分页,直到 list 为空或已读取 total;只收集 missingFields 包含 coverUrl 的资源 ID,并去重形成固定快照。
第二阶段只处理这份固定 ID 列表:逐条读取上下文并联网搜索,同时核验来源页面与图片直链。允许豆瓣、IMDb、TMDB(包括 image.tmdb.org)等稳定的非 bkimg 图源,不要求官方图片。
每条只写入 coverUrl,随后重新读取验证。没有可靠图片、图片无法直接访问或无法确认对应关系时,跳过并记录原因,本次运行不要再次尝试该 ID。
处理完固定列表后停止,不要反复查询第一页。最后汇总快照总数、成功、跳过、失败数量,并列出跳过和失败的资源 ID。

失败项:按 ID 定向重试

只重试上次失败或跳过的资源,不重新扫描整个候选队列。

使用 $pan-seo-mcp 只复核以下资源 ID:RESOURCE_ID_1、RESOURCE_ID_2。不要重新查询或处理整个待补全队列。
逐条获取 enrichment-context,并根据 missingFields 决定可更新字段。有联网搜索工具时必须联网核验;若没有联网能力,请明确说明并只输出草稿,不要写入无法核实的内容。
封面可使用豆瓣、IMDb、TMDB 等稳定图片直链,但必须核验与当前资源匹配且可以直接访问。文本不得根据标题猜测具体剧情、集数、文件清单或版本。
先列出每条资源的新证据、拟修改字段和仍无法补全的字段,不要写入。等我确认后再更新并重新读取验证。

统一响应与错误处理

{
  "code": 0,
  "data": {},
  "msg": "成功"
}
HTTP业务 code说明
2000成功,使用 data
2007参数、业务或权限错误,读取 msg
4017Token 缺失、无效、过期或作废
4297超过 IP 或 Token 限流,稍后重试
MCP tool error-Gin 参数、Token 或 Casbin 错误会映射为可读工具错误
← 返回资源搜索