Publish Token Docs

机场榜GateRank 发布令牌接入说明

给第三方系统与 AI 的正式发文接口文档

这是一份公开接入文档,用于说明 机场榜GateRank 当前开放的新闻发布能力、Bearer 鉴权方式、草稿与直接发布的区别、封面上传流程,以及你在接入时会遇到的常见错误和 scope 约束。

01Authentication & Data Contract

总览

Base URL
https://gate-rank.com/api/v1/publish
鉴权方式
Authorization: Bearer <publish_token>
封面字段
cover_image_url
发布模式字段
publish_mode

字段说明

title 文章标题。

content_markdown 正文 Markdown,发布时必填。

slug 可选,不传时会按标题自动生成。

excerpt 可选,不传时会根据正文自动提取摘要。

cover_image_url 封面地址字段,可直接传本站已上传图片 URL。

publish_mode 只支持 draft 或 publish,默认 draft。

行为定义

draft 只在后台创建草稿,不出现在前台 News。

publish 创建后立即上线,需要 news:create + news:publish。

article.id 创建成功后返回文章 ID,后续更新和发布都基于这个 ID。

02Security Contract

鉴权与安全

鉴权约定

Authorization 仅支持 Bearer Token,不接受 x-api-key。

401 令牌不存在、已吊销、已过期,或 Authorization 格式不正确。

403 令牌存在,但 scope 不足,无法访问当前接口。

令牌管理约定

plain_token 明文令牌只在创建成功时返回一次,之后不可找回。

revoke 吊销后立刻失效,后续请求全部按未授权处理。

article.id 第三方系统应保存创建返回的 article.id,后续操作均基于此值。

建议将发布令牌视为后端服务密钥,仅保存在服务端配置或安全密钥系统中。不要把它写入前端页面、浏览器脚本或公开仓库。
03Recommended Flow

快速开始

  1. 先准备 Bearer 令牌,并确认该令牌具备所需 scope。
  2. 如果有封面图,先调用 upload-image 拿到本站图片 URL。
  3. 调用 POST /news,创建草稿或直接发布。
  4. 如果创建的是草稿,再调用 /news/:id/publish 上线。
bash
curl -X POST 'https://gate-rank.com/api/v1/publish/news' \
  -H 'Authorization: Bearer <publish_token>' \
  -H 'Content-Type: application/json' \
  -d '{
    "title":"新文章",
    "content_markdown":"# Hello\n\n正文内容",
    "publish_mode":"draft"
  }'
04Draft → Publish → Archive

状态流转

01Draft

创建草稿后,内容只在后台存在,前台 News 页面不会展示。适合由第三方系统先写入,再由你在后台复核。

02Publish

调用 publish 或在创建时直接使用 publish_mode=publish 后,文章会进入前台已发布集合。

03Archive

归档后文章不再作为前台已发布新闻展示,但数据仍保留在后台系统中,便于追溯和再次处理。

05POST /news

创建文章

POST
/api/v1/publish/news
news:create;若 publish_mode=publish,还需要 news:publish

创建一篇新闻草稿,或直接创建并发布。

json
{
  "title": "新文章",
  "slug": "new-article",
  "excerpt": "可选摘要",
  "cover_image_url": "/uploads/news/1743240000000-cover.webp",
  "content_markdown": "# Hello\n\n正文内容",
  "publish_mode": "draft"
}

返回要点

返回完整 article 对象,其中包含 article.id。

如果 slug 冲突,会返回 NEWS_SLUG_CONFLICT。

未传 excerpt 时,会按正文自动提取摘要。

json
{
  "article": {
    "id": 123,
    "title": "新文章",
    "slug": "new-article",
    "status": "draft",
    "cover_image_url": "/uploads/news/1743240000000-cover.webp",
    "published_at": null
  }
}

Request Body

Field
Type
Required
Description
title
string
文章标题
content_markdown
string
正文 Markdown
slug
string
可选,不传自动生成
excerpt
string
可选,不传自动提取
cover_image_url
string
封面地址字段
publish_mode
draft | publish
默认 draft

