MENU

Claude Code でここまで作れる:朝のSNS投稿案を自動生成する自作ツールの中身

自分が運営している資産形成ブログ(tobionoreal.com)の記事を、X(旧 Twitter)でも紹介したい。そう思いながら、ずっと手が回っていませんでした。

記事は60本ほどあります。ニュースと絡めて紹介すれば読んでもらえる、という発想自体はあった。でも「毎朝ニュースを見て、自分のブログのどの記事と紐づけるか考えて、140字の投稿文を組み立てる」というもう1ピースを、ブログ執筆や本業の合間に差し込む時間枠がない。やりたかったけど、できていませんでした。

この「やりたいのにできない」を、Claude Code で自作したツールで解消しました。今は朝ボタンひとつでニュースを取得、使えそうなニュースを選択したらまたボタンひとつで下書き完成。あとは中身を確認してコピペして投稿するだけです。

この記事は、非エンジニアの私が Claude Code で何をどう作ったかを全部見せる記事です。システムプロンプトも、API 呼び出しのコードも、そのまま載せます。自分の業務に「これと似たパターンがあるかも」と思った方に、発想の材料として持ち帰ってほしい。


目次

ビフォー:やりたかったけど、手が回っていなかった

「SNSでニュースに関連するブログ記事を紹介する」を手作業でやろうとすると、次の工程が必要です。

  1. Yahoo!ニュースを開いて主要・経済・国内・国際・ITの5カテゴリを流し読み
  2. 「これなら自分のブログに関連づけられそう」なニュースを1本選ぶ
  3. 自分のブログ記事(60本ほど)の中から、そのニュースと相性がいい1本を思い出す
  4. X用に140字以内で投稿文を書く(ニュースへの触れ方→記事紹介→ハッシュタグ)
  5. 文字数が超過していたら短縮

ツールを作り込む過程で、自分でも何度か同じ作業を手でやってみました。1回あたり最低でも30分。毎朝これを続けるなら、月間で15時間は持っていかれる見積もりになります。「続けられる気がしない作業」を、やる前に自覚した形です。

特に詰まるのは、3番目の「記事を思い出す」工程でした。60本前後でも、自分が書いた記事を全部は覚えていられません。「確かこのテーマで書いたような気がする」と思って検索して、結局出てこず別のテーマに切り替える、ということが起きる。

4番目の「相性のいい1行目を考える」も、毎朝やると疲れます。ニュース見出しをそのまま引用するとつまらない、でも飛躍しすぎると何の話かわからない。このさじ加減を毎朝ゼロから考えるのは、やってみて「これは仕組み化しないと無理だ」と確信しました。


作ったもの:朝、2クリックで下書きが完成する

全体像は1枚でまとまります。

ブラウザで sns-tool の画面を開く
   ↓
【クリック①】「ニュース取得」ボタン
   ↓
   → Yahoo!ニュース5系統から RSS を取得
   → 取ったニュースが一覧表示される
   ↓
ニュース一覧から「今日はこれ」を1本選ぶ(人間)
   ↓
【クリック②】「下書き生成」ボタン
   ↓
   → 自分のブログ記事インデックスを読み込み
   → Claude API に「選んだニュース+記事一覧」を送る
   → 返ってきた JSON から X 投稿文を組み立て
   → 140字を超えていたら Claude に短縮リトライ
   → drafts/YYYY-MM-DD.md にも保存
   ↓
画面に下書きが表示される(コピーボタンで即クリップボード)

画面に表示される下書き(同じ内容は drafts/YYYY-MM-DD.md にもファイルで残ります)は、こんな中身です。ある日の実物をそのまま出します。

# Xポスト下書き - 2026-04-18

