コンテンツへスキップ

media AI活用の最前線

【2026年最新】Claude Codeからnoteに自動投稿する方法|Playwright完全ガイド

【2026年最新】Claude Codeからnoteに自動投稿する方法|Playwright完全ガイド

結論: note.comに公式APIはありませんが、Claude Code × Playwright(ブラウザ自動操作)を組み合わせることで、Markdownファイルからnoteへの下書き投稿を自動化できます。非公式API経由の方法も存在しますが、利用規約リスクがあるため、本記事では安全なPlaywright方式を中心に解説します。

この記事の要点:

  • note.comには公式APIがないため、Playwright(ブラウザ自動操作)が現実的な自動化手段
  • Claude Codeで生成したMarkdownを自動でnoteに貼り付け、画像アップロード・タグ設定まで一括処理できる
  • 複数記事の一括投稿は「下書き保存→後で確認」ワークフローで安全に運用できる

対象読者: Claude Codeで記事生成を行い、noteへの投稿を効率化したいライター・クリエイター・マーケター

読了後にできること: 今日中にPlaywrightをインストールし、noteへの自動貼り付けスクリプトの最小構成を動かせる


「Claudeで記事を書いたあと、noteに貼り付けるのが毎回面倒で……」

AI研修で、noteを使って情報発信をしている方からよく聞く悩みです。先日、ある顧問先(従業員5名のスタートアップ)でこんな場面がありました。Claude Codeで週5本ペースで記事を生成できるようになったのに、「noteへのコピペ作業が追いつかなくて、結局週2本しか出せていない」という話を聞きました。

実は、この「コピペ作業」こそが自動化しやすい部分なんです。note.comには残念ながら公式APIがありませんが、Playwright(ブラウザを自動操作するライブラリ)を使えば、「記事テキストの貼り付け→タグ設定→下書き保存」まで自動化できます。

この記事では、Claude Codeで生成したMarkdownをnoteに自動投稿するフルパイプラインを、コピペ可能なコードと共に解説します。非公式API経由の方法が話題になることもありますが、利用規約との兼ね合いや突然の仕様変更リスクを踏まえ、本記事では安全に長く使えるPlaywright方式を中心に紹介します。

Claude Codeの活用事例全般については、ChatGPTビジネス活用完全ガイドでも幅広く解説しています。

まず試したい「1分で動く最小構成」

まず環境構築から始めましょう。Playwrightのインストールは3コマンドで完了します。

pip install playwright anthropic python-dotenv
playwright install chromium

次に、noteへのログインと記事貼り付けを行う最小スクリプトです。これが動けば、あとはカスタマイズするだけです。

from playwright.sync_api import sync_playwright
import os

NOTE_EMAIL = os.getenv("NOTE_EMAIL")
NOTE_PASSWORD = os.getenv("NOTE_PASSWORD")

def post_to_note_draft(title: str, body_markdown: str) -> str:
    """noteに下書きとして記事を投稿する(最小構成)"""
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)  # headless=Falseで動作確認
        page = browser.new_page()

        # 1. noteにログイン
        page.goto("https://note.com/login")
        page.fill('input[name="email"]', NOTE_EMAIL)
        page.fill('input[name="password"]', NOTE_PASSWORD)
        page.click('button[type="submit"]')
        page.wait_for_url("https://note.com/", timeout=10000)
        print("ログイン完了")

        # 2. 新規記事作成ページへ
        page.goto("https://note.com/notes/new")
        page.wait_for_load_state("networkidle")

        # 3. タイトルを入力
        page.click('[data-placeholder="タイトル"]')
        page.type('[data-placeholder="タイトル"]', title)

        # 4. 本文エリアにMarkdownをペースト
        # noteのエディタはMarkdown貼り付けに対応(見出し・リストが反映される)
        page.click('[contenteditable="true"]')
        page.evaluate(f"""
            const target = document.querySelector('[contenteditable="true"]');
            target.focus();
            document.execCommand('selectAll', false, null);
        """)
        page.keyboard.press("Delete")

        # クリップボード経由で貼り付け(日本語を正しく扱うため)
        import subprocess
        subprocess.run("pbcopy", input=body_markdown.encode(), check=True)
        page.keyboard.press("Meta+v")  # macOSの場合。Linuxは Ctrl+v
        page.wait_for_timeout(1000)

        # 5. 下書き保存(公開はしない)
        save_button = page.locator('button:has-text("下書き保存")')
        save_button.click()
        page.wait_for_timeout(2000)

        # 現在のURLを取得
        current_url = page.url
        print(f"下書き保存完了: {current_url}")
        browser.close()
        return current_url

