← 기사 목록
日本語https://qiita.com/tags/ai/feed

noteで稼ぎたい人向け、AIで仕込む『投稿仕組み化』5ステップ

추출된 키워드

26
AI·5投稿仕組み化·5note·5Claude Code·4YAML·4JSON·4Claude API·4副業·3個人開発·3エンゲージメント·3プロンプトテンプレート·3claude-3-5-sonnet-20241022·3Anthropic·3Discord·3Google検索·3X API·3レート制限·2スクレイピング·2エンジニア·2構造化ファイル·2Cloudflare·2playwright·2Selenium·2BeautifulSoup·2cron·2GitHub Actions·2

원문

11,755
noteで稼ぎたい人向け、AIで仕込む『投稿仕組み化』5ステップ

TL;DR

note等での定期投稿を自動化・効率化するための仕組み化戦略を紹介します。トピック収集→記事管理→生成→レビュー→エンゲージメント対応まで、AIと人手を組み合わせて手作業を50%削減できます。Claude Code + YAML管理 + スクリプト自動化で実装可能です。

なぜ投稿を仕込み化するのか

毎日複数の記事を継続的に投稿する際、最大の課題は「時間」です。トレンド情報を常時チェック→ネタ帳管理→下書き作成→公開確認→コメント対応という一連のフローを、すべて手作業で回すことは現実的ではありません。

本来やるべき仕事は「何を書くか」「本当にこの内容でいいか」という判断と、「読者との関係構築」です。それ以外のタスク(情報収集、ファイル管理、定型的な返信)は自動化すれば、月収向上に直結する時間が確保できます。

全体アーキテクチャ

┌─────────────────┐
│ トピック源      │ (X API, Google検索)
└────────┬────────┘
         ↓
┌─────────────────┐
│ JSONプール管理  │ (構造化ファイル)
└────────┬────────┘
         ↓
┌─────────────────┐
│ 下書き生成      │ (Claude API + プロンプト)
└────────┬────────┘
         ↓
┌─────────────────┐
│ 人手レビュー    │ (Discord通知)
└────────┬────────┘
         ↓
┌─────────────────┐
│ 自動投稿        │
└────────┬────────┘
         ↓
┌─────────────────┐
│ エンゲージメント│ (自動スキ・返信)
└─────────────────┘

ステップ1:トピック源を自動収集

毎朝JSONファイルにトピック候補を更新するスクリプトです。X API + Google検索を並列実行します。

import json
from datetime import datetime
from anthropic import Anthropic

client = Anthropic()

def collect_topics():
    """X + Google検索からトピック収集"""
    topics = []
    
    # X API (無料枠でキーワード検索)
    x_queries = ["Claude Code", "AI副業", "個人開発"]
    for query in x_queries:
        # X API実装(簡略)
        topics.extend(search_x_trends(query))
    
    # Google検索スクレイピング
    google_results = search_google(
        queries=["エンジニア 副業トレンド", "AI ツール比較"],
        top_k=10
    )
    topics.extend(google_results)
    
    # JSON保存
    with open("topics.json", "w", encoding="utf-8") as f:
        json.dump({"topics": topics, "updated_at": datetime.now().isoformat()}, f, indent=2)
    
    return topics

def search_x_trends(query: str):
    """X検索APIからトレンド取得"""
    return [
        {
            "id": f"x_{i}",
            "title": f"{query} related topic {i}",
            "source": "x_trending",
            "status": "new",
            "created_at": datetime.now().isoformat(),
            "reference_url": f"https://x.com/search?q={query}"
        }
        for i in range(5)
    ]

def search_google(queries: list, top_k: int = 10):
    """Google検索結果を構造化"""
    results = []
    for query in queries:
        #実装例:BeautifulSoup + Seleniumで取得
        results.append({
            "id": f"google_{query}",
            "title": f"検索: {query}の最新情報",
            "source": "google_search",
            "status": "new",
            "created_at": datetime.now().isoformat(),
            "reference_url": f"https://www.google.com/search?q={query}"
        })
    return results

実装のコツ

  • X API無料枠は月450リクエスト、キーワード指定で毎朝1回実行
  • Google検索スクレイピングはセッション分散、レート制限に注意
  • 毎朝5時に定期実行(cron or GitHub Actions推奨)

