接口参考

发布任务参考

手动排队发布任务与重试路由说明。

创建接口
/api/review/tasks/:taskId/publish-jobs
重试接口
/api/review/tasks/:taskId/publish-jobs/:jobId/retry
线上命名
文档统一使用 `publish-jobs`,因为这就是当前线上处理器真实暴露的路由结构。

概览

发布任务行为

本页集中说明 publish-jobs 命名和排队语义。

POST /api/review/tasks/:taskId/publish-jobs

基于已审核通过的任务快照,直接执行一次手动发布。

只有已审核通过的任务才能创建发布任务。

如果任务已经发布完成,或当前内容不足以生成可发布快照,路由会返回失败。

POST /api/review/tasks/:taskId/publish-jobs/:jobId/retry

在不改动原始快照的前提下重试失败的发布任务。

重试路由只接受 failed 状态的源发布任务。

它会复用原始快照直接执行一次新的重试发布,并递增尝试次数。

线上命名

文档刻意使用 publish-jobs 命名,而不是旧的 publish 命名。

这样可以让文档契约与线上路由处理器,以及发布任务仓储辅助函数里的术语保持一致。

POST

创建发布任务

为已审核通过的任务手动排队创建发布任务。

POST/api/review/tasks/:taskId/publish-jobs
适用场景
当审核通过后,操作方希望显式触发发布排队时使用。
认证方式

该路由会读取 review_admin_session Cookie,并拒绝未认证请求。

admin_sessionreview_admin_session

请求参数

路径参数

NameTypeRequiredDescriptionNotes
taskIdstringRequired已审核通过任务的标识。-

Cookie

NameTypeRequiredDescriptionNotes
review_admin_sessionstringRequired承载 review_admin_session Cookie。-

请求体结构

无请求体none
无请求体
无需请求体。

响应结构

JSON 对象json

执行发布后的完整最新任务记录。

结构说明
  • 线上处理器会同步执行发布,并返回包含 selections、publishJobs 和 timeline 的最新任务记录。
  • contentType 为 `image_post` 时,发布侧会创建或更新微信 `newspic` 草稿。
NameTypeRequiredDescriptionNotes
idstringRequired任务标识。-
publicAccount'silicon-rise' | 'carbon-fitness'Required目标公众号。-
topicstringRequired任务主题。-
candidatesReviewTaskCandidatesRequired创建任务时提交的候选内容。-
status'pending_review' | 'approved' | 'published' | 'rejected_rework'Required当前任务生命周期状态。-
selectionsReviewSelections | undefinedOptional审核确认后的选中结果,审核或返工后会出现。-
manualOverridesReviewManualOverrides | undefinedOptional审核员的人工覆写审计轨迹;只在发生手动改写时出现。-
bodyDraftReviewBodyDraft | undefinedOptional用于生成发布快照的正文草稿。-
rejectedElementsElementKey[] | undefinedOptional任务被驳回返工时仍待修正的字段;article 可用 title、summary、body、bodyImages、coverImage,image_post 可用 title、description、images、coverCrop、commentSettings。-
lockedSelectionsPartial<ReviewSelections> | undefinedOptional返工期间保持锁定的已确认字段。-
rejectionReasonRejectionReasonCategory | undefinedOptional任务被退回返工的原因。-
rejectionNotestring | undefinedOptional返工补充说明。-
publishJobsPublishJobRecord[]Required与任务关联的发布任务列表。-
timelineTimelineEvent[]Required任务生命周期审计轨迹。-
createdAtstringRequiredISO 格式创建时间。-
updatedAtstringRequiredISO 格式最后更新时间。-

状态码

NameTypeRequiredDescriptionNotes
HTTP 200成功Optional发布任务已创建并在当前请求内执行完成。-
HTTP 401未授权Optional管理员会话缺失或无效。-
HTTP 404未找到OptionaltaskId 不存在。-
HTTP 409冲突Optional任务未通过审核且不是已发布状态,或缺少可生成快照的发布内容。-
HTTP 500内部服务器错误Optional仓储写入失败、快照生成失败,或同步发布执行失败。-

约束条件

  • 已审核通过的任务可以创建微信草稿;已发布任务会用最近一次成功的 draftMediaId 更新微信草稿。
  • 任务必须具备可发布的 selections,以及可转为快照的正文来源。
  • image_post 发布要求 selections.images 中的每张图片都能上传为微信永久图片素材,并提供可用的 coverCrop 与 commentSettings。

