見出し画像

Blueskyの投稿をGoogleスプレッドシートに蓄積する

3ヶ月前にこんな記事を書きました。

現状では、Blueskyにおける「Twilog」のようなサービスはまだ見かけません。そこで、上記記事の中でも触れたようにRSSを利用してGoogleスプレッドシートに投稿を蓄積していく方法を、詳しく説明したいと思います。

※想定する読者として、「むかしは個人サイトのHTMLを自分で書いたりしていた」「Skyfeedでカスタムフィードを作ることへの心理的ハードルが一切ない」くらいの感覚をもった人をイメージしています。
※Google Apps Scriptを使用します。それなりに細かく説明します。

公式に提供されているRSSフィードについて

以前のBlueskyは招待制だったこともあり、RSSフィードを取得する方法が公式には提供されていませんでした。

現在は、アカウントページのURLの末尾に「/rss」を追加するだけでRSSフィードを取得できます。

こんな感じです。

すると勝手に、

https://bsky.app/profile/did:plc:qfqade7nxgjzngi3nqelvgpn/rss

こんな感じの did 表記のURLにリダイレクトされます。

Blueskyの(現在の)RSSフィードについて、2つ注意点があります。

・基本的なpostしか拾わない
どうやら、リプライは拾われないみたいです。他のユーザーへのリプライも、自分の投稿へのリプライも、RSSフィードに含まれません。なんで。
リポストについては、自分の投稿をリポストした場合は含まれます。他のアカウントの投稿をリポストしても拾いません。

・公開していないと使えない
設定のモデレーションのところで「ログアウトしたユーザーからの可視性」をオンにしておかないと、RSSフィードを見ようとしてもエラーになります。まあ、それはそうね。

Bluestreamについて

現在の公式RSSフィードはちょっと不十分です。他のやり方ができないだろうか? Bluestreamがあります。

ただし、このサービスは個人で開発運用されているものです。最近のユーザ数の増加によって、安定した提供がかなり難しくなってきているようです。

その他の方法

パソコンが得意な人は、こちらなども参考にしてみてください。

わたしはよくわかりません。

以下では、公式の提供するRSSフィードを使っていきます。

Googleスプレッドシートでコードを書く

ファイルを作成する

まずは自分のGmailアカウントでGoogleスプレッドシートを開きましょう。
ファイル名を適当につけたら、「拡張機能」からApps Scriptを選びます。

スクリプトエディタを開く

すると、Apps Scriptと左上に書かれたページが開くと思います。

プログラムを書く

右下のいかにもプログラムを書きそうなところに書いていきます。

下記のコードをコピペで貼り付けてください。(4行目のrssUrlのところは自分のアカウントのURLを入れてくださいね)

function myFunction() {
  var spreadsheet = SpreadsheetApp.getActive(); //このスプレッドシートファイル
  var sheet = spreadsheet.getActiveSheet(); //いま開いてるシート

  var rssUrl = "https://bsky.app/profile/did:plc:qfqade7nxgjzngi3nqelvgpn/rss"; //自分のアカウントのURLに変更してね

  // RSSから各テキストを取得
    var response = UrlFetchApp.fetch(rssUrl);
    var xml = response.getContentText();
    var document = XmlService.parse(xml);
    var channel = document.getRootElement().getChild("channel"); 
    var items = channel.getChildren("item");
    var itemsLength = items.length -1;

    sheet.getRange(1,1).setValue("url"); //このあとのexistingLinksの部分が初回はうまくできないので入れている
    var existingLinks = sheet.getRange(1, 1, sheet.getLastRow() , 1).getValues();

    // シートにテキストを格納
    for (var j = 0; j < itemsLength +1; j++) {
      var k = itemsLength - j ;
      var item = items[k];
      var link = item.getChild("link").getText();               //ポストのURL
      var description = item.getChild("description").getText(); //ポストの投稿内容
      var pubDate = item.getChild("pubDate").getText();         //ポストの投稿日時
    
      // シートに格納済みのポストURLと、いま取得したポストURLを比較して、重複があれば処理を終了
      if (existingLinks.some(row => row[0] === link)) {
      continue;
      }

      //シートの一番下の行にいま取得したものを格納
      var lastRow = sheet.getLastRow() + 1;   //最終行を取得して+1
      sheet.getRange(lastRow, 1).setValue(link);
      sheet.getRange(lastRow, 2).setValue(description);
      sheet.getRange(lastRow, 3).setValue(pubDate);
     
      //pubDateの形式が読みにくいので変換する
       // 入力日付をDateオブジェクトに変換
       const dateObject = new Date(pubDate);
       // JSTに変換するために9時間を足す
       dateObject.setHours(dateObject.getHours() + 9);
       // 新しい日付のフォーマットを設定
       const newDateFormat = "yyyy-MM-dd HH:mm:ss"; // 例: "2023-09-02 02:08:46"
       // 新しい日付フォーマットに変換
       const formattedDate = Utilities.formatDate(dateObject, "GMT", newDateFormat);
       // 変換された日付をセルに格納
       sheet.getRange(lastRow, 4).setValue(formattedDate);
    }

}

コードを貼り付けると、こんな感じの画面になると思います。

メニューバーみたいなところの「実行」の左にあるフロッピーディスクを模したアイコンをクリックして、プログラムを「保存」しましょう。

保存すると、「実行」が押せるようになります。

実行する

はじめて「実行」するときは、承認を求めてきます。

「権限を確認」から進んでいくと、やばそうなアラートが出ます。

いま自分でつくったばかりなのでGoogleが確認してないのは当然ですね。強い気持ちで左下のちいさな「詳細」をクリックします。

一番下に表示された「〜(安全ではないページ)に移動」をクリックして、先に進めてください。

プログラムがうまく実行できれば、スプレッドシートにはこんな感じで投稿が格納できているはず……。

トリガーを設定する

無事にRSS経由でスプレッドシートに保存できるようになったら、このプログラムを自動で定期実行させましょう。

左のサイドバーにある目覚まし時計みたいなアイコンから「トリガー」を設定できます。

たぶんこんな感じの画面に飛ぶので、右下にある「トリガーを追加」をクリックします。

こんな感じの画面が出てきます。
「イベントのソースを選択」を、「時間主導型」にします。
「時間ベースのトリガーのタイプを選択」が出てくるので、好きなものを選んでください。Blueskyへの投稿頻度に応じて、1時間おきとか6時間おきとかにしておけばいいと思います。

これで完成です。トリガーの設定時間になるまでにポストしておいて、ちゃんとスプレッドシートに格納されるかどうか確認してみてください。

諸注意

筆者はふつうのBlueskyユーザにすぎず、職業プログラマではありません。GASもちょっとわかるだけの人ですので、上記のコードに誤りがある可能性などに責任は持てません。ご了承ください。「なんか動かないんだけど」とか「ここはこうした方がいいよ」とかのコメントは歓迎です。

また、Blueskyの提供するRSSの仕様は、たぶん今後いつか変わることもあるでしょう(リプライも取得してほしい)。そのときはこのコードが動かない可能性もあります。

この記事が気に入ったらサポートをしてみませんか?