BlueskyとTwitterにクロスポストする一つの方法

BlueskyとTwitterにクロスポストする一つの方法
Page content

青い空と旧青い鳥でつぶやく

X (旧Twitter) から完全に乗り換えるわけではないけれども、Twitterほぼ一本だけに頼った“つぶやきSNS”の利用法はそろそろやめて、Blueskyというサービスも使ってみようかなと、週末ふと考えた。Blueskyの招待コードは先日Facebookフレンドからいただいたものがあって、自分のBlueskyアカウントは既に作成してある。

私は複数の“つぶやきSNS”を使い分ける器用さは持たない故、気軽さを最優先に、TwitterとBlueskyへ投稿する内容は同じで構わないというスタンスのもと、いわゆるクロスポストを行えるスマホアプリやツールがないかなと探してみたところ、ちょうど良さげな「bluesky-crossposter」というツールをGitHubで見つけた。本記事はこのツールの動作を試した内容のメモです。

bluesky-crossposterの使い方

今回見つけた上記リンクのbluesky-crossposterは、Blueskyへの投稿内容を読み取って自動的にMastodonとTwitterへ投稿してくれるPythonスクリプト。通常のPythonスクリプトとしても、また、一式をdocker環境で動作させることも可能となっている。ここでは後者のdockerを使う方法で、ついでにTwitterに加えてMastodonへのクロスポストも行うように設定してみた。

Step-1. 設置と設定ファイルの準備

  1. 適当なサーバなどにdocker環境を用意する
  2. bluesky-crossposterリポジトリをgit cloneする
    $ git clone https://github.com/Linus2punkt0/bluesky-crossposter
    $ cd bluesky-crossposter
    
  3. env.sampleを複製して自身用の.envファイルを新規作成する
    $ cp env.sample .env
    
  4. .envファイルを編集し、以下の変数に、Bluesky, Mastodon, X (旧Twitter) に関する各種の値を記入する
    • Bluesky: BSKY_HANDLEに自身のハンドル名を記入し、https://bsky.app/settings/app-passwords にてアプリパスワードを1つ新規発行してBSKY_PASSWORDに記入する
      BSKY_HANDLE="XXXXXXXX.bsky.social"
      BSKY_PASSWORD="XXXX-XXXX-XXXX-XXXX"
      
    • Mastodon:
      • Mastodonへの投稿を実行する・しないのフラグがMASTODON_CROSSPOSTINGだと思われるが動作未確認 (デフォルト: TRUE)
      • MASTODON_INSTANCEには利用中のインスタンスが例えば https://mastodon.social/ であればそれを記入し、https://mastodon.social/settings/applications にて「write:statuses (投稿の送信)」権限と「write:media (メディアのアップロード)」権限の2つを持つ新規アプリを作成し、得られたアクセストークンをMASTODON_TOKENに記入する
        MASTODON_INSTANCE="https://mastodon.social/"
        MASTODON_TOKEN="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
        
    • Twitter:
      • Twitterへの投稿を実行する・しないのフラグがTWITTER_CROSSPOSTINGだと思われるが動作未確認 (デフォルト: TRUE)
      • https://developer.twitter.com/en/portal/projects-and-apps にて「App permissions = Read and write」, 「Type of App = Web App, Automated App or Bot」, 「App info = 適当なURL」, 「Website URL = 適当なURL」のアプリを新規作成し (※OAuth 2.0はbluesky-crossposterでは使わない気がしますが入力欄が“入力必須”属性なのでとりあえず埋める)、得られた「API Key and Secret」と「Access Token and Secret」を以下の4つの変数に記入する
        TWITTER_APP_KEY="XXXXXXXXXXXXXXXXXXXXXXXXX"
        TWITTER_APP_SECRET="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
        TWITTER_ACCESS_TOKEN="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
        TWITTER_ACCESS_TOKEN_SECRET="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
        
  5. (オプション) .envファイルのその他部分を編集する
    • 実行間隔RUN_INTERVALのデフォルト値 (3,600秒) を変更したい場合は記入する (BlueskyのAPIのレート制限に抵触しないように注意)
      RUN_INTERVAL=900
      

Step-2. クロスポストの実行

  1. bluesky-crossposterリポジトリのディレクトリで次のコマンドを実行する (これによりコンテナ名bluesky-crossposter-crossposter-1が起動してくると想定)
    $ docker compose up -d
    
  2. dockerのpsコマンドでコンテナが起動していることを確認する
    $ docker ps
    
  3. dockerのlogsコマンドでログを閲覧してまずはPythonやAPIに関するエラーが出ていないことを確認し、何らかのエラーが発生していれば問題を切り分けして対処する
    $ docker logs -f bluesky-crossposter-crossposter-1
    
  4. Blueskyへ投稿した内容が、MastodonとTwitterへクロスポストされることを確認する (初回起動時は最近の (POST_TIME_LIMITの時間内に行われた) Bluesky投稿がすぐにクロスポストされ、その後はRUN_INTERVALの時間間隔で新規投稿のチェックが定期実行される)
  5. ログファイルはコンテナ内の/logs/ディレクトリに保存されていく
    $ docker exec -it bluesky-crossposter-crossposter-1 ls -al /logs/
    

Step-3. 常用するならば

  • サーバ起動後にbluesky-crossposterコンテナが自動起動する設定を行っておくほうが良いだろう。お好みの方法で仕込むべし
  • Blueskyの新規投稿チェックを、現状だと24時間ずっと同じ時間間隔で行っている。自分の投稿頻度に合わせて、かつAPIの利用回数を無駄遣いしないためには、投稿チェックの間隔を昼夜で可変にするような仕組みがほしい。そこは今後工夫してみようと思う

感想

長年使ってきたX (旧Twitter) であるが、日々のなんでもないつぶやきを投稿する場所として、使い勝手や情報環境的にTwitterがベストという流れでは最近なくなっている気がする。その観点から、今後の伸びしろが大きそうな (=第一にプログラミング的に色々できそうな) 別のサービスにつぶやいたものをTwitterにも流す、という投稿フローを今回試すことができて、私はなんだか安心した。これは、次のつぶやき場所をどうするかの目処が少し立ったことから来る安心感かもしれない。