マストドン向けに「しゅうまい君」もどきをセルフホストできる「Self-Shumai For Mastodon」を Deno で作った

Twitter から離れて久しい。最近また Mastodon を少し触ったりしていて、Twitter よりも API が簡単に扱えるので、少しオモチャを作ってみた。その名も Self-Shumai For Mastodon

Twitter には、フォロー中の人達のツイートから文章を自動生成する「しゅうまい君」という有名な Bot がいる。今回作ったのはその Mastodon 版といえる、簡素なモノ。TypeScript で実装し、Deno をランタイムとして動作する。

必要なのは Mastodon の API トークンだけ。自分のホームタイムラインを収集して SQLite に一定量蓄え、マルコフ連鎖で文章を生成し、定期的に投稿する仕組みだ。

SQLite の操作には、内部的に WASM を使っているという Deno の sqlite@v3.7.0 を使用。FFI で動く SQLite と違って環境依存しにくいという。全てのクエリが同期処理で動作するのが面白い。

ホームタイムラインの収集や投稿処理で Mastodon API をコールしているが、Deno 組み込みの fetch() 関数が使えるのでこの点は楽。

マルコフ連鎖には npm パッケージである npm:@hideokamoto/markov-chain-tiny@0.1.0 を使用。コレが一番コンパクトで依存モジュールが少なく、手軽にマルコフ連鎖を実施できると思う。内部では TinySegmenter を使っている。Deno 用のパッケージとしては deno-markov-chain というモノがあるようなのだが、コチラは未検証。せっかくだし (?) 以前検証したことのある npm パッケージを Deno で読み込んで使ってみた次第。

TypeScript で書いてそのまま実行でき、VSCode で Deno Linter も効いてくれるので Node.js よりも開発体験が格段に良いと思う。外部ライブラリを URL で読み込むのにも慣れてきたものの、import があちこちに点在するとバージョンアップ対応が大変かな、と思った。この辺どういう風に扱っていくのが良いのだろう?

起動して放置しておけば毎分クロールしてマルコフ連鎖・投稿を行うような作りにしているが、各自で拡張してもらえば、もっと色んなトゥートをクロールしまくっておき、マルコフ連鎖処理と投稿処理を分離して投稿対象の文章は手作業で選定したりもできると思う。皆さんの Fork お待ちしてます。w