お久しぶりです。
Note Clientをリリースしてから2年以上が経過しました。この間一切アップデートなどをおこなっておりませんでしたが、ありがたいことに利用していただいた方が少なからずおり、開発者としては大変うれしく思います。
しかし、良い加減アップデートをしなければいけないと思っておりました。
2025年12月、年納め、やり残したことはNote Clientの改良。
設計を一からやり直して、Note Clientの欠点をなくすことに尽力しました。その結果、アップデートというより全く別のライブラリに仕上がっています。
Note Client って何?
そもそもNote Clientとはなにか?
Note Clientは私が開発した、noteというブログサービスに記事を投稿するためのPythonライブラリです。
開発した当時2023年は、生成AIが急速に普及した年でした。私は生成AIを活用して記事を量産すれば、儲かるのではないかと考えました。記事の作成は生成AIのAPIを利用して、記事の投稿にはブログをWordPressで構築していたので、WordPressのAPIを利用することにしました。
しかし、当時、私のブログはあまり固定読者がいなかったため、記事を更新するたびに、記事の内容を要約した集客用の記事をnoteに投稿していました。
そこまでの作業を自動化したかったため、noteに記事を投稿できる外部ツールを探しましたが、当時は私が調べた限りありませんでしたので、Note Clientを開発するに至りました。
重要事項
Note Client 2 はnote公式のサービスではございません。
内部APIやスクレイピングを利用している以上、以下のリスク・制約があります。
- note側の仕様変更で突然動かなくなる可能性
- アクセス頻度、挙動次第でアカウント側の制限につながる可能性
- 利用規約は必ず各自で確認し、問題が起きない運用にすること(大量連投などは避ける)
Note Client 2 何が変わったの?

Note Client 2では主に、初期バージョンで問題視されていた処理速度の改善に重きをおいて開発を行いました。
大きく変わった点は3つです。
- ログイン処理を高速なPlaywrightに置き換え
- cookieデータを保持してログイン処理を省略
- 内部APIを利用してさらなる高速化を実現
それぞれについて、より具体的に解説します。
Playwrightで高速かつ安定した処理を実現
Note Clientの初期バージョンでは、手動で記事を投稿する一連の流れを、Seleniumで自動化する仕様でした。
- noteにログインする
- 新規記事を作成する
- Markdownファイルの内容を一行ずつ入力する
- 投稿する
なぜNote Clientの初期バージョンは実用性に欠けるのか?
それはSeleniumの動作速度と安定性に問題がありました。
Seleniumは実行速度が遅く、動作も不安定になりがちでした。またブラウザの起動に多くのリソースを消費することや、セットアップが複雑でした。
Note Client 2ではPlaywrightを採用しました。
PlaywrightはMicrosoftが開発した比較的新しいライブラリで、実行速度が速く、安定して動作します。
cookieデータの再利用で高速化を実現
Note Clientの初期バージョンでは実行するたびにログイン処理をおこなっていましたが、Note Cilent 2では一度ログイン処理を実行すると、cookieデータを取得してローカルに保存します。
そして2回目以降は、ログイン処理をスキップして、ローカルのcookieデータを元に記事の投稿処理をおこないます。
これにより高速化を実現し、さらにnote側のサーバーに余計な負荷を与えなくて済みます。
一般的にはcookieデータは有効期限があり、有効期限が切れると、再度ログインして新しいcookieデータを取得する必要があります。
Note Client 2ではローカルにcookieデータが存在する場合は、有効期限をチェックして、使用可能ならログイン処理をスキップして次の処理を実行します。もし有効期限が切れている場合は、ログイン処理を実行して、cookieデータを更新してから、次の処理を実行します。
※noteのcookieデータの明確な有効期限は現在調査中ですが、毎日変更されるわけではないので、ログイン処理は週に1回か、月に1回程度で済みます。
内部APIの利用で高速化を実現
記事の作成・投稿に関しては、noteの内部APIを利用します。
APIは特定のデータ形式と構造を提供するように設計されているため、HTMLの変更によってスクレイピングプロセスが破損する可能性が低く、より安定した操作が可能になります。
またwebサイトを直接解析する従来のスクレイピングと異なり、構造化されたデータを直接取得できるので、データの抽出と処理を高速化することができます。
動作環境
- Python(3.x 推奨)
- Playwright(ログイン処理に使用)
- OS:Windows / macOS / Linux
※macOS、Linuxでの動作確認はおこなっておりませんが、Playwrightが対応している環境であれば良い。
※Pythonのバージョンテストはおこなっておりませんので、詳細はわかりませんが、私はPython 3.12.7で開発を行いました。
# Python 3.12.7
playwright==1.57.0
python-dotenv==1.2.1
requests==2.32.5
インストール手順

