タイトルの付け方が上手じゃないので 「Chat GPT」にお願いしました。

しかし、明るい面だけが強調されてる様な気がしたので、少しだけ手直ししました。

「自動」で実行するマイナスの部分も考慮しつつ、私がどういう風に実装したかを紹介します。

作ろうと思った理由(動機)

元々は私のやり切れなさがきっかけでした。

時間を掛けて書いた記事に対して何も反応がないのは悲し過ぎるので、「スキ」を付けて見てるよ〜という気持ちを伝えたいと思ったのがきっかけでした。(いまだに 💓   0・・・)

https://note.com/ego_station/n/nb9184c0bf182

マイナス面

- 規則性なく、闇雲に「スキ」を自動で押すと、スパムと変わらない
- 興味無さそうな人に  「スキ」を貰っても嬉しくない

https://note.com/yop/n/nc435e7ffabf3

方針(要件定義)

マイナス面も考慮して、「自分が興味を持つであろうという記事に限って、「スキ」を付ける」事にしました。

  1. 自分が 主に書いてる記事のカテゴリーの新着記事のみを取得する
  2. 「記事の収集」と 「スキ」のプログラム(処理)を独立させ、「記事の収集」だけ取得出来ることも可能にする

プログラムとしては、「記事の一覧の取得」と 「スキ」が 独立しているので新着記事の一覧の URL のリストのみを出力して、その中から記事を読みながら  「スキ」を付けて行くことも出来ます。

その辺りは、運用しながら一番良い方法を探っていければと考えています。

元々のきっかけはこの自分のやり切れなさというのがきっかけなので、見てるよ〜が少しでも伝われば良いなぁと思ってます。

プログラムの実装と実行

今回の実装と実行手順としては、次の通りです

  1. note が用意しているカテゴリーの一覧を取得する
  2. 1 のカテゴリーの中で、自分が興味ある あるいは 自分が主に書いてる分野を選択する。(手動)
  3. 2 で選択したカテゴリーの「新着記事」に 自動で「スキ」を 付ける。

1. カテゴリーの一覧を取得

note が用意しているカテゴリーの一覧をまずは取得します。

note のカテゴリー一覧

カテゴリの名前、エンドポイント(API の URL)

注目,https://note.com/api/v1/top_articles
マンガ,https://note.com/api/v1/categories/manga?note_intro_only=true
コラム・エッセイ,https://note.com/api/v1/categories/column?note_intro_only=true
小説,https://note.com/api/v1/categories/novel?note_intro_only=true
写真,https://note.com/api/v1/categories/photo?note_intro_only=true
ラジオ,https://note.com/api/v1/categories/radio?note_intro_only=true
音楽,https://note.com/api/v1/categories/music?note_intro_only=true
ビジネス,
 - ライフスタイル,  - テクノロジー,https://note.com/api/v1/categories/tech?note_intro_only=true
デザイン,
 -

参考: カテゴリー一覧を取得のソースコード(Ruby)

require 'http'

NOTE_API_HOST = 'https://note.com/api'.freeze

NOTE_API_V1_URL = "#{NOTE_API_HOST}/v1/".freeze

NOTE_API_V2_URL = "#{NOTE_API_HOST}/v2/".freeze


response = HTTP.get("#{NOTE_API_V2_URL}categories")

if response.code == 200
  data = response.parse["data"]
  categories = data["categories"]
  categories.each do |category|
    print "#{category['name']},#{category['endpoint']}\n"
  end
else
  puts "Error: #{response.code}"
end

2. 興味あるカテゴリーを選択

note のカテゴリー一覧」から 対象とする(興味のある)カテゴリーを選びます。

私が主に記事を書いている分野は、「身の回りのこと」、「写真」、「プログラミング」、「仕事」などです。

カテゴリの中で、近いのが 「コラム・エッセイ  」、「写真」、「テクノロジー」になります。仕事は 「ビジネス」に相当しますが、API の URL が存在しないので対象から外します。

選択したカテゴリーは、次のようになりました。

選択したカテゴリー

