MENU

Pythonでnoteに記事を投稿するライブラリ「Note Client」を開発した

私は2023年10月に『Note Client』というPythonのライブラリを開発しPyPIに公開しました。Note Clientとは無料ブログサイトnoteに記事を投稿するためのライブラリです。

本記事ではNote Clientを開発した経緯から、現在の仕様と課題、そして未来の構想まで、ギジュ的な話も交えて紹介します。

Note Clientに興味を持った人が機能の拡張やリファクタリングをおこなって、さらにより良いものになると嬉しいです。

目次

開発した経緯

私は当時、運営しているメインのブログ(WordPress)で記事を更新するたびに、集客用の記事をnoteに投稿していました。これを自動化しようと思ったのが、Note Client開発の始まりです。

WordPressのウェブフックを活用すれば、記事を更新したタイミングで、記事の要約・導入のような文章をAIなどで生成して、最後にメインのブログの記事のURLを付けて、noteにその文章を投稿すれば良い。

しかしどのようにして、noteに記事を投稿すれば良いのか?

私は当時noteのAPIについて調べました。公式のAPIも、非公式のAPIも調べましたが、記事を投稿するためのAPIはありませんでした。

なのでNote Clientの開発に至りました。

Note Clientの仕様

Note Clientは私が得意とするプログラミング言語であるPythonで作成しました。

主にSeleniumというスクレイピングのライブラリを利用しました。SeleniumはBeautifulSoupなど他のスクレイピングライブラリより幅広いサイトに対応できます。noteの投稿画面は動的な要素が多く、操作が複雑だったため、実際にブラウザを動かして操作をシミュレートできるSeleniumを採用しました。

Seleniumによる操作の流れはこのようなイメージです。

  1. noteにログインする
  2. 記事を作成する
  3. 文章を入力する
  4. アイキャッチ画像を設定する
  5. タグを設定する
  6. 投稿する

noteにログインする

Seleniumでブラウザを起動し、noteのログインページを開きます。そして、あらかじめ設定しておいたメールアドレスとパスワードを自動で入力し、ログインボタンをクリックします。

記事を作成・入力する

ログイン後「投稿」ボタンをクリックして編集画面に遷移します。タイトルや本文の入力欄を特定し、あらかじめ作成されたテキストファイルの内容を入力します。テキストファイルはMadkdown形式を真似た形式で記述します。大見出し、小見出し、リスト、区切り線などを決められたルール通り記述することで、noteの記事の入力時に反映されます。

例えば大見出しの場合は行頭に「# 」を付けます。小見出しの場合は行頭に「## 」を付けます。これにより実際のnoteの記事には大見出しや小見出しとして設定されます。

アイキャッチ画像を設定する

アイキャッチ画像はいわゆるサムネイル画像のことで、記事の最初に表示されたり、ブログの記事一覧画面で表示される画像のことです。

当初は画像をnoteにアップロードする機能を実装することができなかったため、noteに用意されている画像を選択する方法を採用しました。

しかし、noteに用意されている画像をキーワードで検索した場合、どのような画像が検索結果として表示されるかは分からず、プログラム(ライブラリ)側からは検索のキーワードと、検索結果に表示される画像の何番目を選択するかしか設定ができませんでした。

事前に用意した画像をアップロードしてサムネイル画像にする機能や、記事内に画像を埋め込む機能は現在の課題であり、次のNote Clientのアップデートで最も優先的に実装したい機能です。

ハッシュタグを設定して投稿する

最後に公開設定(下書きのまま保存する/公開)やタグの入力をおこない、投稿ボタンをクリックして完了です。

この仕様はアイキャッチ画像を自由に選択できない点など一部問題はありますが、Pythonプログラムからnoteへの記事投稿を自動化するという当初の目的は達成できました。

Note Clientの使い方

まず始めに「pip」コマンドでNote Clientをインストールします。

pip install NoteClient

次に記事の内容をテキストファイル(content.txt)に記述します。

Insert your opening greeting here
## Major Heading
### Minor Heading
## How to Use Bullet Points
Write the content for heading 1 here.
You can also write bullet points like this.

- Item 1
- Item 2
- Item 3
## How to Use Paragraph Numbers
You can also write paragraph numbers like this.

1. Paragraph 1
2. Paragraph 2
3. Paragraph 3
## How to Use Horizontal Lines
By using horizontal lines
---
You can separate the content of the text like this.

Pythonファイル(.py)を作成して下記のテンプレートをコピペして使用してください。

from Note_Client import Note

EMAIL = 'your email'
PASSWORD = 'your password'
USER_ID = 'your user_id'

TITLE = 'Sample'
CONTENT_PATH = 'content.txt'
TAG_LIST = ['sample_tag']

# > If an image is specified, the index number is entered; if not, no description is given.
# INDEX = 0

# > True if the article is to be published, False if the article is to be saved as a draft; if not specified, the article is saved as a draft.
# POST_SETTING = True

# > True if the execution screen is not displayed, False if it is displayed, or not displayed if not specified.
# HEADLESS = False

# To specify the above three options, add them to the function arguments.

note = Note(email=EMAIL, password=PASSWORD, user_id=USER_ID)
print(note.create_article(title=TITLE, file_name=CONTENT_PATH, input_tag_list=TAG_LIST))

最初の6つの定数(3行目~9行目)までを自身の環境に書き換えてください。

コメントアウトされている定数INDEXは表示されるアイキャッチ画像の何番目を選択するかを設定します。特定のアイキャッチ画像を選択できるわけではないので、おまけ程度の機能ですが、とりあえず0で設定しておきましょう。また定数POST_SETTINGはTrueの場合は公開設定で投稿して、Falseの場合は下書き保存して投稿はしません。最後の定数HEADLESSはSeleniumの設定で、実行時にブラウザの操作画面を表示する場合はFalse、表示しない場合はTrueを代入します。

最後にNoteをインスタンス化して、create_article関数を実行することで、処理が開始されます。

課題と改良について考える

現在のSeleniumを使った仕様は、ブラウザでの操作を忠実に再現できる一方で、いくつかの課題も抱えています。

  • 実行速度が遅い:ブラウザの起動やページの読み込みを待つ必要があり、処理に時間がかかる。
  • 安定性に欠ける:note側のUIデザインが少しでも変更されると、プログラムがHTML要素を見つけられずにエラーで停止してしまいます。
  • 実行環境の構築が煩雑:Seleniumを動かすためには、Python環境に加えてWebDriverのインストールと管理が必要です。

これらの課題を解決するため、私は新しい仕様を考案しています。それはnoteの内部APIを直接利用するというアプローチです。

ブラウザでnoteに記事を投稿する際、バックグラウンドではWebページとnoteのサーバー間でAPI通信がおこなわれています。この通信を解析し、同じリクエストをPythonから送信することで、ブラウザを介さずに直接記事を投稿できるはずです。

すでに同様の手法でNote Clientの改良をおこなっている方がおり、noteで記事を投稿されているので、下に貼っておきます。

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