## メタ情報
- 参照ニュース: なぜ増えた 20代の生活保護受給者
- 参照ブログ記事: 20代の貯蓄額・負債額の実態|データが教える「今すぐ始めるべき理由」
- 選定理由: 20代の生活保護受給者増加というニュースを見て、若い世代の
  経済状況に不安を感じた読者が、同世代のリアルな貯蓄状況と今から始められる
  具体的な資産形成方法を知ることで、将来への不安を行動に変えられる
- 文字数: 141文字

## ポスト本文
20代の生保増加

同世代のお金事情を数字で確認

20代の資産形成が気になる方はこちら👇
📝 20代の貯蓄額・負債額の実態|データが教える「今すぐ始めるべき理由」
https://tobionoreal.com/tyotikutohusai-20/

#20代 #資産形成 #貯蓄

選定理由も自動で入ります。これがあるおかげで「なぜこのペアが選ばれたか」を自分で後追いできます。AI が勝手に選んだペアに違和感があったときの修正もやりやすい。

あとは画面のコピーボタンで投稿文をクリップボードに入れて X に貼るだけ。必要なら文言を微修正して投稿。


最初は完全自動化しようとした。でも手戻りした

最初のバージョン(V1)は、ニュース取得からペア選定まで全部 AI に任せていました。ニュース一覧とブログ記事一覧を渡して、「ベストなペアを選んで」と。

動きはしたのですが、ペア選定の精度が安定しませんでした。

原因は明確で、AI が読めるのは ニュースの「見出し」と「短い要約」だけだったことです。RSS から取れる情報はそこまでで、本文は URL の先にあります。Yahoo!ニュースのような媒体は見出しが抽象的だったり煽りっぽかったりして、本文を読まないと「何の話か」が掴みきれないケースがそれなりにあります。

結果、「見出しは金融系だが本文は別の話題」というニュースに、ブログの金融記事が紐づけられ、投稿文にした時点で違和感が出る、という外し方をしていました。

そこで V2 で、工程を組み替えました。

  • 人間(私)がYahoo!ニュースを実際に開いて本文を読み、「今日はこのニュース」を選ぶ
  • Claude がそのニュース1件に対して、ブログ記事60本の中から最適な1本を選び、投稿文を組み立てる

コード上は --news-url https://... でニュースURLを指定できるオプションを足しただけですが、「誰が何をやるか」の線引きが変わりました。

AI が情報を持っていない部分は、人間が前段で補う。全自動にこだわらない。

これが、このツールを作って一番腹落ちした学びでした。AI ツールは「全自動の夢」を追うより、AI と人間のどちらが判断すべきかを工程ごとに切り分けるほうが、現実的に使えるものになります。


Claude が担っている「判断」部分

V2 の状態で、誰が何をやっているかを並べるとこうなります。

工程誰がやる
RSSからニュース取得(候補を出す)Python(定型処理)
ニュースを読んで「今日はこれ」を1本選ぶ人間(私)
ブログ記事インデックスの作成Python(WordPress REST API)
選ばれたニュースに合うブログ記事を選ぶClaude
X投稿の1行目(フック文)生成Claude
140字オーバー時の短縮Claude
ファイル保存・ハッシュタグ整形Python(定型処理)

機械的な処理は Python で、「読者の気持ちに立って判断する」部分は Claude で「文脈の深読みが要る部分」は人間で、という分担です。

Claude にその判断を任せるために書いているのが、システムプロンプトです。このツールで実際に使っているものをそのまま出します。

SYSTEM_PROMPT = """\
あなたは経済・投資・マネー系ブログのSNS担当です。
今日のニュース一覧とブログ記事一覧を受け取り、
最も相性の良いニュース1件とブログ記事1件のペアを選んでください。

選定基準:
- そのニュースを見て気になった読者が、
  ブログ記事を読んだら「なるほど」と思えるか
- ブログ記事がニュースの背景・解説・具体的対策の
  いずれかを提供できるか
- 読者の行動(投資・節約・学習など)につながる記事を優先する

出力はJSON形式のみ。前置き・説明文は不要。\
"""