研修先でこのスクリプトを初めて動かしたとき、「え、本当に自動で貼り付けてくれた!」と歓声が上がりました。Playwrightはブラウザの動きを全部再現するので、人間が手で操作するのとまったく同じ動作をします。

Claude Codeで記事を生成する(プロンプト設計)

次に、Claude Codeで記事本文を生成する部分を設計します。note向けの記事は、Webブログよりも読み物的・エッセイ的な文体が好まれるため、専用のプロンプトを作ります。

import anthropic

client = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))

NOTE_SYSTEM_PROMPT = """
あなたはnote.comで月10万PVを達成しているライターです。
以下のルールでnote記事を書いてください:

【文体】
- です・ます調(読み物感を大切に)
- 一文は60文字以内。長すぎる文は分割
- 「〜ですよね」「実は〜」「正直に言うと〜」の共感表現を使う
- 専門用語には必ず平易な説明を添える

【構造】
- 導入: 共感できる悩みや状況から始める(3段落)
- 本論: H2を3〜5個使って体系的に整理
- 結び: 読者へのエールで終わる(押しつけでなく)
- 文字数: 3000〜5000字(noteの推奨長)

【Markdownルール】
# → H1(タイトルのみ)
## → H2(大見出し)
### → H3(小見出し)
- → 箇条書き

【禁止】
- ハッシュタグ(記事内に入れない。後でnote側で設定)
- 「〜しましょう!」の命令形(読者が引く)
- 専門用語のみの羅列

不足している情報があれば、最初に質問してから作業を開始してください。
"""

def generate_note_article(topic: str, keywords: list[str]) -> dict:
    """Claude APIでnote記事を生成する"""
    prompt = f"""
    以下のトピックでnote記事を書いてください。

    トピック: {topic}
    含めるキーワード: {', '.join(keywords)}

    出力形式(JSON):
    {{
        "title": "記事タイトル(30文字以内が理想)",
        "body": "記事本文(Markdown形式)",
        "excerpt": "120文字以内の要約",
        "tags": ["タグ1", "タグ2", "タグ3"]
    }}
    """

    message = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=4096,
        system=NOTE_SYSTEM_PROMPT,
        messages=[{"role": "user", "content": prompt}]
    )

    import json, re
    json_match = re.search(r'{.*}', message.content[0].text, re.DOTALL)
    if json_match:
        return json.loads(json_match.group())
    raise ValueError("JSON形式での出力が取得できませんでした")

AI活用、何から始めればいい?

100社以上の研修実績をもとに、30分の無料相談で貴社の課題を整理します。

無料相談はこちら 資料ダウンロード(無料)

画像アップロードとSEOメタ設定

noteには「ヘッダー画像」と「アイキャッチ画像」の2種類があります。Playwrightでこれらを自動設定する方法を解説します。

ヘッダー画像のアップロード

def upload_header_image(page, image_path: str):
    """noteのヘッダー画像をアップロードする"""
    # ヘッダー画像エリアのホバー
    header_area = page.locator('.note-header-image, [class*="HeaderImage"]')
    header_area.hover()

    # 「画像を変更」ボタンをクリック
    change_btn = page.locator('button:has-text("画像を変更"), button:has-text("画像を追加")')
    if change_btn.count() > 0:
        change_btn.click()

        # ファイルアップロードダイアログへの対応
        with page.expect_file_chooser() as fc_info:
            page.locator('input[type="file"]').click()
        file_chooser = fc_info.value
        file_chooser.set_files(image_path)

        # アップロード完了を待つ
        page.wait_for_timeout(3000)
        print(f"ヘッダー画像アップロード完了: {image_path}")
    else:
        print("ヘッダー画像ボタンが見つかりませんでした(スキップ)")