pip install NoteClient2
pip install python-dotenv
playwright install
※playwright本体はNoteClient2のインストール時に合わせて、インストールされます。このコマンドではplaywrightで使用されるブラウザなどをインストールします。
使い方(クイックスタート)
ここからはNote Client 2の基本的な使い方について解説します。
(1) .envを作成(推奨)
noteのログイン情報を.envファイルに記述します。
email=your_mail@example.com
password=your_password
user_url_id=your_note_user_urlname
user_url_idはnoteで自分のプロフィールページのURLの末尾のIDです。
私のプロフィールページは「https://note.com/naokun_gadget」なので、user_url_id = naokun_gadgetになります。
(2) Markdownファイルを作成
記事の内容はMarkdownファイルで記述します。
例:article.md
## 大見出し(H2): マークダウン記法テスト
これはnote.comでの表示を確認するためのテスト記事です。
以下に主要なフォーマットを列挙します。
### 小見出し(H3): テキスト強調
通常テキストです。
改行のテストです。
* **太字(Bold)**
* *斜体(Italic)* ※noteの環境によっては反映されない場合があります
* ~~取り消し線(Strikethrough)~~
---
### リスト(Unordered List)
- リストアイテム A
- リストアイテム B
- インデントされたリスト B-1
- インデントされたリスト B-2
### 番号付きリスト(Ordered List)
1. 手順 1
2. 手順 2
3. 手順 3
---
### 引用(Blockquote)
> これは引用ブロックです。
> noteでは左側に線が入るデザインになります。
> 複数行の引用も可能です。
---
### コードブロック(Code)
以下はPythonのコードブロックです:
```python
def hello_note():
print("Hello, note.com!")
return True
```
## リンク(Link)
[note](https://note.com/)へのリンクです。
Note Client 2では一般的なMarkdown記法に対応していますが、一部使用できない記法や、Note Client 2独自の記法がございます。詳細は後ほど紹介します。
(3) Pythonコードを実行
下記のサンプルコードを実行すると、初回はログイン処理が実行された後、記事の投稿処理が行われます。処理が成功すると、変数resultに記事のURLや実行情報などが格納されます。
また初回はログイン処理に成功するとsession.jsonにcookieデータが保存されます。次回以降はこのsession.jsonを読み込み、cookieデータが有効であればログイン処理をスキップして、処理を行います。もしcookieデータの有効期限が切れていれば、再度ログイン処理を実行しsession.jsonを更新します。
from NoteClient2 import NoteClient2
from dotenv import load_dotenv
import os
load_dotenv()
EMAIL = os.getenv("email")
PASSWORD = os.getenv("password")
USER_URL_ID = os.getenv("user_url_id")
client = NoteClient2(
email=EMAIL,
password=PASSWORD,
user_urlname=USER_URL_ID
)
result = client.publish(
title="Note Client2 テスト記事", # 記事のタイトルを指定
md_file_path="article.md", # 記事の内容を記述したMarkdownファイルのパスを指定
eyecatch_path="eyecatch.png", # アイキャッチ画像のパスを指定
hashtags=["Python", "note"], # ハッシュタグ(キーワード)を指定
price=500, # 有料記事の場合のみ指定(無料なら0 or 省略)
magazine_key=[], # マガジンに追加するならIDを入れる
is_publish=True # True=公開 / False=下書き(想定)
)
print(result)
ドキュメント(詳細な仕様について)
ここからはNote Client 2の詳細な仕様について解説します。
これを参考にNote Client 2を利用してください。
Markdownファイルで使用可能な記法
Note Client 2では多くのMarkdown記法に対応していますが、一部使用できない記法があります。
- 大見出し(##)
- 小見出し(###)
- リスト(インデントされたリストも可)
- 番号付きリスト
- 太文字
- 取り消し線
- 斜体(noteの環境によっては反映されない場合あり)
- 引用
- コードブロック
- リンク
- 画像
- インラインコード
- 数式
- テーブル
- 注釈
- 文字色
- 空白行
Markdownファイルの独自記法
Note Client 2には独自の記法がいくつか存在します。
<toc>:目次を挿入する位置に記述する<pay>:有料記事として投稿する場合、無料エリアと有料エリアの区切り位置に記述する
<toc>は一般的に記事の本文の前、Markdownファイルの1行目に記述します。
<pay>以前までは無料で閲覧可能だが、<pay>以降は有料記事として課金しないと閲覧できないようになります。
有料記事として投稿する場合は必ず<pay>をMarkdownファイルのどこかに記述することと、後述するpublish()の引数priceに金額を指定すること。どちらか片方がないとエラーになる。
また<pay>は必ずMarkdownファイル内に最大1つまでです。それ以上、記述するとエラーになります。
publish()の引数
- title(必須):note上で表示される記事のタイトル
- md_file_path(必須):記事の内容を記述したMarkdownファイルのパス
- eyecatch_path(任意):アイキャッチ画像のパス
- hashtags(任意):ハッシュタグとして設定するキーワード(配列)
- price(任意):有料記事の場合、金額を設定する。最低金額は100円なので、最低「100」。有料記事の場合、合わせてMarkdownファイル内に有料エリアの最初に
<pay>を挿入する必要があります。 - magazine_key(任意):マガジンに追加する場合、マガジンのURLの末尾のIDを入力(配列)
- is_publish(任意):公開する場合はTrue、下書きの場合はFalseを指定
マガジンIDの取得方法
任意のマガジンの一覧ページのURL(例えば、私が作成した「ITエンジニア・プログラミング」というマガジンの一覧URLはhttps://note.com/naokun_gadget/m/m1dec56b6c186)の最後の文字列(例の場合「m1dec56b6c186」)がマガジンIDになります。
これをpublish()の引数magazine_keyに配列で指定することで、そのマガジンに追加して投稿されます。
今後のアップデート予定
今後、私の開発意欲がある限りは下記の通りに改良していきたいです。
- 実行時の情報を
loggingで出力 - 動画のアップロード
- YouTube動画リンクなどの埋め込みカード
- Amazonアソシエイトの挿入
などなど…より実用的な機能を実装していきたいです。
さらにNote Clientをわざわざ、Note Postなど投稿に焦点を当てた名前にしていない理由として、投稿以外にもnoteを操作する機能を実装したいと考えているからです。
例えば…
- ユーザー情報の取得
- 記事の取得
- 記事の削除、編集など
こういった、記事の投稿以外の機能も充実させたいなと考えています。
最後に…開発者から伝えたいこと
私はまだまだ未熟なエンジニアです。
エンジニアと名乗るのもおかしいかもしれません。
私と一緒にNote Clientを改良していける開発者を募集します。
と言っても何かチームに所属していただくわけではなく、各々Note Client2を利用して、改良した場合などにGitHubにプルリクエストを送ってほしいです。
また時間がない場合や技量的に難しいのであれば、Issueを送っていただけるだけでもありがたいです。
すぐに対応できるわけではありませんが、皆様と協力して、より良いものにできたらいいなと思っています。
最後まで、ご覧いただきありがとうございました。
Insane Projects 代表 – Insane / Nao
