import { publishToutiaoArticle, } from "../../../../../packages/publisher-platforms/src/toutiao"; import type { JsonValue } from "@geo/shared-types"; import { fetchImageBlob, normalizeArticleHtml, sessionFetchJson, uploadHtmlImages, } from "./common"; import type { PublishAdapter } from "./base"; function buildResultPayload( articleId: string, mediaName: string, externalManageUrl: string, externalArticleUrl: string | null, ): Record { return { platform: "toutiaohao", media_name: mediaName, external_article_id: articleId, external_manage_url: externalManageUrl, external_article_url: externalArticleUrl, publish_type: "publish", }; } export const toutiaoAdapter: PublishAdapter = { platform: "toutiaohao", executionMode: "session", async publish(context) { context.reportProgress("toutiao.normalize_html"); const html = normalizeArticleHtml(context.article); const result = await publishToutiaoArticle( { title: context.article.title, html, coverAssetUrl: context.article.cover_asset_url, publishType: "publish", }, { fetchJson: (input, init) => sessionFetchJson(context.session, input, init), fetchImageBlob, uploadHtmlImages, reportProgress(stage) { context.reportProgress(`toutiao.${stage}`); }, }, ); if (!result.success) { const summary = result.code === "toutiaohao_not_logged_in" ? "头条号登录态失效,无法执行发布。" : result.code === "article_content_empty" ? "文章内容为空,无法推送到头条号。" : result.message || "头条号发布失败。"; return { status: "failed", summary, error: { code: result.code, message: result.message, }, }; } const payload = buildResultPayload( result.articleId, result.mediaName, result.externalManageUrl, result.externalArticleUrl, ); return { status: "succeeded", payload, summary: "头条号发布成功。", }; }, };