java_wockyです。大学卒業間近になってObsidianにハマり、関連ツールの調査・開発に勤しんでいます。
今回は、そんな中で作ったDiscordとObsidianを連携した、Twitterライクなメモツールについて紹介していきます。
ソースコードはこちら。
なぜ作ったのか
私は一時期、X(旧Twitter)のアカウントをメモツール代わりに活用し、気になる記事のリンクやアイデアをポストして書き溜めていました。Xをメモツールとして使う場合、以下の利点が挙げられます。
- メモの気軽さ。ひとつのボタンを押せば、ワンタッチで書き込みツールが開く。
- 関連するポストをスレッド形式でまとめられる。追加のコメントをしたり、(認証なしで)長文メモを書きたいときに便利。
- URLを貼ると、プレビューが表示される。パッと確認できる。
- スマホ・PCの両方で同じ内容が閲覧できる。
しかし懸念点もいくつか感じていました。
- まず見返しづらい。タイムライン形式で投稿を表示する構造上、後から内容ベースで検索しづらく、せっかくメモしたリンクやアイデアを活用しないことが多い。しかもXにはAPI制限がかかっており、ポストを収集して改めて分析する、というのも容易ではない。
- プライバシーの観点でも若干不安。いくら鍵をかけたとしても、最近は裏垢の特定サービスもあるらしい(あくまで噂?)ので、印象に悪影響を与えそうなことは投稿できない。フォロワー様がいらっしゃるアカウントならなおさら、個人的すぎることは言いづらい…。
そんなわけで、Xの利点を活かしつつ、上記の懸念点を補うツールとして、Discordの個人用botとメモツールであるObsidianを組み合わせた、プライベート性強化版Twitterを作ってみよう、というのが今回の趣旨です。(ちなみにバリバリClaude Codeを使いました)
何を作ったのか
一言で表現すれば、DiscordのbotとObsidianのVaultを連携させ、Obsidianにつぶやきが自動で反映されるシステムです。
機能の詳細
1. Discordチャンネルにおける投稿をObsidianのデイリーノートに反映
Discordのサーバーでつぶやくと、
時刻付きでObsidianのノートに反映。
ここで「なんでObsidianに直接書き込まないんだ?」と思われる方…実は、Obsidianは基本的にPCとスマホアプリでの同期ができないんです。厳密に言うと、公式が提供するsync機能やicloudを使えばできるのですが、有料だったり容量が小さかったりと活用しづらく。一方、Discordを経由すれば無料で、制限なしでスマホからPCのObsidian Vaultにアクセスできる、というわけです。
ここで、ObsidianにはThinoというコミュニティプラグインがあり、こちらを使う場合でもつぶやきをタイムライン形式で表示させることができます。しかし、Thinoだと(Vaultを同期しない限り)PCとスマホで同一のVaultに投稿内容を反映させることができません。
一方、本稿で紹介するbotを使うと、スマホのDiscordアプリで投稿した内容を、PCのObsidian VaultにおいてThinoと同じUIでチェックすることができます。
DiscordチャンネルとObsidianのVaultは共に個人用サーバー・PCによる利用を想定しているので、よりプライバシー性の高いメモシステムが構築できます。個人的なことも記録しやすい。
2. 投稿のタスク化
Discordにメッセージを投稿する際、#taskというタグを付与すると、Obsidian側でタスクとして記録することができます。
タスク形式にすると、Tasksプラグインなどを使うことでタスク単位での管理もできて、さらに便利です。
ちなみに#Devなど別のタグも付与することで、つぶやきをタグに基づき検索・整理できます。
3. 過去の投稿へのリプライをObsidian側へ反映
Discordである投稿へリプライすると、
Obsidianでもその投稿の直下にリプライが表示されます。
4. URLタイトル表示
URLをメッセージに含むと、そのタイトルが表示されます。Notionのリンクプレビューにも似ているかも。
ちなみにメッセージがURLのみを含む場合、アイコンやプレビューも入ります。タグも付与できるので検索も便利。
システム詳細
必要な環境
- macOS(
launchdを利用した自動同期を使う場合) - Python 3.x(開発時は Python 3.14 系で動作確認)
- Obsidian などで管理している Markdown ベースのノートを格納したVault
- Discord Bot アカウント(Discord Developer Portal で作成したアプリケーションを使用するため)
ファイル構成
今回作成したbotの本体や同期処理に必要なファイルは、Obsidian Vaultとは分離したdiscord-memo-bot フォルダの中にまとめています。
BotからObsidian Vaultを参照する際にはVaultのパスを指定しているので、botのソースコードとObsidianのノートは同じディレクトリに置く必要はありません。(私の場合はDocuments/フォルダ直下にObsidianのノート用フォルダとbot用ファイルを置いているのですが、こちらも個人によっては異なるフォルダ名になると思います。)
Documents/
├── Obsidian Vault/ # Obsidianで管理するノート
│ ├── Diary/
│ ├── Books/
│ ├── Class/
│ └── ...
│
└── discord-memo-bot/ # Discord Bot用の独立したGitリポジトリ
├── bot.py # Discord Bot本体
├── memo_note.py # メッセージの解析・Obsidian用形式への変換
├── message_index.example.json
├── sync.py # DiscordとObsidian間の同期処理
├── requirements.txt # Pythonの依存ライブラリ
├── .env # Discord Bot Tokenなどの環境変数
├── .gitignore
├── README.md
└── com.example.discord-memo-sync.plist # macOSでの自動実行設定。
処理の流れ
処理の流れは以下の通り。
- まず、Discordの特定のチャンネル(ソースコードだと
memo)にメッセージが投稿される - botがメッセージの投稿を検知。
bot.py(常駐時)もしくははsync.py(同期時)により、メッセージが受け取られる - 必要に応じて、メッセージの内容に基づき追加処理(タスク化、URL変換、返信先メッセージの特定・挿入)
- Obsidian Vault 内の
Diary/YYYY/MM/YYYY-MM-DD.mdの末尾に追記 - 書き込んだ位置を
message_idと紐づけてmessage_index.jsonに記録。さらに、処理したメッセージの ID をstate.jsonに保存し、次回起動時の重複防止・差分取得に使う
図示するとこんな感じ。これもObsidianで作りました。
セットアップ
Botを動かすにあたり、以下の流れでセットアップを進めていきます。
- Discord Developer PortalでBotを作成・設定
- リポジトリの配置・仮想環境の構築
-
discord-memo-bot内ファイルの内容を個人の環境に応じて書き換える - Botを起動する
1. Discord Botを作成する
まずはBot用のサーバー構築から始めます。画面左に表示されるサーバーの一覧の下部にある+ボタン(「サーバーを追加」と表示されます)をクリック、「オリジナルの作成」を選択した後、サーバー名やアイコンを設定し、「新規作成」をクリックします。(詳細はこちら)
次にBotの作成に移ります。Discord Developer Portalの左上にある3本線のボタン(ハンバーガーボタンと言うらしい)から、「アプリケーション」に移動。その後、「新しいアプリケーション」をクリックし、お好きな名前を付けます。
Botが作成されたのを確認したら、左のメニューバーをチェック。「概要」の下にある「Bot」をクリックすると、Botの詳細設定画面に移動できます。
ここで、Message Content Intent を有効にし、「変更を保存」ボタンを押します。この設定が、Discordに投稿されたメッセージ本文をBotが取得するためのキモとなります。
その下のBotの権限については、ひとまず何も選択しなくて大丈夫です。
また、同じ画面の上部にある「トークン」から、Bot用トークンも取得しておきます。必要に応じて「トークンをリセット」から再生成してください。また、くれぐれも公開はしないように…。
再び左のメニューから、「概要」の下にある「インストール」をクリック。「デフォルトのインストール設定」の下にある「ギルドのインストール」のスコープにbotを追加、権限としてチャンネルを表示・メッセージを送る・メッセージ履歴を読むを選択します。
最後に同じ画面の「インストールリンク」の下にあるhttps://discord.com/oauth2/authorize?から始まるリンクをコピー、新しいタブで開きます。その後「サーバーに追加」を選び、追加先のサーバーの名前を選んで認証を済ませたら、Botの追加は完了です。
2. リポジトリの配置・仮想環境の構築
GitHubから取得する場合は、こちらのリポジトリをクローンします。続いて、Pythonの仮想環境を作成し、必要なライブラリをインストールします。
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
3. 自分の環境に合わせて設定する
このBotでは、少なくとも以下の2箇所を自分の環境に合わせて設定する必要があります。
Discord Bot Token
.env にDeveloper Portalで取得したBot Tokenを設定します。
DISCORD_TOKEN=ここに自分のBot Token
なお、リポジトリでは、.env はGitHubに公開しないよう .gitignore で管理対象外にしています。
Obsidian Vaultのパス
bot.py の VAULT_PATH を、自分のObsidian Vaultの場所に変更します。
VAULT_PATH = Path.home() / "Documents" / "Obsidian Vault"
例えば、Vaultが Documents/Obsidian Vault にある場合は上記のままで動作します。Vaultを別の場所に置いている場合は、自分の環境に合わせて変更してください。
4. Botを起動する
設定が完了したら、仮想環境を有効にした状態で以下を実行します。
python3 bot.py
正常に起動すると、コンソールに以下のような表示が出ます。(#0000は識別番号です。これも個人の環境により異なるかと)
Logged in as Botの名前#0000
この状態で、Discordの対象チャンネルにメッセージを投稿すると、Botがメッセージを取得し、Obsidian Vaultのデイリーノートに記録します。
なお、Botの自動起動や同期処理については、リポジトリ内の sync.py や .plist ファイルを利用しています。詳細についてはREADMEを参照してください。
おわりに
本稿では、ObsidianとDiscordを連携した、タイムライン形式でメモができるツールの紹介・導入方法の説明を行いました。
今後はこのツールで記録されたメモの分析も詳しくやってみようと思っています。
また、DiscordとObsidianを連携させた例は色々あるので、そちらも参照しつつ、さらなる活用の方法も考えていきたいです。











