ブログ記事を書くのは大変です。さらに、その記事を宣伝するための「スレッド」を書くのはもっと大変です。ブログとは全く異なるライティングスタイル(パンチの効いたフック、簡潔さ)が求められるからです。

そこで私は、 OpenAI (GPT-4o)Twitter API を使って、このワークフローを自動化することにしました。ここでは、私のコンテンツを分析し、完璧にフォーマットされたスレッドを生成するスクリプトをどのように構築したかを紹介します。

問題点:「リンクを貼って祈るだけ」では読まれない

X(旧Twitter)にただリンクを貼っても、エンゲージメントはゼロです。アルゴリズムはリンク付きの投稿を冷遇します。ユーザーをプラットフォームに留める「スレッド」の方がパフォーマンスが良いのは明らかですが、3, 000文字の記事を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 (フック): 逆説的な意見や具体的な約束を入れること。「記事を書きました」という報告はNG。
  2. ツイート2-4 (価値): 1ツイートにつき1つのアイデア。
  3. 最後のツイート (CTA): 記事全文へのリンク。
const prompt = \`
あなたはプロのソーシャルメディアマネージャーです。
以下のブログ記事の内容を、エンゲージメントの高いTwitter/Xスレッドに変換してください。
制約事項: 各ツイートは日本語140文字以内に収めること。
構造: フック -> 価値 -> 価値 -> CTA
\`;

画像の自動処理

テキストだけのスレッドは退屈です。スクリプトを更新して、記事のフロントマターから heroImage を自動的に取得し、Xにアップロードして最初のツイートに添付するようにしました。

// ヒーロー画像を自動アップロード
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%は完了しており、あとはフックを微調整して送信ボタンを押すだけです。

ℹ️

このスクリプトは私のChrome拡張機能「HonoGear Extension」にも統合されています。 ブラウザから直接このワークフローをトリガーできます!