諸事情でnoteの有料マガジン購読料として金一千円を払ってしまったが、間違ってもそれ以上は払いたくない。人生そういうこともあるので、権利のあるうちにバックナンバー全部をローカルに保存し、まったく憂いなく解約しよう。

バックナンバーは契約終わってからでも見れたりするのかね?まあいいや。

流れは、

  1. 記事一覧取得
  2. cookie取得
  3. wgetでぶっこ抜く

記事一覧取得

非公式APIを使って、該当ユーザの記事一覧を取得する。

【2020年12月版】noteの非公式APIを使ってユーザーの"全記事データ”を取得してみる※pythonコード有り

上リンク最後のPythonコードでエクセルファイルを得られる。得られたエクセルファイルのnoteUrl列をコピーしてテキストファイルにはっつけよう(list.txtとする)。

Python処理の時点でnoteUrlだけのファイルを作ればいいんだけどここはそう繰り返す処理じゃないし…。他人のコードを弄ってドツボにはまるまでもないと思った。

といいつつpandasのバージョンがあれとかこれとかでちょっと弄ったので載せる。

# オリジナル:https://note.com/karupoimou/n/n5d8124747158
# ユーザー記事データ全件取得
import requests
import pandas as pd
import json
import time
from tqdm import tqdm
from io import StringIO

# 取得したいユーザー名
user_name="kaiteru_hito"

# API URL
user_api_url="https://note.com/api/v2/creators/%s"%user_name
contents_api_url="https://note.com/api/v2/creators/%s/contents"%user_name

# 取得秒数間隔の指定
interval = 1

# 総記事件数の取得
res = requests.get(user_api_url).content.decode('utf-8')

df = pd.read_json(StringIO(res))
note_count = df['data']['noteCount']

# 総取得ページ数
page_num = (note_count//6) + 1

# 個別ページの取得
df2 = pd.DataFrame()

for page in tqdm(range(page_num)):

   page = page+1

   payload = {'kind':'note','page':page}
   res = requests.get(contents_api_url, params=payload).content.decode('utf-8')

   df = pd.read_json(StringIO(res))

   df_notes = df["data"]["contents"]
   
   for i in range(len(df_notes)):
       df_n = pd.DataFrame(df_notes[i].values(), index=df_notes[i].keys()).T
       df2 = pd.concat([df2, df_n])

   time.sleep(interval)
   
# 重複行を削除する
df2.drop_duplicates(subset='noteUrl', inplace=True)

# 投稿日順に並び替え
df2 = df2.sort_values('publishAt', ascending=False)

# インデックスの振り直し
df2 = df2.reset_index(drop=True)

# エクセルファイルとして保存
df2.to_excel('notes_all.xlsx')

cookie取得

有料記事を落とすには、有料記事を読む権利を持ったアカウントでログインした状態でなければならない。状態とはcookieだ。したがってcookieを焼く。悪いがもう少しだけ、追加で待っててくれないか?

wget --keep-session-cookies --save-cookies=cookies.txt --post-data 'login=ゆーざめあど&password=ぱすわーど' 'https://note.com/api/v1/sessions/sign_in'

いま、cookies.txtに1000円の価値がある。いやない。

wgetでぶっこ抜く

mkdir data
cd data
wget -p -H -E -nH -k --restrict-file-names=windows --load-cookies ../cookies.txt -i ../list

これで全記事落とせると思う。

メモ

-p 画像とかのコンテンツも拾ってくる

-H 外部ドメインを許可

-E 拡張HTMLも.html拡張子にする

-nH ホスト名(ここでいうnote.com)のディレクトリを作らない

-k 画像とかのリンクをローカルに落とした奴のほうに差し替える

--restrict-file-names=windows エスケープ規則をwindows準拠にする。これをやらないと、画像ファイルの名前にハテナ文字が使われてwindows環境でえらいことになったりする。

--load-cookies cookieファイルを読み込む

-i 対象URLのリスト