タグの設定

def set_note_tags(page, tags: list[str]):
    """noteにタグを設定する"""
    # タグ入力エリアを探す
    tag_input = page.locator('input[placeholder*="タグ"], input[placeholder*="tag"]')
    if tag_input.count() == 0:
        # 公開設定ダイアログ内にある場合
        page.click('button:has-text("公開設定")')
        page.wait_for_timeout(500)
        tag_input = page.locator('input[placeholder*="タグ"]')

    for tag in tags[:5]:  # noteは最大5タグ
        tag_input.fill(tag)
        page.keyboard.press("Enter")
        page.wait_for_timeout(300)
        print(f"タグ設定: {tag}")

正直に言うと、noteのエディタは内部仕様の変更が頻繁にあります。特に画像まわりのセレクター(要素の識別子)はアップデートのたびに変わることがあります。本番運用では、週1回程度スクリプトの動作確認をすることをおすすめします。顧問先でも「2ヶ月に1回、セレクターが変わって動かなくなる」という経験をしています。

複数記事の一括投稿ワークフロー

複数記事を一括で下書き保存するワークフローを作ります。研修先では「週初めに10本分の下書きを一気に作って、毎日1本ずつ公開」という運用が定着しました。

バッチ処理スクリプト

import json, time, os
from pathlib import Path

def batch_post_to_note(articles_dir: str = "./note_articles"):
    """ディレクトリ内のMarkdownファイルを全てnoteに下書き投稿する"""
    articles_dir = Path(articles_dir)
    md_files = sorted(articles_dir.glob("*.md"))

    print(f"対象記事数: {len(md_files)}")
    results = []

    for i, md_file in enumerate(md_files, 1):
        # メタデータファイルを読み込む(同名のJSONファイル)
        meta_file = md_file.with_suffix(".json")
        if meta_file.exists():
            meta = json.loads(meta_file.read_text())
        else:
            meta = {
                "title": md_file.stem.replace("-", " "),
                "tags": [],
                "image": None,
            }

        body = md_file.read_text()
        print(f"[{i}/{len(md_files)}] 処理中: {meta['title']}")

        try:
            url = post_to_note_draft(meta["title"], body)
            results.append({"file": str(md_file), "url": url, "status": "success"})
            print(f"  完了: {url}")
        except Exception as e:
            print(f"  エラー: {e}")
            results.append({"file": str(md_file), "url": None, "status": f"error: {e}"})

        # noteへの負荷を避けるため3秒待機
        if i < len(md_files):
            time.sleep(3)

    # 結果をJSONに保存
    output_path = articles_dir / "batch_results.json"
    output_path.write_text(json.dumps(results, ensure_ascii=False, indent=2))
    print(f"n完了。結果: {output_path}")
    return results

Markdownファイルの構造

バッチ処理で使うMarkdownファイルの命名規則と、メタデータJSONの形式です。

# ディレクトリ構造
note_articles/
├── 2026-04-25-chatgpt-business-tips.md
├── 2026-04-25-chatgpt-business-tips.json  # メタデータ
├── 2026-04-26-ai-writing-guide.md
├── 2026-04-26-ai-writing-guide.json
└── batch_results.json  # 実行結果

# メタデータJSON(.json)の形式
{
    "title": "ChatGPTで仕事が変わった5つのこと",
    "tags": ["ChatGPT", "AI活用", "仕事術", "生産性向上"],
    "image": "./images/chatgpt-thumbnail.png",
    "scheduled_publish": "2026-04-26T09:00:00"
}

Claude Codeとの完全パイプライン構築

Claude Codeを使えば、「トピックリスト → 記事生成 → note下書き保存」まで全自動化できます。完全なパイプラインを組んでみましょう。