副作用

  • 创建一个携带冻结快照的发布任务。
  • 在当前请求内直接执行发布。
  • article 任务创建或更新微信图文草稿;image_post 任务创建或更新微信 newspic 草稿。
  • image_post 发布会把图片资产上传为微信永久图片素材,并使用审核选定的 coverCrop 和 commentSettings。
  • 在仓储中刷新任务更新时间。

请求示例

POST /api/review/tasks/:taskId/publish-jobshttp
POST /api/review/tasks/:taskId/publish-jobs

Headers
{
  "cookie": "review_admin_session=eyJhbGciOi..."
}

Params
{
  "taskId": "task_123"
}

响应示例

HTTP 200http
HTTP/1.1 200

Body
{
  "id": "task_123",
  "publicAccount": "silicon-rise",
  "topic": "上线公告",
  "candidates": {
    "titles": [
      "上线公告草稿"
    ],
    "summaries": [
      "一段简短摘要"
    ]
  },
  "status": "published",
  "selections": {
    "title": "已通过标题",
    "summary": "已通过摘要",
    "body": "# 草稿正文",
    "bodyImages": [
      "https://example.com/body.jpg"
    ],
    "coverImage": "https://example.com/cover.jpg"
  },
  "bodyDraft": {
    "markdown": "# 草稿正文",
    "sourceBodyCandidateId": "body_candidate_launch_v1",
    "sourceBodyCandidate": "# 草稿正文",
    "bodyEditedFromCandidate": false,
    "themeTemplate": "cyan"
  },
  "publishJobs": [
    {
      "id": "job_123",
      "taskId": "task_123",
      "status": "succeeded",
      "triggerMode": "manual",
      "attemptCount": 1,
      "draftMediaId": "wechat-draft-media-id",
      "queuedAt": "2026-04-20T08:05:00.000Z",
      "startedAt": "2026-04-20T08:05:10.000Z",
      "finishedAt": "2026-04-20T08:05:30.000Z",
      "snapshot": {
        "title": "已通过标题",
        "summary": "已通过摘要",
        "themeTemplate": "cyan",
        "themeConfig": {
          "cssVariables": {
            "--theme-accent": "#00c2d1"
          }
        },
        "bodyMarkdown": "# 草稿正文",
        "bodyHtml": "<h1>草稿正文</h1>",
        "bodyImages": [
          "https://example.com/body.jpg"
        ],
        "coverImage": "https://example.com/cover.jpg",
        "sourceBodyCandidate": "# 草稿正文",
        "bodyEditedFromCandidate": false
      }
    }
  ],
  "timeline": [],
  "createdAt": "2026-04-20T08:00:00.000Z",
  "updatedAt": "2026-04-20T08:05:30.000Z"
}

相关链接

POST

重试发布任务

基于失败发布任务的快照创建新任务并立即执行重试发布。

POST/api/review/tasks/:taskId/publish-jobs/:jobId/retry
适用场景
当某个发布任务失败后,操作方希望基于同一份快照立即重新重试时使用。
认证方式

该路由会读取 review_admin_session Cookie,并拒绝未认证请求。

admin_sessionreview_admin_session

请求参数

路径参数

NameTypeRequiredDescriptionNotes
taskIdstringRequired已审核通过任务的标识。-
jobIdstringRequired待重试的失败发布任务标识。-

Cookie

NameTypeRequiredDescriptionNotes
review_admin_sessionstringRequired承载 review_admin_session Cookie。-

请求体结构

无请求体none
无请求体
无需请求体。

响应结构

JSON 对象json

执行重试发布后的完整最新任务记录。

结构说明
  • 线上处理器会同步执行重试发布,并返回包含原 failed 任务和新任务的最新记录。
NameTypeRequiredDescriptionNotes
idstringRequired任务标识。-
publicAccount'silicon-rise' | 'carbon-fitness'Required目标公众号。-
topicstringRequired任务主题。-
candidatesReviewTaskCandidatesRequired创建任务时提交的候选内容。-
status'pending_review' | 'approved' | 'published' | 'rejected_rework'Required当前任务生命周期状态。-
selectionsReviewSelections | undefinedOptional审核确认后的选中结果,审核或返工后会出现。-
manualOverridesReviewManualOverrides | undefinedOptional审核员的人工覆写审计轨迹;只在发生手动改写时出现。-
bodyDraftReviewBodyDraft | undefinedOptional用于生成发布快照的正文草稿。-
rejectedElementsElementKey[] | undefinedOptional任务被驳回返工时仍待修正的字段;article 可用 title、summary、body、bodyImages、coverImage,image_post 可用 title、description、images、coverCrop、commentSettings。-
lockedSelectionsPartial<ReviewSelections> | undefinedOptional返工期间保持锁定的已确认字段。-
rejectionReasonRejectionReasonCategory | undefinedOptional任务被退回返工的原因。-
rejectionNotestring | undefinedOptional返工补充说明。-
publishJobsPublishJobRecord[]Required与任务关联的发布任务列表。-
timelineTimelineEvent[]Required任务生命周期审计轨迹。-
createdAtstringRequiredISO 格式创建时间。-
updatedAtstringRequiredISO 格式最后更新时间。-

