Twitter が来年出会い系サービス になっちゃうらしいですね。 わおわお 🤗
前回 は FlyFree というツールの紹介の話しかできなかったので、今回はその続きの発想と実装の話を書いていこうと思います。
ちなみに前回記事を書いた後は、 FlyFree を使ってマルチポストできています。やったぁ 🤗
FlyFree を使って両方にポストすると・・・
こんな感じでリンクカード付きで(og:image があれば)両方にポストされます!
まだ使ってない人は(特に Twitter に出戻っちゃった人は)ゼロコストで Bluesky に投げられるので試しに使ってみてね 🤗
ちなみに FlyFree 公開直前に Twitter 側の description がなくなってしまい 、リアルに「なにもしてないのに壊れました」になりました 🥺 どゆことなの・・・ 🥺 🥺
2023 年 7 月前後で起きた Twitter 事変(勝手に命名)ですが、閲覧量の制限とか、 API の大部分の有料化?とか、色んな制限がかかるようになりました。
もはや API は叩けない前提で考えていく必要があるのです。
思想の話は 前回記事 を参照してもらうとして、さて実際に Twitter に投稿するついでに Bluesky にもゼロコストで投稿させるにはどうすれば良いでしょうか?
色々考えていたのですが、 拡張機能でスクリプトを流し込める ことに気づくのでした 👼
そう、 Twitter API がなければ https://twitter.com
上で投稿するついでに、そのまま Bluesky 側の API を叩いて投稿 させたら良いのです。
ということで、その発想を元に拡張機能を作り始めました。
ですが・・・
そう。もう見るのが辛くなってしまったのです。
もはや Twitter を見なくなってしまい、 Bluesky に完全に移動した僕にとって、こんなツールを開発していく動機など微塵もなかったのでした。チーン 😇
twitter.com
がダメなら /intent/tweet
に投げればいいじゃないわざわざ見に行かないというのもそうですが、それに目をつむって開発していったとしても、自分が使わないツールの動作確認のために、わざわざ毎回 Twitter へチェックしに行くのも辛いわけです。
そこで開発停止しつつももやもやしていた際に、 再び良い発想が舞い降ります 👼 👼
そうだ、これがあった・・・!
https://twitter.com/intent/tweet
の クエリパラメータにタイトルと URL を乗っけるやつ!
昔カスタムされたツイートボタンとか作るときによく使ったわあ 🤗
そう、これなら Twitter の邪悪なタイムラインを一切開かずに投稿だけさせる ことが可能なのです。
さらに、 SNS ごとに ON / OFF のボタンをつけておけば、もはや Twitter にも投稿しなくなった僕にも使えるツールになるに違いない!
これなら開発者当人でも許容できそう! => 開発再開 🙌
そう、ここまで読んでもうお気づきかと思いますが、 FlyFree は、実は Twitter API など叩いておらず、ただただ Twitter UI に手動で投稿していただけ だったのです・・・!
「つまり、きみはただ Twitter UI に普通に書いていただけだったんだよ!!」
そう、普通に書いていただけ。
Bluesky だけに投稿していたそこのあなたも、実は Twitter UI に入力していて、 最後の最後に Twitter に投稿してないだけ だったのです。
なんという 悪魔的寸止め! 😈 なんという 悪魔的発想! 😈
価値のあるものを作るためには、ベースにある 筋の通った思想 とそれを スマートに解決するための良い発想 が必要なのです。材料は揃った 🤗
ということで、気を取り直して実装の話です。
仕様をまとめるとこんな感じです。
Draft
(草稿情報)という名前Draft
を元に 投稿可能か判定 できるようにするDraft
を Post
(投稿情報)に変換するPost
を元に API を叩くbackground.js
) 側で行うMutation Observer
で監視して変わったら上書きし直しだいたいこんなところでしょうか?
詳しくは https://github.com/girigiribauer/fly-free にある通りなので、そちらをご覧ください。ちなみに僕の英語学習の促進のため、全員にシンプルな英語を使ってね、と縛っています 😏
Bluesky にアカウント作成した直後、 Sky Follower Bridge という Twitter 上で同じ名前のフォロワー・フォロイーを探せる拡張機能を使わせてもらっていて(すごく便利でした!ありがとうございます 🙏 )、そこで初めて plasmo というフレームワーク を知りました。
options.html
の画面のみmanifest.json
に書く代わりに package.json
に必要権限を書いておけば、後はビルドコマンドで変換できるplasmo build --zip
で 1 発だったこんな感じでしょうか?中々に便利そうです 🤗
あとはドキュメントを読んでみてください。 https://docs.plasmo.com/
plasmo のドキュメントもそうですが、それよりも拡張機能そのもののドキュメントをしっかり読んだ方が、結果的に plasmo の使い方もすんなり分かってくるんじゃないかと思います。
content.js
run_at
で(一応)指定できるchrome.runtime
, chrome.storage
など)background.js
twitter.com
上で bsky.social
に対して API 投げるoptions.js
上手くいかなかったところのメモです。
気になるところがあれば、あるいはこの後でスッキリ解消できたら、必要に応じて深掘りして別途記事にするかもです。
build/
, .plasmo/
ディレクトリを全部消してからビルドし直してるcontent.js
と options.js
だけで使うものに限った方が良さげcontent.js
側では React 的に(非同期を極力使わずに、今あるかどうかをそのまま即時返答する)すぐ返すが、 background.js
側では非同期で返す作りになるcontent.js
では CSS Modules
が使えたが、スクリプトとスタイルの流し込みの関係上、1 つにまとめたスタイルファイルを生成する必要があったgetStyle()
を export すると、埋め込み時にそれが勝手に呼ばれるCSS Modules
までは解決してくれないcontent.js
の getStyle()
内ですべての子コンポーネントのスタイルファイルを連結して出力させたrun_at
で流し込みのタイミングが指定できるはずが、どうもそれが正しく動いてない環境があるらしい・・・?初回審査は、毎日 Google 神に祈りを捧げる日々でした 🙏 🙏 🙏
現時点では、 雑だけど概ね自分で困らずに使えてるレベル のものなので、これからテスト拡充するなどしてもっとクオリティ上げていかないといけません。ゆるゆると頑張ります! 💪
Twitter はもうないので この投稿画面もいつなくなるか分かりません。
そういった意味で いつ壊れるか分からない時限爆弾ツール 💣 でもあります。
マルチポストツールと謳ってはいますが、あくまで マルチポストは手段であって目的ではありません。 本当にやりたいことは Twitter に縛られずに自由に羽ばたくこと なので、今のうちからみんなで FlyFree を使って移行先を見繕っていきましょう! 🤗
両方アカウント持ってるけど Twitter にしかほとんど投稿してない、って方に勧めてあげてください! 🙏
タイッツー へは API が用意され次第対応していく予定です!
ちなみにタイッツーのアカウントはこっち(アイコンが意外と良いのでデフォルトのまま使ってます) https://taittsuu.com/users/girigiribauer
『FlyFree』 という名前の次点候補に 『ノアの方舟』 という候補があったのですが、あまりにも露骨すぎてどこかから怒られると思ったのでやめました 🤪