#!/usr/bin/env python3
"""
note_pipeline.py — Claude Codeで記事生成 → noteに下書き投稿まで自動化
使い方: python3 note_pipeline.py --topics topics.txt
"""

import anthropic, argparse, json, os, time
from pathlib import Path
from playwright.sync_api import sync_playwright
from dotenv import load_dotenv

load_dotenv()

def run_pipeline(topics_file: str, output_dir: str = "./note_articles"):
    """トピックリストから記事生成→note下書き保存まで実行"""
    output_dir = Path(output_dir)
    output_dir.mkdir(exist_ok=True)

    topics = Path(topics_file).read_text().strip().split("n")
    topics = [t.strip() for t in topics if t.strip()]
    print(f"対象トピック: {len(topics)}件")

    # Step 1: 記事生成
    claude_client = anthropic.Anthropic()
    for i, topic in enumerate(topics, 1):
        print(f"n[{i}/{len(topics)}] 生成中: {topic}")

        article = generate_note_article(topic, keywords=[])  # 上で定義した関数

        # ファイルに保存
        slug = topic[:30].replace(" ", "-").replace(" ", "-")
        md_path = output_dir / f"article_{i:02d}_{slug}.md"
        json_path = output_dir / f"article_{i:02d}_{slug}.json"

        md_path.write_text(article["body"])
        json_path.write_text(json.dumps({
            "title": article["title"],
            "excerpt": article["excerpt"],
            "tags": article["tags"],
        }, ensure_ascii=False, indent=2))

        print(f"  保存完了: {md_path}")
        time.sleep(2)  # API レート制限対策

    # Step 2: noteに一括下書き保存
    print("n--- noteに下書き保存を開始します ---")
    results = batch_post_to_note(str(output_dir))

    success = sum(1 for r in results if r["status"] == "success")
    print(f"n完了: {success}/{len(results)} 件成功")


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--topics", default="topics.txt")
    parser.add_argument("--output-dir", default="./note_articles")
    args = parser.parse_args()
    run_pipeline(args.topics, args.output_dir)

topics.txtの例

ChatGPTを使って議事録作成を5分に短縮した方法
AIで資料作成が3倍速くなった実体験
Claude Codeで週5本の記事を量産する仕組み
生成AIを業務に組み込んで変わった3つのこと
AIツールを半年使い続けてわかったこと

【要注意】note自動化の失敗パターンと回避策

失敗1: 利用規約に抵触する方法を使う

❌ 非公式APIをリバースエンジニアリングして直接呼び出す(突然動かなくなる・利用規約リスク)

⭕ Playwright(ブラウザ自動操作)を使う(人間の操作を再現するため相対的に安全)

なぜ重要か: note.comは過去にAPI仕様を変更して外部ツールを無効化した事例があります(2026年2月の仕様変更で複数のライブラリが動作停止)。利用規約を確認し、アカウントBANリスクを最小化する方法を選びましょう。Playwright方式も完全に安全とは言えませんが、人間の操作を再現しているため現実的なリスクは低いです。

失敗2: ヘッドレスモードで動作確認をしない

❌ いきなり headless=True で本番実行する

⭕ まず headless=False でブラウザを表示させながら、各ステップの動作を目視確認する

なぜ重要か: noteのUIはアップデートで変わることがあります。セレクターが変わると処理が途中で止まります。最初の動作確認は必ず目視で行いましょう。顧問先で headless=True のまま本番を走らせて、ログイン画面で止まっていたのに気づかなかった事故を見ています。

失敗3: 大量の記事を一気に投稿する

❌ 100本の記事を一晩で自動投稿しようとする

⭕ 1回のバッチは最大10〜20本。投稿間隔を3秒以上あける

なぜ重要か: 短時間に大量のリクエストを送るとnoteのサーバーがボット判定する可能性があります。アカウントが一時停止されると、それまでの記事も非表示になるリスクがあります。

失敗4: AIが生成した文章をそのまま投稿する

❌ Claude Codeで生成した記事を一切確認せずそのままnoteに公開する

⭕ 必ず「下書き保存 → 人間が読んで確認 → 公開」のフローを守る

