Nostrに投稿するための自分用のWebhookエンドポイントを用意する
Discramer:
本記事は、本記事に記述した内容を閲覧して、閲覧者およびその関係者がとった行動により何等かの不利益が生じても、執筆者であるryo_gridがいかなる責任も負わないことに閲覧者が同意した場合のみ、閲覧が認められます。
要するところ、この記事を参考にする場合、全ては閲覧者の自己責任であることを承知の上、閲覧をお願いします。
---------------------
どうもryo_gridです。
拙作algia-webというNostrクライアントの実装が置いてあるGitHubリポジトリの receive-post-from-gas ブランチの algia-serv.py を pythonコマンドで 実行すると、Webhookのエンドポイントになるようにしてみました。
具体的には、
(デフォルトで動かすと上記のアドレスになりますが、運用時はポート番号と '/sub' のところは各ユーザが変更したものになります。というか、なっていないとまずいです)
というURLに、
{ "tweet" : "<Nostrに投げたい文字列(エスケープ済み)>" }
というJSONを "Content-Type: application/json" とContent-Typeを指定してHTTPでPOSTすればOKです。
例えば、IFTTTのThenのところで、Webhookサービスを用いて投げる場合は以下のように指定すればOKです。
https://scrapbox.io/files/63f9db687785cc001c2edf93.png
(画像だと見にくかったりコピペしにくいと思うのでテキストにすると、)Bodyのところの内容は以下です。
{ "tweet" : "<<< Text >>>" }
エスケープのために <<< Text >>> という形で囲んでいます。
(これがないと Text に URLなどが含まれた場合にWebhookのエンドポイントでJSONのデシリアライズに失敗して中身がおかしくなり、リクエストがコケる)
また、JSONにおけるキーと値のそれぞれをダブルクォーテーションで囲んでいるのを見落とさないようにご注意下さい。
JSONのキーが tweet になっているのは、元々私がTwitterとのマルチポストを行うために作成したものであるためです・・・
気に入らなければ、algia-serv.py の 中の 10行目 のところを書き換えてください。
注: ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
なお、作成したエンドポイントのアドレスを他人に知られた場合、なりすまし投稿され放題になってしまうので、第三者に絶対にアクセスされないよう、
algia-web.pyの6行目の '/sub' のところを '/<他者が推測不可能な長さのアルファベットおよび英数字からなる文字列>' に書き換える
algia-web.pyの18行目の 10000 とメッセージを待ち受けるポート番号を指定しているところを 10000~20000 の間で他者に推測されない番号を選んで、その番号に書き換える
の2点を絶対に!!!して下さい! 絶対に!!!です。(大事なことなので2回言いました)
注! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
■使用例
TwitterとNostrにマルチポストしたい
=> IFTTTの If のところで Twitterサービスの "New tweet by you" というのを使う
その他
IFTTTの If のところで利用できるサービスに、自身のやりたいことを可能とするものがあればそれを利用
IFTTTでなくとも、エンドポイントのURLに上述の形式でデータを投げつけることができれば、基本的にはどのような方法をとろうがエンドポイントは機能します
文字コードはUTF-8である必要があります
■対応するプラットフォーム
algia-web(および内部で利用するalgia)は、少なくとも Linux、MacOS、Windowsで動作しますが、以降はLinux環境を前提に説明します
上記の3つ以外のプラットフォームを利用する場合も、大きく手順が変わることはないはずなので、ご自身のITリテラシを発揮して頑張ってください!
algiaのバイナリの自前でのビルドは必要になるかと思います
■セットアップ方法
エンドポイントを立てたいマシンにて、
手順はリンク先を参照してもらえればと思いますが、ビルド済みのバイナリが配布されているのでそれを適当なところに置いてPATHを通し、リレーサーバの情報と秘密鍵の情報を記述した config.json を作成すればひとまずOKです
Linux機であれば、configの配置パスは ~/.config/algia/config.json になります
以降に進む前に、下を実行して algia 自体が正しく投稿が行われるか確認しておくと良いです
$ algia n "<投稿テストしたい文字列>"
続いて algia-web (webhookエンドポイントとして動作)をセットアップします
(Python環境が無い、Gitがインストールされていない、という場合はそれらのセットアップを済ませたあとで下に進んでください)
適当なディレクトリで、
$ cd algia-web
$ git fetch
$ git checkout receive-post-from-gas
$ git pull
$ pip install -r requirements.txt
!!!! ここで、上の"注"のところで書いた algia-web.py の修正を行う !!!!
で、
$ python algia-serv.py
とすれば動きます。ただ、通常はコンソールを閉じても実行を継続していてもらわないと困ると思うので、
$ nohup python algia-serv.py &
などとして、バックグラウンドで動き続けるようにします。終了させる場合はkillコマンドでkillして下さい
algia-serv.py の標準出力とエラー出力は、$ nohup (略)を実行した際のカレントディレクトリの nohup.out に出力されます。うまくいかない時はその内容を確認してみて下さい
algia-web.py が待ち受けているポート番号にインターネット上からアクセスできるよう、上で選んだポートが外部からのアクセスを拒否するようになっていれば、アクセスが通るよう開けてください
通常は iptables や firewalld の設定が必要になるはずです
SELinuxが有効になっている場合はそこの対応も必要かもですが、まあ、よしなにやって下さい・・・
■ httpsでないと嫌である、投げる元の都合上 https でないと使えない場合
方法1 : サーバ用の証明書と秘密鍵を用意した上で、algia-web.py で Flaskのサーバを起動している最終行のところをよしなに修正
方法2: AWSのEC2に立てるとかであれば、Webhookへのメッセージ送信元とElastic Loadbalancer(ELB)の間は httpsでやりとりしつつ、ELBとエンドポイントの間はhttpで通信する、という構成が可能です。証明書もAWSが無料で発行してくれるのでラクですが、ELBの利用料は甘く見ないようにした方がよいです