ステップ2:記事プールを構造化管理

YAML/JSONで統一管理し、スクリプトが自動で進捗を追跡できます。

topics:
  - id: topic_001
    title: Claude Codeの月額費用を副業で回収する戦略
    source: x_trending
    status: new
    created_at: 2026-05-16T09:00:00Z
    target_tone: business
    reference_url: https://x.com/...
    tags: [Claude, 副業, 個人開発]

  - id: topic_002
    title: 自動投稿ツールで失敗する理由
    source: google_search
    status: draft
    created_at: 2026-05-15T10:00:00Z
    target_tone: educational
    reference_url: https://example.com/...
    draft_path: drafts/topic_002.md
    tags: [自動化, note, 失敗事例]

  - id: topic_003
    title: XXX
    source: x_trending
    status: review
    created_at: 2026-05-14T14:00:00Z
    target_tone: analytical
    draft_path: drafts/topic_003.md
    reviewer_feedback: null

ステータス遷移:

new
draft
review
published
def update_topic_status(topic_id: str, new_status: str):
    """トピックのステータスを更新"""
    with open("topics.yaml", "r") as f:
        data = yaml.safe_load(f)
    
    for topic in data["topics"]:
        if topic["id"] == topic_id:
            topic["status"] = new_status
            break
    
    with open("topics.yaml", "w") as f:
        yaml.dump(data, f)

ステップ3:下書き生成プロンプトの設計

プロンプトテンプレートを固定化すると、出力ブレが劇的に減ります。

def generate_draft(topic: dict) -> str:
    """Claude APIで下書き生成"""
    
    system_prompt = """あなたはnoteのテクノロジー・副業領域の執筆者です。

【読者層】
- エンジニア(Web/バックエンド主体)
- 副業志向の個人開発者
- スタートアップ従事者

【禁止事項】
- 具体的な売上数値を根拠なく記載しない
- 個人の経験則を普遍的真実として述べない
- 商品紹介に見えるような記述

【構成】
1. 冒頭:実例 or 問題提示(50字以内)
2. 本論:3~4段落で具体的な理由・背景・実装例
3. 結論:示唆的に終わる(読者の次のアクションが見える)

【文字数】1200字程度
【トーン】敬体。淡々と事実ベース。"""
    
    user_prompt = f"""
【記事タイトル】
{topic['title']}

【トーン】
{topic['target_tone']}

【参考URL / 背景】
{topic.get('reference_url', 'なし')}

【タグ】
{', '.join(topic.get('tags', []))}

上記を踏まえて下書きを生成してください。
"""
    
    message = client.messages.create(
        model="claude-3-5-sonnet-20241022",
        max_tokens=2000,
        system=system_prompt,
        messages=[
            {"role": "user", "content": user_prompt}
        ]
    )
    
    draft = message.content[0].text
    
    # 下書きを保存
    draft_path = f"drafts/{topic['id']}.md"
    with open(draft_path, "w", encoding="utf-8") as f:
        f.write(draft)
    
    return draft

プロンプト設計の要点

  • 読者層を明確に指定
  • 禁止事項を列挙(AIの出力を絞る)
  • 構成を型として示す
  • トーン・文字数を固定

ステップ4:レビューと公開承認フロー

ここは絶対に自動化しません。Discord通知で人間が判定します。

import discord
import json

class DiscordReviewBot:
    def __init__(self, token: str, channel_id: int):
        self.token = token
        self.channel_id = channel_id
    
    async def notify_review_required(self, topic: dict, draft: str):
        """レビュー必要通知をDiscordへ"""
        intents = discord.Intents.default()
        client = discord.Client(intents=intents)
        
        @client.event
        async def on_ready():
            channel = client.get_channel(self.channel_id)
            
            message = f"""
📝 **レビュー待ちの記事があります**

【タイトル】
{topic['title']}

【タグ】
{', '.join(topic.get('tags', []))}

【下書き(先頭300字)】
{draft[:300]}...

【判定】
✅ 公開OK
❌ 修正が必要
🔄 別のプロンプトで再生成
"""
            
            await channel.send(message)
            await client.close()
        
        await client.start(self.token)
    
    def set_review_status(self, topic_id: str, status: str, feedback: str = ""):
        """Discord上の返答をもとにステータス更新"""
        with open("topics.yaml", "r") as f:
            data = yaml.safe_load(f)
        
        for topic in data["topics"]:
            if topic["id"] == topic_id:
                topic["status"] = status
                topic["reviewer_feedback"] = feedback
                break
        
        with open("topics.yaml", "w") as f:
            yaml.dump(data, f)