Key Response Fields

Field
Type
Required
Description
article.id
number
文章主键,后续更新/发布/归档都基于此值
article.status
string
draft 或 published
article.slug
string
最终文章 slug
article.published_at
string | null
未发布时为 null
06POST /news/upload-image

上传封面

POST
/api/v1/publish/news/upload-image
news:upload

上传正文图片或封面图片;如果 mode=cover,会按封面规则压缩处理。

bash
curl -X POST 'https://gate-rank.com/api/v1/publish/news/upload-image' \
  -H 'Authorization: Bearer <publish_token>' \
  -F 'mode=cover' \
  -F 'file=@/path/to/cover.png'
json
{"url":"/uploads/news/1743240000000-cover.webp"}

Multipart Fields

Field
Type
Required
Description
file
binary
图片文件本体
mode
cover | inline
封面建议传 cover;不传时按普通正文图片处理

Response

Field
Type
Required
Description
url
string
上传完成后的本站图片地址
07PATCH /publish / archive

后续操作

PATCH
/api/v1/publish/news/:id
news:update

更新已存在的文章内容。

POST
/api/v1/publish/news/:id/publish
news:publish

将草稿正式发布到前台。

POST
/api/v1/publish/news/:id/archive
news:archive

归档文章,使其不再作为前台已发布新闻展示。

bash
# 更新文章
curl -X PATCH 'https://gate-rank.com/api/v1/publish/news/123' \
  -H 'Authorization: Bearer <publish_token>' \
  -H 'Content-Type: application/json' \
  -d '{"title":"更新后的标题","content_markdown":"# Updated"}'

# 发布草稿
curl -X POST 'https://gate-rank.com/api/v1/publish/news/123/publish' \
  -H 'Authorization: Bearer <publish_token>' \
  -H 'Content-Type: application/json' \
  -d '{}'

# 归档文章
curl -X POST 'https://gate-rank.com/api/v1/publish/news/123/archive' \
  -H 'Authorization: Bearer <publish_token>'

更新文章

适用于修正文案、摘要、slug、正文和封面。

建议只提交需要变更的字段,但 title 与 content_markdown 通常应保持完整。

发布草稿

发布成功后,article.status 会切换为 published。

如果文章不存在,会返回 NEWS_NOT_FOUND。

归档文章

归档后不会作为前台已发布新闻展示。

适合处理误发、过期活动或内容撤回场景。

08Common Failures

错误码

Code
Meaning
UNAUTHORIZED
Bearer token 不存在、已吊销、格式不对,或已过期。
FORBIDDEN
令牌存在,但缺少当前接口所需 scope。
NEWS_SLUG_CONFLICT
slug 已存在,需要更换。
BAD_REQUEST
字段缺失、publish_mode 非法、文件或参数格式错误。
NEWS_NOT_FOUND
文章 ID 不存在。
json
{
  "code": "FORBIDDEN",
  "message": "Publish token scope not allowed",
  "request_id": "..."
}

排查顺序

401 先检查 Authorization 格式、令牌是否已吊销、是否已过期。

403 再检查该 token 是否具备当前接口所需 scope。

BAD_REQUEST 最后检查 JSON 字段、multipart 参数和文章 ID 是否正确。

接入建议

request_id 建议在调用失败时记录返回中的 request_id 便于排查。

retry 仅对网络错误或明确可重试场景做有限重试,不要对 401/403 盲目重放。

slug 若系统自行生成 slug,需处理 NEWS_SLUG_CONFLICT 回退逻辑。

09Scope Matrix

权限矩阵

接口
需要的 Scope
/api/v1/publish/news
news:create
/api/v1/publish/news(publish_mode=publish)
news:create + news:publish
/api/v1/publish/news/:id
news:update
/api/v1/publish/news/:id/publish
news:publish
/api/v1/publish/news/:id/archive
news:archive
/api/v1/publish/news/upload-image
news:upload
v1 不支持按 slug / external id 的 upsert,也不提供基于 token 的文章列表查询。第三方系统如需后续更新文章,请保存创建接口返回的 article.id。