はじめに#
インターネットは今やサイバースペースの戦場のようで、各アプリがそれぞれ独自の領域を持ち、あなたが一つの土地を囲い、私が別の土地を切り取る。旗を鮮明に掲げ、隣人を犠牲にする。春秋戦国の魅力を感じさせる。
これを聞いて、ある物語を思い出します。近代ドイツが統一される前、貨物を運ぶ商人が様々な関所を通過する際に支払った税金は、彼が販売する商品の価値の何倍にもなっていました。
サイバースペースに生きる私たちも、この商人ではないでしょうか。私は毎日 B 站でコインを投げ、网易云で音楽を聴き、微信で公式アカウントを見て、YouTube でいいねを押し、ブラウザの中で散乱する永遠に開かないブックマークや後で読むためのリンクを見ています。注意力と時間が私たちが支払う税金です。
Reorx は私たちをサイバースペースの情報フィルターに例えています。毎日大量の入力を受け取り、自分が欲しい情報をフィルタリングします。この比喩は少し恐ろしいですが、事実です。
情報の入力が多すぎて、私たちはたくさんのものにいいねやお気に入り、マークを付けているように見えますが、結局のところ、自分がどこから情報を得たのかを忘れてしまっています。
私たちは収納・集約の場所が必要です。私はこれをサイバースペースのデジタル日記と呼びます。
この記事ではこのトピックを紹介し、ステップバイステップでその実現方法を案内します。
どの情報を集約するか#
表示形式#
まず、この集約の場所を紹介します。私は Telegram を選びました:
Telegram には私を興奮させる多くのポイントがあります:
- 自分専用のチャンネルを作成でき、微信公众号のようで、内容の審査がありません。
- メッセージのスタイルが豊富で、リンクは自動的にプレビューされ、タグ機能で迅速に検索できます。
- Instant View 機能により、記事を迅速に読み込み、オフラインで保存できます。
- 面白いボットと豊富な API サポートがあります。
私が使用したアプリの記録をすべて集約すると、以下のようなチャンネルができました: Raye’s Journey (raye の旅)https://t.me/RayeJourney
参加を歓迎します 👏
コンテンツの出所#
私は日常生活で使用するアプリや情報源を整理しました:
- 読書:微信読書(豆瓣を通じて記録)、ブログフォーラム (medium、xlog、pinboard+instapaper を通じて記録)
- 動画:YouTube、B 站
- ドラマ視聴:Apple TV、Netflix、HBO で日常的にドラマを追い、豆瓣で記録
- 音楽:Spotify、网易云
- ソーシャル:微信、Telegram、Twitter
- ゲーム:Xbox、Steam、TapTap
整理した結果、情報源は実際にはいくつかの場所から来ることがわかりました:
bilibili、YouTube、网易云、Spotify、豆瓣、pinboard ブックマーク、instapaper 後で読む、Twitter
微信などは考えないでください。隔離が厳しすぎて、私はそれと遊びたくありません。
自動化ワークフロー#
市場にはすでに多くの成熟した自動化ワークフロープラットフォームがあります。IFTTT や Zapier などです。
読者が最初から煩雑な手順で混乱しないように、まず IFTTT からワークフローを設定することから始めましょう。
私はよく medium の記事を読み、いいねを押したり、後で読むに追加したりします。
したがって、私は medium の記事にいいねを押したときに、自動的に私の Telegram チャンネルに同期したいと思っています。
IFTTT、このウェブサイトの名前は面白いです。「if This, Then That」の略で、直訳すると「もしこれなら、あれ」という意味です。
もし私が medium の記事にいいねを押したら、自動的に Telegram チャンネルに送信されます。
if This
をクリックし、medium を検索し、最初のもの(つまりいいね)を選択します。このとき、アカウントをリンクするプロセスがありますので、2 回クリックするだけで大丈夫です。
if This
を追加した後、次にThen That
を選択し、Telegram を検索して追加します。
このとき、Telegram アカウントとターゲットチャットグループまたはチャンネルを追加する必要があります(TG チャンネルの chatid の取得方法がわからない場合は、後の付録を参照してください)。
最後の完成品は以下の通りです:
この時点で、私たちが medium の記事にいいねを押すと、自動的に Telegram チャンネルに保存されます。
IFTTT がこれほど便利なら、なぜ直接使わないのでしょうか?
したがって、以下の問題が存在します:
- 有料、無料ユーザーは 2 つのワークフローしか作成できず、あらゆる面で制限があります(例えば Twitter のいくつかの機能)。
- プラットフォームのサポート状況に依存し、カスタマイズの余地がありません。
- 制御不能、万が一プラットフォームが閉鎖されたら、すべてが失われます🫠
このため、プログラマーはオープンソース(無料利用)の精神を持つべきです。次に紹介する内容は、いくつかの煩雑な手順を含みますが、手順に従えば簡単に完了できます😉
オープンソースの n8n#
n8n はオープンソースのワークフロープラットフォームで、基本的に有料機能も提供していますが、私たちに自己展開のスペースを与えてくれます。
n8n にはいくつかの簡単な概念があり、ローコードプラットフォームに似ています:
- workflow:ワークフロー、例えば网易云の好きな音楽を自動的に Telegram に送信したい場合、これは自動化を実現したいことを意味します。
- node:ノード、つまりワークフローを分解した各ステップ、例えば上記のように、网易云の好きな音楽を取得し、データを処理し、送信することができます。
- credential:認証情報、ユーザーデータを保護するために、誰かの情報を無闇に取得することはできないため、ユーザーの認証情報を使用する必要があります。
サービスを展開するには、当然クラウドサーバーが必要ですが、現在はサーバーレスの展開方法が流行しています。つまり、基盤のサーバーに触れることなく、アプリケーションをパッケージ化するだけで済みます。
展開プロセス#
データベース#
n8n はバックエンドストレージとして PostgreSQL の使用を推奨していますので、supabase を使用して作成することができます。
GitHub でログインして作成するだけです。唯一のハードルは英語ですが、没入型翻訳プラグインを利用すれば解決できます。
データベースの接続情報を取得し、保存しておきます。後で使用します。
バックエンドサービス#
Railway はコンテナ展開プラットフォームで、最も推奨されるものですが、私自身の実験の過程で、プラットフォームのリスク管理が厳しくなり、新規登録のアカウントは GitHub 上のソースコードからの展開を許可されなくなりました。
しかし、考え方を少し変えれば、コンテナホスティングプラットフォームはたくさんあり、あなたのところだけではありません。あなたが私を使わせないなら、私はあなたを使う気もありません😑。
私はここでnorthflank
というプラットフォームを使用しています。唯一のハードルはクレジットカードをバインドする必要があることです。仮想クレジットカードを作成すれば大丈夫です。ChatGPT の支払いを経験したことのある方は、きっとわかるでしょう。
ついでに、プログラマーが無料で利用できるプラットフォームを収集したドキュメントを見つけました。生産性が最大です!
https://free-for.dev/#/?id=docker-related
展開プロセスは非常に簡単です。まず、このコードリポジトリをフォークします:
新しいサービスを作成し、リポジトリに先ほどフォークしたものを選択します。
northflank
は自動的に Dockerfile を認識し、外部に公開されるポート番号を検出し、ドメイン名を割り当てます。
1〜2 分待つと、展開が完了し、生成されたドメイン名を通じてサービスにアクセスできるようになります。
環境変数の設定#
バックエンドサービスが立ち上がった後、最初のデータベース接続を設定する必要があります。以下の設定を行うだけで大丈夫です:
一部の設定項目の理解:
DB
で始まるものはすべて DB の設定情報です。VUE_APP_URL_BASE_API
とWEBHOOK_URL
には生成されたドメイン名を記入します(後の手順で自分のものに変更することもできます)。N8N_ENCRYPTION_KEY
は n8n がデータを暗号化するためのキーで、必ず生成して適切に保管してください。EXECUTIONS_DATA_PRUNE
はデータを定期的にクリーンアップします(実行記録など、さもなければデータベースが爆発します)。
PORT=5678
N8N_ENCRYPTION_KEY=xxxxxx
VUE_APP_URL_BASE_API=https://n8n.app.raye.wiki
WEBHOOK_URL=https://n8n.app.raye.wiki
GENERIC_TIMEZONE=Asia/Shanghai
TZ=Asia/Shanghai
N8N_LOG_LEVEL=verbose
DB_TYPE=postgresdb
DB_POSTGRESDB_DATABASE=postgres
DB_POSTGRESDB_HOST=データベースURL
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_USER=postgres
DB_POSTGRESDB_SCHEMA=public
DB_POSTGRESDB_PASSWORD=データベースパスワード
EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=72
EXECUTIONS_DATA_SAVE_ON_ERROR=all
EXECUTIONS_DATA_SAVE_ON_SUCCESS=none
EXECUTIONS_DATA_SAVE_ON_PROGRESS=false
EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=false
以下の図のように、設定が完了したらサービスを再起動成功すれば大丈夫です。
環境変数の URL 設定に注意してください。これは、先ほど取得した northflank が自動的に割り当てたものを記入する必要があります。ここでは後でカスタムドメインをバインドしたため(つまり、ドメインを変更する場合もここを変更する必要があります)。このドメインは多くの oAuth サービスのコールバックに使用されるため、以下のツイートを参考にできます。
在使用 n8n 的过程中,遇到这样一个问题,在创建一些 credential 的时候,需要 OAuth,按照文档输入下方的 URL,但是链接账户失败。
ドメインの CDN 加速#
このステップはスキップできますが、後続の展開には影響しません。ただ、ちょうどドメインを持っているので、cloudfare の CDN 加速サービスを利用できます。
ここが唯一お金がかかるステップかもしれません。もちろん、手元にドメインがあるのが最良です。
Tencent Cloud でドメインを登録します。例えば、私はraye.wiki
を登録しました。次に cloudfare アカウントを登録し、ドメインを追加します(私はすでに追加済みです)。
Cloudfare はこのドメインがあなたのものであることを確認するよう要求します。指示に従ってレコードを追加して確認します。
その後、DNS 解析のサーバーを変更します。これは、ドメイン解析のタスクを cloudfare に委託することを意味します(デフォルトは Tencent Cloud が提供する無料のドメイン解析プランです)。
こうして、私たちのドメインは cloudfare に委託され、今後 cloudfare が私たちのアクセスを加速してくれます。
ドメインのバインド#
northflank
に私たちのドメインを追加します。ここでは、私のサブドメインn8n.app.raye.wiki
を割り当て、TXT レコードを追加してバインドします。
初めてバインドする際は、まず DNS を開いて、正常にアクセスできるようになったら、cloudfare の小さな雲を有効にして加速を実現します。
(Ps. 小さな雲を加速するかどうかは、時々何度も試す必要があります。理論的には cloudfare を使って加速できるはずです😅)
ワークフローの作成#
展開が完了したら、カスタムドメインをバインドしたか、northflank
から割り当てられたドメインを使用して、ブラウザでアクセスできます。ユーザー名とパスワードを登録してください(これは公に公開されており、多くの認証情報を保存するためです)。
その後、情報の自動集約を実現するためにワークフローを作成し始めることができます。まず、現在実行中のワークフローを示します。
ワークフローは Reorx 大佬のものを直接再利用できます。json をインポートするだけで、異なるワークフローに分けて行うことを注意してください。すべてを一つのワークフローに集中させると、実行に失敗することがあります(最初はできると思っていましたが、後で気づきました)。
My workflows for n8n automation
次に、それぞれを紹介します:
Github Stars To Telegram#
Github の Star 情報を自動的に TG に送信します(30 分ごと)。
Github ユーザーの Star 情報はここに記録されています:https://github.com/rayepeng.atom あなたのユーザー名に置き換えれば大丈夫です。
コードノード#
コードノードは Reorx 大佬のコードを再利用しています。https://github.com/reorx/n8n-workflows ただし、彼のワークフローノードは古いバージョンです。実行に問題がある場合は、最新のものに更新することを検討してください。基本的に互換性がありますが、一部の API メソッドには$
記号を追加する必要があります。
コードの原理を説明します:
getWorkflowStaticData
は静的なストレージデータを取得します。n8n はデータを保存することを許可しており、例えば最新の uid データを保存する場合、後続のワークフロー実行時に現在の最新 uid と前回保存したものを比較し、同じであればプッシュする必要がありません(重複プッシュを避けるため)。- ノードの入力は実際には json 構造の item 配列です。
getId
は item の各ユニーク識別子を取得します。この部分はシーンによって変更する必要があります(具体的な json 構造に基づいて)。 staticData.lastItemId
は最新の id を保存します。
const staticData = $getWorkflowStaticData('global');
const lastItemId = staticData.lastItemId;
console.log('lastItemId', lastItemId);
const firstItem = items[0];
let newItems = [];
function getId(item) {
return item.json.track.id;
}
if (lastItemId) {
for (const item of items) {
if (getId(item) === lastItemId) {
break;
}
newItems.push(item)
}
} else {
newItems = [firstItem]
}
staticData.lastItemId = getId(firstItem)
return newItems.reverse()
Spotify To Telegram#
Spotify は OAuth 認証方式を提供しており、n8n の Spotify ノードの指示に従って操作するだけで済みます。コードノードは基本的に再利用します。
Pinboard rss To Telegram#
Pinboard はブックマーク管理ツールで、料金がかかりますが、本当に使いやすいです。ページは非常にシンプルで、CSS スタイルすら追加されていないほどです🤣
Pinboard は大量の API を提供しており、最新のブックマークを取得することができます。したがって、一定の時間ごとに新しいブックマークがあるかどうかを検出するだけで、プッシュを実現できます。
API は以下の通り、最新のブックマークを取得します。
https://api.pinboard.in/v1/posts/recent?format=json&auth_token=xxxxx
豆瓣 To Telegram#
豆瓣は API を提供していませんが、隠れた rss フィードがあります。
あなたのプロフィールページにアクセスすると、例えば私のページ、👏🏻フォローhttps://www.douban.com/people/162586644/?_i=9643158ntY72-j これで対応する rss フィードを取得できます。
RSS Hub との連携#
実際、このステップに到達すると、海外のアプリ開発者たちは非常に親切に API を提供してくれています。各自に防御策があるものの、やはりオープンです。
しかし、国内のアプリたちはそうではありません。スクレイピング対策が厳しく、ユーザーを自分たちの城に囲い込もうとしています。
それでも解決策はあります。RSS Hub はそのようなプロジェクトで、万物を RSS フィードに変えることを目的としています(オープンソースに感謝🥰)。
これには网易云や哔哩哔哩などのアプリの RSS フィード URL が含まれています。公式ドキュメント:https://docs.rsshub.app/
したがって、非常に便利に、自分で RSS Hub を展開し、関連アプリの情報を集約できます!
RSS Hub の展開#
公式ドキュメントにはすでにいくつかの展開方法が提供されています。https://docs.rsshub.app/install/#docker-jing-xiang
しかし、私たちは依然として無料利用の方法を採用します!
最初はnorthflank
を使って展開しましたが、リソース不足でバックエンドが OOM になることがありました。そこで別のサーバーレスプラットフォームに切り替えました:https://www.koyeb.com/
展開方法は n8n の展開と非常に似ており、新しいプロジェクトを作成し、RSS Hub の GitHub リポジトリを選択して展開するだけです。
展開結果は以下の通りです(ドメイン名をモザイク処理しています。私のサービスを無料で利用させないためです🐶)。
B 站 To Telegram#
展開が成功したら、RSS Hub のドキュメントに従って、自分が投げたコインの動画を取得できます(公開する必要があります)。
例えば、私の投げたコインの動画リンク:
https://rsshub.app/bilibili/user/coin/261764405
これで B 站の投げたコインの動画をプッシュできます(いいねやお気に入りの動画は非公開にする必要があります。多くの美しい女性がいるので😅)。
网易云 To Telegram#
网易云は少し複雑です。なぜなら、ログイン状態のクッキーが必要だからです。
クッキーを取得するプロセスについては、以下を参照できます:https://github.com/acloudtwei/NewMusic163#%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8A%93cookie
簡単に説明します:
- プレイリストのリンクを取得します:
- ブラウザでログインし、開発者ツールでこの値
MUSIC_U
を見つけます。
- サーバーレスプラットフォームで、対応する環境変数
NCM_COOKIES
を設定します。
これで設定が完了しました。あなたが曲を好きになったとき、自動的に Telegram にプッシュされます。
付録:Telegram 関連の設定#
Telegram チャンネルの作成#
New Channel をクリックし、手を使うだけです:
Telegram ボットを作成し、チャンネルの管理者に追加する#
本質的にはボットを通じて情報をプッシュするため、自分のボットを作成する必要があります。
方法も簡単で、BotFather を検索し、start を開始し、名前を付けるだけです。
作成が完了すると、ボットの Token が得られます。これは保存しておく必要があります。(忘れても BotFather から取り戻すことができます)。
作成が完了したら、チャンネルの管理者に追加します(メッセージを削除する権限はオフにできます。面倒なのでスクリーンショットは撮りません)。
chatid の取得#
このステップは本当に少し複雑で、私は半日研究しました。
- まず、ここからチャンネル管理に入ります。
- 右上の Edit をクリックし、まずチャンネルを公開します(後で隠すことができます)。
この時点で、あなたのチャンネルにはユニークな名前が付けられています。これを Telegram のノードとしてプッシュすることもできますが、公開したくない場合は、さらに下に進んでください。
- API を通じてメッセージをトリガーします。
Token と channel name をあなたのものに置き換え、メッセージを送信します。
https://api.telegram.org/bot{Token}/sendMessage?chat_id=@{channelname}&text=test
この時点で、相応の内容が得られ、chatid が取得できました。最後にチャンネルを隠して、完了です。
{
"ok":true,
"result":{
"message_id":591,
"sender_chat":{
"id":xxxxxxx,
"title":"Raye's Journey",
"username":"RayeJourney",
"type":"channel"
},
"chat":{
"id":xxxxxxxxx,
"title":"Raye's Journey",
"username":"RayeJourney",
"type":"channel"
},
"date":1689602624,
"text":"test"
}
}
参考#
主に Reorx 大佬の 2 つの記事を参考にしました。
https://reorx.com/blog/sharing-my-footprints-automation/
https://reorx.com/blog/0-cost-self-hosted-n8n-with-railway-and-supabase/