見出し画像

[n8n] note と Obsidian の連携設定

note と Obsidian が連携できると良いなと考えている人は多いようですね。ちょっと雑な説明しか残していなかったので、いまの具体的な設定がどのようになっているかを紹介します。

改めまして、全体の構成はこの通りです。
(2025/7/28更新)

全体像はこちら

RSS Feed Triger

フローの始まり部分です。

毎日 22時に https://note.com/sho7650/rss の RSS Feed へアクセスします。

note は自分のページに /rss つけたところで RSS Feed が公開されてます

HTTP Request

RSS の Feed には冒頭の文章のみしか含まれていませんので、コンテンツへアクセスして html をゲットです。

Method は "GET" で URL が "{{ $json.link }}" ですね。ここはこれだけで十分です。

特定の URL 記事へアクセスしますってことです

URL の情報については、左側のペインにある "Execute previous nodes" をクリックして、情報を拾ってくることができます。

試しに実行してくれるんですよ、これ。便利。

この様に RSS の情報が構造化されて表示されますから、ここの "link" 部分をドラッグして "URL" に放り込んでしまうのが確実です。

実際の RSS の内容から、項目を指定できるのは嬉しい

HTML

ここはちょっと厄介です。ドキュメントの構造が分かってないと指定ができません。2025年7月現在、note のコンテンツはこの指定で取得が可能です。このままパクってくださいませ。

ここは三つ指定しています。タイトルと中身、あと投稿日です。

コピペ用にここに残しておきますね。

Operation : Extract HTML Content

Extraction Values : 一つ目
Key: title
CSS Selector: h1.o-noteContentHeader__title

Extraction Values : 二つ目
Key: body
CSS Selector: div.note-common-styles__textnote-body

Extraction Values : 三つ目
Key: publishDate
CSS Selector: time
Return Value と Attribute の指定をまちがえないように。

Code (2025/7/28追記)

お題にファイルに利用できない文字があると、保存の段階で失敗します。なのでタイトル内にファイル名として使えない文字があれば、"_" はサニタイズします。

return には全体 $input.all() を返却するがミソ
// Loop over input items and add a new field called 'myNewField' to the JSON of each one
// ファイル名に使えない文字を置き換える関数
function sanitizeFileName(inputString) {
    const invalidChars = /[<>:"/\\|?*]/g;
    return inputString.replace(invalidChars, '_');
}

$json.title = sanitizeFileName($json.title);

return $input.all();

なぜか $json で並線でるの許せない。

AI Agent

取得したコンテンツを Obsidian 向けに調整する重要な役割がここです。

ここは Prompt が命です。

LLM へ渡すプロンプトを記します。{{ $json.body }} などが上記で指定したパラメータ名です。ここは Obsidian へ載せたいフォーマットで各自準備ください。

以下の記事を要約し、主要な洞察を3つ抽出してください。
重要となるキーワードを5つ抽出してしてください。キーワードの先頭には必ず # を付けてください。

次のフォーマットで出力してください。
---
# Mandatory fields
id: "<% tp.user.uuid() %>"
# Optional fields
title: "<% tp.file.title %>"
tags: []
source: ""
source_title: ""
source_description: ""
source_image_url: ""
created_date: "<% tp.date.now() %>"
modified_date: "<% tp.date.now() %>"
---
## 要約
<!-- ここに要約を追加 -->

## 主要な洞察
<!-- ここに洞察を追加 -->

## キーワード
<!-- ここに重要なキーワードを追加 -->

{{ $json.body }}

この AI Agent にはひとまず Chat Model が一つついてればよしです。みなさまの契約状態にあわせて選択ください。わたしは Anthoropic です。

Convert to File

Obsidian 用の Markdown ファイル形式へと変換するのがこのパートです。ここではファイル形式にするだけで、まだ保存されません。

ここの File Name ってなんで使ってるんだっけ
File Name: {{ $('Code').item.json.title }}.md

"Code" のところでサニタイズしたタイトルはここで利用します。そういえば、publish date ちゃんと使ってないな。あと File Name 指定しなくても平気な気がしてる。

Read/Write Files From Disk

なんかまた同じような設定していますが、Convert to File の処理は必須です。バイナリ形式になっていないと、この機能が動きません。設定まではできるんですが、テキストをそのまま保管することはできないようです。残念。

Code でサニタイズされた title を利用します
File Path and Name: 
/obsidian/03_Extra/Articles/{{ $('Code').item.json.title }}.md

私は Docker で /obsidian の PATH を mac のローカルドライブにマッピングしていますので、ここは各自の環境に合わせて変更してください。

こんな感じです。

いいなと思ったら応援しよう!

しょっさん あなたの支えが、私の心の糧になります。 note の収益はガジェットのレビューや、自費出版に使わせていただきます。