Plagger でウェブをメールに集約
Plagger とは
10年前に流行は終わってしまった感がある Plagger ではあるが、 ウェブをメールに集約するならばいまだ Plagger の代替となるものはないと思う。 フィードをあれこれ加工が行える。 詳しくはプレゼン資料を参照。
Plagger の衰退理由としては IFTTT や Zapier などの登場や、WebSub や PubSubHubbub のプッシュ型プロトコルの登場、 バッチ方式のプル型の古さ、Perl の衰退などが考えられる。
インストール
- システムを汚したくないので plenv と cpanm を使って HOME 以下にインストールする
- インストールした Perl や Plagger に PATH を通さない
- テストでエラーが出るものは –notest つきでインストールする
- Plagger はインストールせずにレポジトリから直に使用するのが推奨のためインストールしない (assets_path の指定が不要になる。)
sudo apt-get install -y libxml2-dev zlib1g-dev libexpat1-dev libdb-dev libssl-dev libgmp-dev unzip libmpfr-dev swig
git clone https://github.com/tokuhirom/plenv.git ~/.plenv
git clone https://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build
# 子 bash に一旦入る。
PATH="$HOME/.plenv/bin:$PATH" bash
eval "$(plenv init -)"
plenv install -l | head
# バージョンを選択する。マイナーバージョンが偶数が安定版。
plenv install 5.28.0
plenv global 5.28.0
plenv install-cpanm
cpanm YAML::Loader::Base
cpanm Module::Install::TestBase
cpanm LWP::Protocol::https
git clone https://github.com/miyagawa/plagger.git ~/.plagger/repo
cpanm --installdeps ~/.plagger/repo
# エラーがでるなら個別に
cpanm IO::Socket::SSL --notest
plenv rehash
# bash を抜ける
exit
動作確認
~/.plenv/bin/plenv exec perl ~/.plagger/repo/plagger -v
適当な場所 (~/.plagger/conf/*.yaml) に設定ファイルを置いて、 適当なシュルスクリプト (run-plagger) を作成する。
#! /bin/bash
for i in ~/.plagger/conf/*.yaml ; do
~/.plenv/bin/plenv exec perl ~/.plagger/repo/plagger -c $i
done
- 使ってみると結構バグってたのでパッチをかき集めたり、バグフィクスした。次回セットアップするときはこちらで手順を作成する。 https://github.com/fujii/plagger
- Plagger::Plugin::CustomFeed::Twitter を追加した。
- Plagger のテストのためには cpanm –installdeps –with-recommends ~/.plagger/repo で必要なものをインストールする。
内部実装
Plagger を使うには 内部実装、とくにプラグインの hook ポイントを理解しておく必要がある。 ドキュメントはなく、ソースコードの Plagger.pm 内を run_hook で検索するとなんとなく分かる。 また、下のブログにまとめられている。
たとえば Filter::EntryFullText と Deduped での Filter::Rule では Filter::EntryFullText のほうが先に実行されるため、 本文を取得してから重複の削除が行われる。
もしも逆順に重複の削除をしてから本文を取得したいならば、 Plagger を2段階に実行する方法が考えられる。
レシピ
もう少し使ってからまとめる。
https://gist.github.com/fujii/0d88a0757ed1ccf5c0e75d27e157de56
感想
内部実装を理解してないと使えず、かなり時間を要した。 こんなに苦労すると最初にわかっていれば、 Python の rss2email や Python 版 Plagger であるhabuを分解して 機能を再利用したほうが良かったのではないかと思えた。 もしくは、これくらいの規模なら自分の好みの言語で作るのもありかも。 型安全でメモリ管理が楽でライブラリが揃っていそうな Haskell や Rust あたりか。
Deduped を用いるとデータベースを用いた重複削除が行えるが、 重複削除したとに publish の段階でエラーが発生した場合に、 データを失ってしまう可能性が気になる。 Unix 的パイプ型設計の限界かもしれない。 Plagger のようになんでもできる設計ではなく、 feed の取得と mail の送信に特化した設計が望ましい。
Plagger 同様、RSS も Atom も衰退傾向に思われるが、改めて Atom は良い技術だと思った。 WebSub と一緒に普及して欲しい。 一部で流行したてけど、すでに衰退傾向にもみえる Mastodon ではあるが、 WebSub 使っているようなので興味が湧いてきた。
むむむ、 HTML::TreeBuilder::XPath が HTML5 で追加されたタグを扱えない。 HTML::HTML5::Builder::Document でできるような気がするが、そろそろ挫折しそう。