写博客文章是一项艰苦的工作。更辛苦的是,为了宣传文章还要去写推特“线程(Thread)”。因为推文需要一种与博客完全不同的写作风格(强有力的钩子、极致的简洁)。

因此,我决定使用 OpenAI (GPT-4o)Twitter API 来自动化这一工作流。在这里,我将分享我是如何构建一个能够分析内容并生成完美格式线程的脚本的。

问题点:“只贴链接然后祈祷”是没用的

在 X(原 Twitter)上只贴一个链接,参与度基本为零。算法会对带有外部链接的投稿“冷处理”。显然,能让用户留在平台内的“线程”表现更好,但要把一篇 3000 字的文章改写成 5 条推文至少需要 30 分钟。

  • 目标: 将 Markdown 内容 → 转化为 5 条具有冲击力的推文。
  • 工具: TypeScript, twitter-api-v2, Vercel AI SDK。

脚本:post-to-x-thread.ts

我创建了一个以文件路径作为输入的 CLI 脚本。

# 使用方法如下
npx tsx scripts/utils/post-to-x-thread.ts --file src/content/blog/my-post.mdx --url https://...

“爆火”的提示词

秘诀不在于代码,而是在于提示词。我指示 AI 遵循具体的约束条件:

  1. 推文 1 (Hook): 加入反直觉的观点或具体的承诺。严禁使用“我写了一篇文章”这种汇报式开头。
  2. 推文 2-4 (价值): 每条推文只讲一个核心观点。
  3. 最后一条推文 (CTA): 附上文章全文链接。
const prompt = \`
你是一位专业的社交媒体经理。
请将以下博客文章的内容转换为具有高参与度的 Twitter/X 线程。
各条推文必须限制在日语 140 个字符以内。
结构:Hook -> 价值 -> 价值 -> CTA
\`;

图片自动处理

只有文字的线程是很枯燥的。我更新了脚本,使其能自动从文章的 Frontmatter 中获取 heroImage,上传到 X 并附加到第一条推文中。

// 自动上传 Hero 图片
const mediaId = await client.v1.uploadMedia(heroPath);
await client.v2.tweet("text, { media: { media_ids: ["mediaId"] } });

Deep Dive: 推文系列生成的 JSON Schema

让 AI 以“自由格式”输出会导致解析失败。高阶技巧是使用 Vercel AI SDK 的 object 模式来固定结构。

const threadSchema = z.object({
  tweets: z.array(z.object({
    content: z.string().max(140),
    hashtags: z.array(z.string())
  })).length(5)
});

这样可以确保始终接收到“包含 5 条推文的数组”,从而防止自动发布系统崩溃。

结果

现在,我可以在几秒钟内生成线程草稿。由于添加了 --dryRun 标志,我可以在实际发布前检查 AI 的输出。90% 的工作已经完成,剩下要做的只是微调一下 Hook,然后点下发送按钮。

ℹ️

这个脚本也集成到了我的 Chrome 插件“HonoGear Extension”中。 你可以直接在浏览器里触发这个工作流!