・コラム・エッセイ  
・写真
・テクノロジー

3. カテゴリーの新着記事を取得

2 で選択したカテゴリーから、新着の記事 ID を取得します。

ID というのは記事を一意に決めるシステムの内側だけで使用するユニークな数字だけの値です。

ページの表示(URL)に使用しているのは、「ユーザーの名前」と 「記事のキー」です。(※)

※ (ユーザ名)/n/(キー)

取得した新着の記事 ID: 選択したカテゴリー(3) X 新着 10 件   =  30 件が対象

64627526
64639551
64637865
64382672
64648725
61419824
64644116
64555679
64646572
64620057
64642329
….

合計 30 件

参考: 各カテゴリー一覧の最新 10 件を取得するソースコード(Ruby)

require 'http'

NOTE_API_HOST = 'https://note.com/api'.freeze

NOTE_API_V1_URL = "#{NOTE_API_HOST}/v1/".freeze

NOTE_API_V2_URL = "#{NOTE_API_HOST}/v2/".freeze
categories = %w[
  column
  photo
  tech
]

note_ids = []

categories.each do |category|
  # カテゴリーの新着記事 10件を取得
  response = HTTP.get("#{NOTE_API_V1_URL}categories/#{category}?note_intro_only=true&sort=new&page=1")
  if response.code == 200
    data = response.parse["data"]
    notes = data["notes"]
    notes.each do |note|
      note_ids << note['id']
      print "#{note['id']}\n"
    end
    # 取得したデータを処理する
  else
    puts "Error: #{response.code}"
  end
end

5. 「新着記事」に  「スキ」を します。

スキが成功すると、note のサーバから次のような答えが返ってきます

#<HTTP::Response/1.1 201 Created {“Content-Type”=>”application/json”, “Transfer-Encoding”=>”chunked”, “Connection”=>”close”, “Date”=>”Wed, 19 Apr 2023 10:18:47 GMT”, “Server”=>”nginx”, “Cache-Control”=>”no-store”, “Strict-Transport-Security”=>”max-age=31536000”, “X-Content-Type-Options”=>”nosniff”, “ETag”=>”W/”7ed4d5764b8ced3a3b59592faf638b30””, “Set-Cookie”=>”_note_session_v5=****; domain=.note.com; path=/; expires=Thu, 19 Oct 2023 10:18:47 GMT; secure; HttpOnly; SameSite=Lax”, “X-Request-Id”=>”60cb8713-07f4-422d-83fc-395ff4583dc9”, “X-Runtime”=>”0.160787”, “X-Cache”=>”Miss from cloudfront”, “Via”=>”1.1 f4001dc39ba666b4723dc72f2c6a9d40.cloudfront.net (CloudFront)”, “X-Amz-Cf-Pop”=>”NRT57-P3”, “X-Amz-Cf-Id”=>”gn9df66URKpnVe3uwY5k6UGbC8i5jO5LkDFsjqKYXRZBLbiPN5_cWA==”}>

201 Created」がサーバーから帰ってきてると成功です。

念の為記事でスキが付いてるを確認します。付いてました。

成功です。👏

こちらのスキは、当初このツールを作ろうと意図通りかも・・ 誰も記事を読んでくれてないんじゃないかと思ったりする時の力になれば良いと考えていたので。(最初のスキ)

私は、毎回、記事に掛けた労力の割にスキが少なくて(あるいは0の時に)泣きそうになってたりします。


note の API には 問い合わせを決める方法として、「GET」と「POST」があります。POST は投函(投稿)するという意味で、note に対して変更を加えることが出来ます。冒頭にも書きましたが、悪用が出来る可能性もありますのでソースコードの公開はしません。

こんなことをやってみたいんだけど出来るかなどは、個別で相談していただければと思います。

最後まで読んで頂き有難うございました。

参考資料

非公式 NoteAPi 一覧

https://note.com/hagure_melon/n/n964ff6f7ad0e

NoteApi の認証方法

https://note.com/takahiro_yazu/n/nf3477fbdf596

利用規約

https://note.com/terms