🚀

Zenn記事を自動でXに投稿するGitHub Actionsを作って公開したゾイ

に公開

🚀 はじめに

こんにちは。記事投稿大好きおじさんです。

Zennで記事を書いたら、できるだけ多くの人に読んでもらいたいですよね。しかし、記事を公開するたびにX(旧Twitter)に手動で投稿するのは、地味に面倒です。そんな悩みを解決するために、Zenn記事を公開したら自動でXに投稿してくれるGitHub Actionsを作成しました。

作成したものはこちらです。

https://github.com/kannna5296/zenn-x-post

この記事では、どのような仕組みで自動投稿を実現しているのか、工夫したポイントや実際に運用してみての所感などをまとめています。

  • Zennで記事を書いている方
  • SNS拡散を自動化したい方
  • GitHub ActionsやAI活用に興味がある方

このような方におすすめの内容です。

🎉 宣伝(GitHub MarketPlaceデビュー)

ちなみに、この自動投稿アクションはGitHub Marketplaceにも公開しています!

https://github.com/marketplace/actions/zenn-x-post-action

      - name: Get changed files
        id: diff
        run: |
          # 新規追加されたMarkdownファイルを取得
          NEW_FILES=$(git diff --name-only --diff-filter=A HEAD~1 HEAD | grep -E '\.(md)$' | grep -E '^(articles|books)/' || echo "")
          echo "new_files=${NEW_FILES}" >> $GITHUB_OUTPUT
          echo "[DEBUG] NEW_FILES: $NEW_FILES"
        
          # 変更されたMarkdownファイルを取得
          MODIFIED_FILES=$(git diff --name-only --diff-filter=M HEAD~1 HEAD | grep -E '\.(md)$' | grep -E '^(articles|books)/' || echo "")
          echo "modified_files=${MODIFIED_FILES}" >> $GITHUB_OUTPUT
          echo "[DEBUG] MODIFIED_FILES: $MODIFIED_FILES" 

      - name: Post to X with AI
        uses: kannna5296/zenn-x-post@v0

Zenn投稿をGitHub上で行っている皆さん、
あなたが運用しているリポジトリのGitHub Actionsに、上記のスクリプトを追加していただくだけで、

  • Zenn記事の新規公開や公開設定変更を自動検知
  • OpenAIによるAIリード文生成(オプション)
  • Xへのポスト

までを自動でやってくれるようになります。

「自分でスクリプトを書くのは面倒…」という方も、Marketplaceからすぐに使えるので、ぜひ試してみてください!

💪 背景・モチベーション

そもそも投稿するのが好きなんじゃ

私は「記事を書く」「自分や仲間の成果を発信する」こと自体が好きです。そのため、情報発信に関連するスクリプトを自分で組んでみたいという思いがありました。

投稿は好きですが、広報的なところはなるべく自動化したい

記事を書いたり発表したりするのは好きですが、書いた後の「広報」や「拡散」作業はそこまで得意ではありません。できればここは自動化して、なるべく自分の手を動かさずに済ませたいと考えています。SNS投稿のために毎回同じような作業を繰り返すのは、正直しんどいと感じていました。

魅力的なリード文はAIに任せて効率化したい

「広報」や「拡散」作業の中でも、個人的に一番めんどくせ〜のが

「ウケそうな、キャッチーなリード文を考えること」。

自分はコピーライティング能力がないので、このあたりが正直苦手です。生成AIにやらせたら、どれくらい効率化できるのか?結果が出るのか?という実験も兼ねて、リード文生成も自動化してみました。

※僕自身生成AI使ってプロダクト作るの初なので、この辺りのチューニング余地はいっぱいありそう。

🏗️ 仕組みの全体像

以下のようなシーケンスで動作しています。

  • 呼び出し元リポジトリ(あなたのZenn記事管理リポジトリ)でまず「変更ファイル情報の検知(diffなど)」を行います。
  • その情報やSecretsをMarketplaceのzenn-x-post Actionに渡して呼び出します。
  • アクション提供側リポジトリ内部で check-articles.py が新規/公開記事を検出します。
  • 必要に応じて generate-ai-lead.py でAIリード文を生成(OpenAI API)します。
  • tweet.py でX(旧Twitter)に投稿します。
  • 各ステップの結果やエラーはGitHub Actionsに返却されます。

このような流れで、Zenn記事の公開→AIリード文生成→X投稿までを自動化しています。

⚙️ 仕様検討で気をつけたこと

新規ファイル追加とpublished変更、両方で通知が飛ぶようにした

