RSS/Atom フィードを Twitter/Nostr にポストする小さいプログラムを書いた。
はじめに
以前から Twitter の vim_jp アカウントでは、issue やブログ記事を bot として投稿してきました。
先日 IFTTT が Twitter 連携を有料化した事で、RSS/Atom から Twitter に投稿する事が無償ではできなくなりました。
feed2twitter
しょうがないので RSS フィードから Twitter に投稿するプログラムを書きました。
cron で動かす想定です。僕は Oracle Cloud の Kubernetes クラスタの cronjob で動かしています。configmap と cronjob の YAML を書けば動きます。コンテナイメージも 5.8MB と小さく、複数のフィードを異なる Twitter アカウントで投稿する時でも同じコンテナイメージを使い回せるので割と便利かも。PostgreSQL を使って既存のリンクを管理します。
投稿フォーマットは Go の text/template で指定します。
GitHub Actions でスタンドアローン起動する方向けのバイナリと、Docker Hub に登録するコンテナイメージを作成しています。同じ様な事をやりたい方にはサンプルになるかもしれません。
feed2nostr
どうせ似た様な処理になるのでと思い、Nostr に投稿するプログラムも書きました。こちらは Twitter の OAuth 認証部分を nsec に置き換えるだけで投稿できます。
これまでは 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