状态码

NameTypeRequiredDescriptionNotes
HTTP 200成功Optional重试任务已创建并在当前请求内执行完成。-
HTTP 401未授权Optional管理员会话缺失或无效。-
HTTP 404未找到Optional任务或源发布任务不存在。-
HTTP 409冲突Optional任务未通过审核,或源任务不是 failed。-
HTTP 500内部服务器错误Optional仓储写入失败,或同步重试发布执行失败。-

约束条件

  • 源发布任务必须处于 failed 状态。
  • 重试会复用原始快照,并增加尝试次数。
  • 重试不会读取当前最新 selections,而是严格复用源失败记录的快照。

副作用

  • 基于失败任务快照创建新的发布任务。
  • 在当前请求内直接执行重试发布。
  • 在任务历史中保留原 failed 任务。

请求示例

POST /api/review/tasks/:taskId/publish-jobs/:jobId/retryhttp
POST /api/review/tasks/:taskId/publish-jobs/:jobId/retry

Headers
{
  "cookie": "review_admin_session=eyJhbGciOi..."
}

Params
{
  "taskId": "task_123",
  "jobId": "job_123"
}

响应示例

HTTP 200http
HTTP/1.1 200

Body
{
  "id": "task_123",
  "publicAccount": "silicon-rise",
  "topic": "上线公告",
  "candidates": {
    "titles": [
      "上线公告草稿"
    ],
    "summaries": [
      "一段简短摘要"
    ]
  },
  "status": "published",
  "selections": {
    "title": "已通过标题",
    "summary": "已通过摘要",
    "body": "# 草稿正文",
    "bodyImages": [
      "https://example.com/body.jpg"
    ],
    "coverImage": "https://example.com/cover.jpg"
  },
  "bodyDraft": {
    "markdown": "# 草稿正文",
    "sourceBodyCandidateId": "body_candidate_launch_v1",
    "sourceBodyCandidate": "# 草稿正文",
    "bodyEditedFromCandidate": false,
    "themeTemplate": "cyan"
  },
  "publishJobs": [
    {
      "id": "job_123",
      "taskId": "task_123",
      "status": "failed",
      "triggerMode": "manual",
      "attemptCount": 1,
      "queuedAt": "2026-04-20T08:05:00.000Z",
      "finishedAt": "2026-04-20T08:08:00.000Z",
      "lastError": "发布暂时失败",
      "snapshot": {
        "title": "已通过标题",
        "summary": "已通过摘要",
        "themeTemplate": "cyan",
        "themeConfig": {
          "cssVariables": {
            "--theme-accent": "#00c2d1"
          }
        },
        "bodyMarkdown": "# 草稿正文",
        "bodyHtml": "<h1>草稿正文</h1>",
        "bodyImages": [
          "https://example.com/body.jpg"
        ],
        "coverImage": "https://example.com/cover.jpg",
        "sourceBodyCandidate": "# 草稿正文",
        "bodyEditedFromCandidate": false
      }
    },
    {
      "id": "job_456",
      "taskId": "task_123",
      "status": "succeeded",
      "triggerMode": "manual",
      "attemptCount": 2,
      "queuedAt": "2026-04-20T08:09:00.000Z",
      "startedAt": "2026-04-20T08:09:10.000Z",
      "finishedAt": "2026-04-20T08:09:30.000Z",
      "snapshot": {
        "title": "已通过标题",
        "summary": "已通过摘要",
        "themeTemplate": "cyan",
        "themeConfig": {
          "cssVariables": {
            "--theme-accent": "#00c2d1"
          }
        },
        "bodyMarkdown": "# 草稿正文",
        "bodyHtml": "<h1>草稿正文</h1>",
        "bodyImages": [
          "https://example.com/body.jpg"
        ],
        "coverImage": "https://example.com/cover.jpg",
        "sourceBodyCandidate": "# 草稿正文",
        "bodyEditedFromCandidate": false
      }
    }
  ],
  "timeline": [],
  "createdAt": "2026-04-20T08:00:00.000Z",
  "updatedAt": "2026-04-20T08:09:00.000Z"
}

相关链接