運用フロー

  • status: review
    のトピックを毎朝チェック
  • Discordで通知(下書き先頭300字)
  • 人間が ✅ または ❌ をリアクション
  • スクリプトがステータス更新

ステップ5:エンゲージメント自動巡回

スキ返し・フォローバックを自動化し、時間対効果を高めます。

def auto_engagement_loop():
    """24時間以内の自投稿に対するエンゲージメント自動処理"""
    
    # 過去24時間の自投稿取得(note API or Selenium)
    my_posts = fetch_my_recent_posts(hours=24)
    
    for post in my_posts:
        print(f"Processing: {post['title']}")
        
        # コメント取得
        comments = fetch_comments(post['id'])
        
        for comment in comments:
            # 既に返信済みなら スキップ
            if is_replied(comment['id']):
                continue
            
            # スキ返し
            like_comment(comment['id'])
            print(f"  ❤️ Liked comment: {comment['id']}")
            
            # 返信テンプレで自動返答
            reply_text = generate_reply_from_template(
                commenter_name=comment['author'],
                comment_content=comment['text'],
                post_title=post['title']
            )
            reply_comment(comment['id'], reply_text)
            print(f"  💬 Replied: {comment['id']}")
        
        # フォロー者の自動フォローバック
        new_followers = fetch_new_followers()
        for follower in new_followers:
            if not is_following(follower['id']):
                follow_user(follower['id'])
                print(f"  👥 Followed back: {follower['name']}")

def generate_reply_from_template(commenter_name: str, comment_content: str, post_title: str) -> str:
    """テンプレベースの返信生成"""
    
    # 簡単な分類
    if any(word in comment_content for word in ["ありがとう", "参考になった", "勉強になった"]):
        template = f"@{commenter_name} こちらこそ、コメントありがとうございます!こういった反応をもらえると、執筆の励みになります。"
    elif any(word in comment_content for word in ["質問", "教えて", "どう"]):
        template = f"@{commenter_name} 良い質問ですね。別記事で掘り下げたいと思います。フォローしていただければ更新通知が届きます!"
    else:
        template = f"@{commenter_name} コメントありがとうございました。{post_title}について、さらに深掘りしたネタがあれば記事にします!"
    
    return template

自動化の限界

  • テンプレート返信は「感謝」「質問対応」など基本パターンのみ
  • 複雑な議論・クレーム対応は人手で
  • スキ返しは時間対効果が高い(1分で100件可能)

つまづきポイント

1. X API のレート制限

無料枠は月450リクエスト。毎朝1クエリで30日で30リクエスト程度なので問題ありませんが、複数キーワード×複数アカウントだと上限に達します。対策:アカウント分散 or 有料プランへ。

2. Google検索スクレイピングの検出

短時間に大量リクエストするとブロックされます。対策:

  • ユーザーエージェント分散
  • リクエスト間に2~3秒の遅延挿入
  • Cloudflare対応(playwright推奨)

3. プロンプトテンプレートの「飽き」

同じプロンプトを長く使うと出力パターンが固定化します。対策:月1回、フィードバックを踏まえてプロンプト改定。

4. Claude API の コスト

月1000投稿なら、入出力合計で月200~500円程度。想定外コストではありませんが、大量生成の場合は事前に計算してください。

まとめ

noteで継続的に月収を狙う場合、「毎日人力で3本書く」はスケーリングしません。本当に重要な仕事(何を書くか / 品質判定 / 読者関係構築)に集中し、情報収集・定型処理・エンゲージメント定型対応はAIに任せることで、時間効率が2~3倍改善します。

  • トピック源の自動収集:朝30分削減
  • 下書き生成:1本30分→5分
  • エンゲージメント自動化:毎日30分削減

結果、本当に書く・考えるべき時間に週5~7時間を確保できます。

さらに詳しい実装手順はnoteで公開中

この記事では概要のみ紹介しました。実装の完全手順・プロンプト全文・運用ノウハウ・エラーハンドリングの工夫は以下のnoteで公開しています。