📰

RSS/Atom フィードを Twitter/Nostr にポストする小さいプログラムを書いた。

2023/06/03に公開

はじめに

以前から Twitter の vim_jp アカウントでは、issue やブログ記事を bot として投稿してきました。

先日 IFTTT が Twitter 連携を有料化した事で、RSS/Atom から Twitter に投稿する事が無償ではできなくなりました。

feed2twitter

しょうがないので RSS フィードから Twitter に投稿するプログラムを書きました。

https://github.com/mattn/feed2twitter

cron で動かす想定です。僕は Oracle Cloud の Kubernetes クラスタの cronjob で動かしています。configmap と cronjob の YAML を書けば動きます。コンテナイメージも 5.8MB と小さく、複数のフィードを異なる Twitter アカウントで投稿する時でも同じコンテナイメージを使い回せるので割と便利かも。PostgreSQL を使って既存のリンクを管理します。

投稿フォーマットは Go の text/template で指定します。

GitHub Actions でスタンドアローン起動する方向けのバイナリと、Docker Hub に登録するコンテナイメージを作成しています。同じ様な事をやりたい方にはサンプルになるかもしれません。

feed2nostr

どうせ似た様な処理になるのでと思い、Nostr に投稿するプログラムも書きました。こちらは Twitter の OAuth 認証部分を nsec に置き換えるだけで投稿できます。

https://github.com/mattn/feed2nostr

これまでは curl でフィードを取得し、jq で JSON に変換、dedup で既存リンクを取り除き、nostr 用 CLI コマンドの algia を使って投稿するというシェル芸で実現していました。

#!/bin/sh

set -e

/usr/bin/curl -s -H "User-Agent: Chrome" "https://www.reddit.com/r/golang.json" | \
    /usr/bin/jq -c '.data.children[].data' | \
    /go/bin/ocinosql-dedup -V -k url -hashkey | \
    /go/bin/jsonargs -f /go/bin/algia -V n "{{.title}} #golang_news" "{{.url}}"

シェルを使うのでコンテナイメージが 60MB ほどありましたが、feed2nostr にする事で 5.7MB になりました。Go のニュースフィードを投稿する golang_news と、nostr の仕様変更を投稿する nips_changes という bot がそれぞれ異なる bot として作られていましたが、これらを統合したので合計で 100MB ほど節約できました。

おわりに

Twitter と nostr に合計で7本ほどニュースフィード bot を動かしており、それぞれ別の実装(それぞれ別のコンテナイメージ)になっていましたが、それらを2つのコンテナイメージにまとめました。割と汎用的に作ったつもりなので良かったら使ってみてください。

Discussion