Go to this month’s calendar
2020 / 11 / 24

リングフィットアドベンチャー

第 32 回目。

ついにデプロイ、エピオルニス!

というわけで、Twitter のツイートを Mastodon に流すやつ、ついに一通り機能が完成してデプロイすることができた。環境変数を本番環境のサーバで設定し忘れていて、デーモナイズしても投稿されなかったというハプニングはあったが、それ以外は比較的簡単にデプロイすることができた。

Twitter Webhook Pass-through が Twitter からこちらの Webhook URL に向かってくる Account Activity を受けて Aepyornis に投げるやつ。

そして Aepyornis 側でこれ (ツイート) を受け取り、Mastodon に投げる、ということをしている。

単にツイートを拾って投げるだけなら、IFTTT で Twitter をトリガーにして、アクションを Webhook にして、その Webhook の URL を Mastodon の API に設定すれば良いんだけど、それだといろいろ気に入らない点がある。

まず、短縮 URL。Twitter はツイートに貼り付けた URL が全部 t.co とかいう短縮 URL に置き換わってしまう。それを展開した URL、つまり本当の URL に置き換えたかった。

それから画像。画像はさすがに IFTTT のレシピでは対応不可能。単純に Twitter の画像のリンク (twimg) が t.co で短縮されてくっつくだけ。しかも画像そのものの直接的なリンクじゃなくて、Twitter のツイートへのリンクになっている。

他にも、リツイートをどう表示するかとか、引用した場合とか、先頭に @username が含まれている場合は無視するけど、途中に含まれている場合は無視しない、とか、細かいところを自分で決めたかった。ここまでなるとさすがに IFTTT みたいなサービスを使ったやり方では無理で、自前で実装する必要がある。

そんなわけで、Twitter の Account Activity API を使って、自分のツイートが投稿されたら Twitter から Webhook で受け取り、それをいろいろとフィルタリングしたり加工したりして Mastodon に投稿する (画像があればそれも) というものを作ったわけ。

本当はずっと前から作りたいと思っていたけどなかなか重い腰が上がらずに放置していた。でも数日前にようやくやる気になって実装したという感じ。

何が一番やる気なかった原因かって、Twitter の Account Activity API だ。User Stream があればそれで良かったのだがあれは 2 年くらい前に廃止されてしまったので、リアルタイムで自分のツイートを拾おうと思ったら Webhook しかないのだ。

別にリアルタイムで拾う必要性はないが、ポーリング形式だと、どこまでツイートをトラッキング (Mastodon に投稿) したかをいちいち記録しなくちゃいけなかったりめんどくさい。スマートにやるなら Webhook だなと、実装する前の構想で決まっていた。

でも Webhook ってなんかめんどくさそうだし時間かかりそうって感じで敬遠していた。やってみればどうってことはない1んだけどね。

それよりも Twitter API のレスポンス JSON が気持ち悪かったことのほうがインパクト大きいかな。リツイートしたときにだけ出てくる retweeted_status とか、リツイートにコメントをつけると、retweeted_status じゃなくて quote_status になるとか。そういうキーは、ツイートの種類によって返したり返さなかったりじゃなくて、常に返してほしい。リツイート (引用リツイート) じゃなければ値を null にするとかさ。

あと、ツイートが長いと、ツイートの内容 text が、途中で、... になって省略されて、省略されないテキストは full_text という別のキーが、これまた新たに出てきてそっちにあったりとか。なんでそんな七面倒臭い仕様になっているんだか、全く。

まあなにはともあれそれらのめんどくさい部分もなんとか実装した。

これで開発終わりって感じじゃなくて、逆に Mastodon → Twitter もやりたい。でもその場合は、Twitter のほうが文字数制限が厳しいから、文字数超えたら ... で省略して Mastodon のリンク貼らないといけない。めんどくさいことに Twitter ってマルチバイト文字と英数字で扱いが違う2ので、それも対応しないといけなくてこれまためんどくさいことになりそう。なんで Twitter こんなにめんどくさい仕様なの??

まあそれも追々やっていこうかなと思う。

本番にデプロイして最初に投稿できたトゥート。

Annict の Twitter 連携のツイートも Mastodon に流せるようになった。

YouTube もいける。

Nintendo Switch からの共有も OK。

なかなか良い感じ。

余談だけど Twitter のツイートを埋め込むより Mastodon のトゥートを埋め込んだほうがきれいだよね。<iframe> もシンプルだし。

やっぱり Mastodon をメインにしたい。self hosted な SNS だし、愛着が湧く。自分の裁量で管理できる場所に記録を残すのが個人的には大好き。


  1. どうってことなくもなかったけど……。【エラーコード別解説】Twitter の Account Activity API の Webhook URL が登録できないときの解決法 

  2. マルチバイト文字 (日本語) だけなら 140 文字、英数字だけなら 280 文字。というより厳密には 280 文字まで書き込めるが、マルチバイト文字は 2 文字分食うって仕様だったかな、たしか。