短いですが、このツールの性格はここで決まっています。

  • 「SNS担当」という役割を与える
  • 選び方の基準を3点、具体的に渡す
  • 「読者の行動につながる記事を優先」で、記事の質の方向を指定する
  • 出力形式を JSON に縛って、後段の Python 処理で扱いやすくする

「なるほど」と思えるか、という読者視点のゆるい言い回しが効きます。厳密な評価基準を定義するより、人間が普段使う言葉で頼んだほうがいい結果が返ってくる場面は多い。

ちなみに、このシステムプロンプト自体も Claude Code と対話しながら作りました。「経済ブログの SNS 担当として、ニュースと自分のブログ記事をペアで選ばせたい。選定基準はこういう観点で」と伝えると、たたき台を返してくれる。それを自分の感覚に合わせて削ったり言い換えたりして、今の形になっています。プロンプト設計そのものも、Claude Code との対話で組み立てられる──これが非エンジニアにとって一番大きい恩恵だと感じています。


出力を JSON で縛って、後段の処理を楽にする

システムプロンプトで「JSON で返せ」と伝えたので、ユーザーメッセージ側では期待する JSON スキーマを明示します。

## 出力形式(JSONのみ)
{
  "news_title": "選んだニュースのタイトル",
  "blog_title": "選んだブログ記事のタイトル",
  "blog_url":   "選んだブログ記事のURL",
  "reason":     "選んだ理由(内部ログ用、日本語)",
  "hook":    "フック文(Xの1行目。30文字以内)",
  "bridge":  "ニュースとブログをつなぐ一文。40文字以内",
  "cta":     "CTAテキスト。「〜な方はこちら」など。20文字以内",
  "hashtags": ["タグ1", "タグ2", "タグ3"]
}

ポイントは フィールドごとに文字数の上限を書いていることです。

これを書かないと、hook が長くなりすぎて最終的な投稿が140字を超える確率が跳ね上がります。最初に入れた制約がそのまま後段の処理コストになるので、プロンプトで縛れるところは縛ってしまうのが楽です。

ユーザーメッセージの残りの部分では、選んだ1本のニュース(タイトル・URL・要約)と、自ブログ記事一覧(タイトル・URL・抜粋・タグ)を整形して渡しています。ここは各自のブログ構成に依存するので、詳細は省略します。


Claude API の呼び出しは20行で済む

実際に Claude を呼んでいる部分のコードです。

import anthropic
import json
import re

def call_matching_api(client, news_items, blog_posts):
    user_msg = build_user_message(news_items, blog_posts)
    resp = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=1024,
        system=SYSTEM_PROMPT,
        messages=[{"role": "user", "content": user_msg}],
    )
    raw = resp.content[0].text.strip()
    # JSON 部分だけ抽出(前後に余分なテキストがある場合も対応)
    m = re.search(r"\{[\s\S]*\}", raw)
    if not m:
        raise ValueError("JSONが見つかりませんでした")
    return json.loads(m.group())

もちろん、私自身が書いたコードは1行もありません。実際にやったのは「何がしたいのかを Claude Code に伝えただけ」。これだけで、Claude の判断力が使えます。

このコードがやっているのは、anthropic というライブラリに API キーを渡して、モデル名・システムプロンプト・ユーザーメッセージを投げる。返ってきたテキストから JSON を取り出す。それだけです。

「AI を業務に組み込む」と聞くと構えてしまいますが、実装の入口はこのくらい軽いです。


気の利いた後処理も AI に頼める:140字オーバー時の自動短縮

Claude が組み立てた投稿文は、フック・ブリッジ・CTA・ブログタイトル・URL・ハッシュタグを連結した結果、140字を超えることがあります。

手動でやっていたら「どこを削るか」で毎回悩んでいた工程ですが、これも Claude に任せています。

  • まず hook(1行目)を目標文字数まで短縮してと依頼
  • それでも収まらなければ bridge(繋ぎ)を短縮
  • ブログタイトルと URL は情報の本体なので削らない