Zennの記事公開タイミングは大きく2パターンあります。

  • 新しく記事ファイル(Markdown)を追加したとき
  • 既存ファイルの published: falsepublished: true に変更したとき

どちらも「新しい記事が公開された」ことになるため、どちらのケースでもXに通知が飛ぶように設計しました。

特にZennでは「下書き状態で記事を作成し、後からpublishedをtrueにして公開する」という運用も多いので、ファイル追加だけでなく、frontmatterのpublished変更も検知できることが重要です。

このため、check-articles.py では「新規ファイル」だけでなく「既存ファイルのpublished変更」も差分として検出し、どちらも投稿対象に含めるようにしています。

OpenAIの利用は「課金したい人だけ」使える形にした

AIリード文生成にはOpenAI APIを利用していますが、API利用には課金が発生します。

「AIリード文は便利だけど、課金したくない人もいるはず」「シンプルな投稿だけで十分なケースもある」と考え、OpenAI APIキーを指定した場合だけAIリード文生成を有効化する設計にしました。

  • APIキー未設定の場合は、AIリード文生成をスキップし「タイトル+URL」だけをXに投稿します。
  • APIキーを設定すれば、AIリード文付きで投稿できます。

これにより、 「お金をかけたくない人は無料で」「AIを使いたい人は課金して」 という柔軟な運用が可能になっています。

また、ON/OFFがすぐに切り替えられるように、APIキーの有無で分岐するシンプルな実装にしています。

🛠️ 改善の余地

プロンプトエンジニアリングの工夫

特にリード文生成については、まだまだ改善の余地があると感じています。

AIリード文生成は便利ですが、現状では「本当に伝えたいポイント」や「記事の一番の魅力」がうまく出てこないことが多いです。特に技術記事の場合、読者に刺さるキーワードや文脈をAIがうまく拾えないこともあります。プロンプトや入力情報の工夫次第でもっと精度が上がるはずなので、今後は「どんな情報を渡すと良いリード文になるか?」を試行錯誤していきたいです。

現在指定しているプロンプトは以下の通りです。

あなたは技術記事のプロモーション専門家です。指定されたURLの記事を読み取って、Xで人々がクリックしたくなる魅力的なリード文を生成してください。要件: 90文字以内。技術的な価値を強調、読者の興味を引く表現、ハッシュタグは含めない、記事の具体的なメリットを明示。

正直なところ、見よう見まねで設定している部分が多いので、より良い指定方法があればぜひ教えていただきたいです。

認知増やすためのPDCA・計測

その投稿で認知は増えたのか?

いずれは、「自動投稿を導入したことで本当に記事の認知が増えたのか?」を計測する方向に持っていきたいです。

Xのインプレッション数やZenn側のPV数など、何かしらの指標で効果測定できる仕組みを作りたいと考えています。

現時点では「便利になったように感じる」「運用が楽になった」という実感はありますが、定量的な評価はできていません。

ABテスト的なこともやってみたい

AIリード文のパターンを複数用意して、どれが一番反応が良いかをABテスト的に比較したいと考えています。現状は1パターンしか投稿していませんが、今後は「複数パターン生成→ランダム投稿→反応計測」みたいな仕組みも試してみたいです。自動化の次は"効果検証"にもチャレンジしたいです。

インターフェース設計の課題

現状、変更記事の検知(どの記事のマークダウンファイルが変更になったかの判定)は呼び出し側リポジトリでやってもらう必要があります。GithubActionsの仕様上、こうするしかなかったのですが、これはインターフェースとしてやや微妙だと感じており、今後改善したいポイントです。

理想としては、アクション側が自律的に「どの記事が新規・公開になったか」を判定できるようにしたいですが、多分GitHub API連携など、もう少し複雑な仕組みが必要になりそうです。

📝 まとめ・今後やりたいこと

  • Zennと連携しているGitHubへの記事Pushをトリガーに、拡散のためのX投稿を自動化するワークフローを作成しました
  • 今後の改善アイデア
    • プロンプトエンジニアリング周りの改善
    • 認知アップのためのPDCAを回す仕組み作り
    • (呼び出すだけで良いように)インターフェースのシンプル化

読者へのメッセージ

ここまで読んでいただき、ありがとうございました!

「記事を書いたら自動で拡散」できる仕組みは、思った以上に便利で楽しいので、ぜひ試してみてください。

もし「ここをもっとこうしたい」「他のSNSにも対応したい」など要望やフィードバックがあれば、XやZennで気軽にコメントいただけると嬉しいです!


Discussion