
自動付与機能を作って「スキ」 をしてみた!
タイトルの付け方が上手じゃないので 「Chat GPT」にお願いしました。
しかし、明るい面だけが強調されてる様な気がしたので、少しだけ手直ししました。
「自動」で実行するマイナスの部分も考慮しつつ、私がどういう風に実装したかを紹介します。
作ろうと思った理由(動機)
元々は私のやり切れなさがきっかけでした。
時間を掛けて書いた記事に対して何も反応がないのは悲し過ぎるので、「スキ」を付けて見てるよ〜という気持ちを伝えたいと思ったのがきっかけでした。(いまだに 💓 0・・・)
マイナス面
- 規則性なく、闇雲に「スキ」を自動で押すと、スパムと変わらない
- 興味無さそうな人に 「スキ」を貰っても嬉しくない
方針(要件定義)
マイナス面も考慮して、「自分が興味を持つであろうという記事に限って、「スキ」を付ける」事にしました。
自分が 主に書いてる記事のカテゴリーの新着記事のみを取得する
「記事の収集」と 「スキ」のプログラム(処理)を独立させ、「記事の収集」だけ取得出来ることも可能にする
プログラムとしては、「記事の一覧の取得」と 「スキ」が 独立しているので新着記事の一覧のURLのリストのみを出力して、その中から記事を読みながら 「スキ」を付けて行くことも出来ます。
その辺りは、運用しながら一番良い方法を探っていければと考えています。
元々のきっかけはこの自分のやり切れなさというのがきっかけなので、見てるよ〜が少しでも伝われば良いなぁと思ってます。
プログラムの実装と実行
今回の実装と実行手順としては、次の通りです
noteが用意しているカテゴリーの一覧を取得する
1のカテゴリーの中で、自分が興味ある あるいは 自分が主に書いてる分野を選択する。(手動)
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
….
参考: 各カテゴリー一覧の最新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に対して変更を加えることが出来ます。冒頭にも書きましたが、悪用が出来る可能性もありますのでソースコードの公開はしません。
こんなことをやってみたいんだけど出来るかなどは、個別で相談していただければと思います。
最後まで読んで頂き有難うございました。