「意味・トーンを保ちつつ、短縮後のテキストのみ出力してください」と頼むだけ。この人間がやっていた「気の利いた後処理」をプロンプト1つで任せられるのが、AI を組み込む価値のわかりやすい部分です。


同じ発想で何が作れるか

このツールは「情報源 × 自分の資産 → 活用案」という構造でできています。

この構造はかなり応用が効きます。自分の業務で「毎朝、外の情報を見て、自社の何かと突き合わせて、次のアクションを決めている」作業があれば、それはほぼ全部同じ作り方ができます。

情報源自社の資産アウトプット
問屋からの新着メール自社在庫・販売実績今日の発注候補リスト
競合の動向RSS・プレスリリース自社サービスの特徴一覧差別化訴求メモ
業界ニュース社内Wiki・過去資料朝会の話題案
顧客からの問い合わせログFAQ・商品マニュアル返信ドラフト
今日の気温・天気過去の販売データ仕入れ判断メモ

「情報を見て」「自社のものと突き合わせて」「判断する」作業は、どの業種にも必ず何かあります。そこにツールを1本置けるかどうかで、毎朝の認知負荷が変わってきます。

そして忘れてはいけないのが、**完全自動化にこだわらなくていい**こと。文脈の深読みが要る部分は人間に残しておけば、その他の8割を AI と機械処理で回せる、という設計で十分機能します。


作ってみてわかった「非エンジニアでもここまで来れる」こと

このツールのコード総量は Python で約800行です(Web UI 部分を除いた、毎日動くスクリプトの合計)。

使われている技術は次の4つだけ。

  • Python:スクリプト言語。非エンジニアにも入りやすい
  • anthropic:Claude API 公式 SDK
  • feedparser:RSS を読むためのライブラリ
  • requests:WordPress REST API を叩くため

どれも無料で、インストールはコマンド1行です。特別な開発環境は要りません。

正直に書くと、このツールの設計は私一人では作れなかったはずです。Claude Code と対話しながら「こういうものが欲しい」「こういう順で処理したい」と話していくうちに、関数の分け方・エラー時の挙動・設定ファイルの置き方、といった設計判断が形になっていきました。先ほどのシステムプロンプトも、V1→V2の手戻りも、すべて対話の中で形になったものです。

エラーで動かなくなったときも、エラーメッセージを貼り付けて「これ何?」と聞くだけで、原因と直し方を返してくれる。コードの知識がなくても「プロジェクトとして完成させられる」のが、Claude Code の一番ありがたいところです。


まとめ:やりたかった作業を、仕組みにして置く

この記事で伝えたかったことは3つです。

  1. 「やりたいけど時間がなくてできない」作業は、非エンジニアでも1本のツールで仕組みにできる
  2. Claude に任せられるのは機械的な処理だけではなく、「読者の気持ちに立って選ぶ」といった判断も含まれる。ただし全自動にこだわらず、AI が読み切れない部分は人間が前段で補う設計のほうが現実的に機能する
  3. 実装の入口は驚くほど軽く、API 呼び出しは20行で済む。プロンプト設計も Claude Code との対話で組み立てられる

最初の一歩は、「やりたかったけど時間が作れずに諦めていた作業を書き出してみる」ことです。何を見て、何と突き合わせて、何をアウトプットしたいか。書き出せれば、それがそのまま Claude Code に渡す設計書になります。

あとは Claude Code と対話しながら組み立てていくだけ。私がやったのもそれだけです。


次に読んでほしい

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

東証プライム上場企業の中間管理職。プログラミング経験ゼロから Claude Code で業務効率化ツールを自作中。「非エンジニアが本当に作れるのか」の実験記録を一次情報で発信しています。

コメント

コメントする

CAPTCHA


目次