なぜ重要か: AIが生成した文章には事実誤認や不自然な表現が含まれることがあります。noteでは自分の名前で公開されるため、信頼性のチェックは必ず人間が行う必要があります。「全自動=確認なし公開」にしてしまうと、誤情報を拡散するリスクがあります。

セキュリティ:ログイン情報の安全な管理

noteのメール・パスワードをコードに直書きするのは絶対にやめてください。環境変数または macOS Keychain を使いましょう。

# .envファイルに保存(Gitコミット禁止!)
NOTE_EMAIL=your@email.com
NOTE_PASSWORD=your_password_here

# .gitignoreに必ず追加
echo ".env" >> .gitignore

より安全な macOS Keychain 管理については、別記事「macOS KeychainでAPIキーをセキュアに管理する方法」で詳しく解説しています。ログイン情報はAPIキーと同様の重要度で扱いましょう。

運用のコツ:「週バッチ + 毎日1本公開」が最強

顧問先のスタートアップで実績が出た運用フローを紹介します。

  1. 月曜の朝: `python3 note_pipeline.py –topics topics.txt` を実行(7〜10本を一括で下書き保存)
  2. 月〜金: 毎朝noteの下書きを1本確認・微修正して公開
  3. 金曜: 今週の反応(スキ・コメント)を見て、来週のtopics.txtを更新

このフローで運用した結果、毎週5本のペース(測定期間: 3ヶ月)でnoteの更新が継続できています。AIが「週初めに1回」作業するだけで、あとは確認・公開のみ。作業時間は週あたり30分程度です。

AIを活用したコンテンツ戦略全般については、AI導入戦略完全ガイドでも解説しています。

まとめ:今日から始める3つのアクション

  1. 今日やること: `pip install playwright && playwright install chromium` を実行し、最小構成スクリプトで手動ログインができるか確認する(headless=False で目視確認)
  2. 今週中: Claude Codeでnote向け記事を1本生成し、Playwrightで下書き保存するパイプラインを動かしてみる
  3. 今月中: topics.txtを使ったバッチ処理を確立し、「月曜に週分を一括生成→毎日1本公開」の運用フローを作る

次回予告: 次の記事では「macOS KeychainでAPIキーを安全に管理する方法」を解説します。note・X・Claude APIなど複数のAPIキーを一元管理するベストプラクティスを紹介します。


あわせて読みたい:


著者: 佐藤傑(さとう・すぐる)
株式会社Uravation代表取締役。早稲田大学法学部在学中に生成AIの可能性に魅了され、X(@SuguruKun_ai)フォロワー約10万人。100社以上の企業向けAI研修・導入支援を展開。著書『AIエージェント仕事術』(SBクリエイティブ)。SoftBank IT連載7回執筆(NewsPicks最大1,125ピックス)。

ご質問・ご相談は お問い合わせフォーム からお気軽にどうぞ。


参考・出典

佐藤傑
この記事を書いた人 佐藤傑

株式会社Uravation代表取締役。早稲田大学法学部在学中に生成AIの可能性に魅了され、X(旧Twitter)で活用法を発信(@SuguruKun_ai、フォロワー10万人超)。100社以上の企業向けAI研修・導入支援を展開。著書累計3万部突破。SoftBank IT連載7回執筆(NewsPicks最大1,125ピックス)。

この記事をシェア

Claude Codeを本格的に使いこなしたい方へ

週1回・1時間のマンツーマン指導で、3ヶ月後にはClaude Codeで自走できる実力が身につきます。
現役エンジニアが貴方の業務に合わせてカリキュラムをカスタマイズ。

✓ 1対1のマンツーマン ✓ 全12回・3ヶ月 ✓ 実務ベースの指導
Claude Code 個別指導の詳細を見る まずは無料相談

contact お問い合わせ

生成AI研修や開発のご依頼、お見積りなど、
お気軽にご相談ください。

Claude Code 個別指導(1対1・12セッション)をご希望の方はこちらから別途お申し込みください

Claude Code 個別指導 無料相談