接口参考
发布任务参考
手动排队发布任务与重试路由说明。
- 创建接口
- /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
请求参数
路径参数
| Name | Type | Required | Description | Notes |
|---|---|---|---|---|
| taskId | string | Required | 已审核通过任务的标识。 | - |
Cookie
| Name | Type | Required | Description | Notes |
|---|---|---|---|---|
| review_admin_session | string | Required | 承载 review_admin_session Cookie。 | - |
请求体结构
无请求体none
无请求体
无需请求体。
响应结构
JSON 对象json
执行发布后的完整最新任务记录。
结构说明
- 线上处理器会同步执行发布,并返回包含 selections、publishJobs 和 timeline 的最新任务记录。
- contentType 为 `image_post` 时,发布侧会创建或更新微信 `newspic` 草稿。
| Name | Type | Required | Description | Notes |
|---|---|---|---|---|
| id | string | Required | 任务标识。 | - |
| publicAccount | 'silicon-rise' | 'carbon-fitness' | Required | 目标公众号。 | - |
| topic | string | Required | 任务主题。 | - |
| candidates | ReviewTaskCandidates | Required | 创建任务时提交的候选内容。 | - |
| status | 'pending_review' | 'approved' | 'published' | 'rejected_rework' | Required | 当前任务生命周期状态。 | - |
| selections | ReviewSelections | undefined | Optional | 审核确认后的选中结果,审核或返工后会出现。 | - |
| manualOverrides | ReviewManualOverrides | undefined | Optional | 审核员的人工覆写审计轨迹;只在发生手动改写时出现。 | - |
| bodyDraft | ReviewBodyDraft | undefined | Optional | 用于生成发布快照的正文草稿。 | - |
| rejectedElements | ElementKey[] | undefined | Optional | 任务被驳回返工时仍待修正的字段;article 可用 title、summary、body、bodyImages、coverImage,image_post 可用 title、description、images、coverCrop、commentSettings。 | - |
| lockedSelections | Partial<ReviewSelections> | undefined | Optional | 返工期间保持锁定的已确认字段。 | - |
| rejectionReason | RejectionReasonCategory | undefined | Optional | 任务被退回返工的原因。 | - |
| rejectionNote | string | undefined | Optional | 返工补充说明。 | - |
| publishJobs | PublishJobRecord[] | Required | 与任务关联的发布任务列表。 | - |
| timeline | TimelineEvent[] | Required | 任务生命周期审计轨迹。 | - |
| createdAt | string | Required | ISO 格式创建时间。 | - |
| updatedAt | string | Required | ISO 格式最后更新时间。 | - |
状态码
约束条件
- 已审核通过的任务可以创建微信草稿;已发布任务会用最近一次成功的 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
请求参数
路径参数
Cookie
| Name | Type | Required | Description | Notes |
|---|---|---|---|---|
| review_admin_session | string | Required | 承载 review_admin_session Cookie。 | - |
请求体结构
无请求体none
无请求体
无需请求体。
响应结构
JSON 对象json
执行重试发布后的完整最新任务记录。
结构说明
- 线上处理器会同步执行重试发布,并返回包含原 failed 任务和新任务的最新记录。
| Name | Type | Required | Description | Notes |
|---|---|---|---|---|
| id | string | Required | 任务标识。 | - |
| publicAccount | 'silicon-rise' | 'carbon-fitness' | Required | 目标公众号。 | - |
| topic | string | Required | 任务主题。 | - |
| candidates | ReviewTaskCandidates | Required | 创建任务时提交的候选内容。 | - |
| status | 'pending_review' | 'approved' | 'published' | 'rejected_rework' | Required | 当前任务生命周期状态。 | - |
| selections | ReviewSelections | undefined | Optional | 审核确认后的选中结果,审核或返工后会出现。 | - |
| manualOverrides | ReviewManualOverrides | undefined | Optional | 审核员的人工覆写审计轨迹;只在发生手动改写时出现。 | - |
| bodyDraft | ReviewBodyDraft | undefined | Optional | 用于生成发布快照的正文草稿。 | - |
| rejectedElements | ElementKey[] | undefined | Optional | 任务被驳回返工时仍待修正的字段;article 可用 title、summary、body、bodyImages、coverImage,image_post 可用 title、description、images、coverCrop、commentSettings。 | - |
| lockedSelections | Partial<ReviewSelections> | undefined | Optional | 返工期间保持锁定的已确认字段。 | - |
| rejectionReason | RejectionReasonCategory | undefined | Optional | 任务被退回返工的原因。 | - |
| rejectionNote | string | undefined | Optional | 返工补充说明。 | - |
| publishJobs | PublishJobRecord[] | Required | 与任务关联的发布任务列表。 | - |
| timeline | TimelineEvent[] | Required | 任务生命周期审计轨迹。 | - |
| createdAt | string | Required | ISO 格式创建时间。 | - |
| updatedAt | string | Required | ISO 格式最后更新时间。 | - |
状态码
约束条件
- 源发布任务必须处于 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"
}