Blueskyの投稿をGoogleスプレッドシートに蓄積する
3ヶ月前にこんな記事を書きました。
現状では、Blueskyにおける「Twilog」のようなサービスはまだ見かけません。そこで、上記記事の中でも触れたようにRSSを利用してGoogleスプレッドシートに投稿を蓄積していく方法を、詳しく説明したいと思います。
※想定する読者として、「むかしは個人サイトのHTMLを自分で書いたりしていた」「Skyfeedでカスタムフィードを作ることへの心理的ハードルが一切ない」くらいの感覚をもった人をイメージしています。
※Google Apps Scriptを使用します。それなりに細かく説明します。
公式に提供されているRSSフィードについて
以前のBlueskyは招待制だったこともあり、RSSフィードを取得する方法が公式には提供されていませんでした。
現在は、アカウントページのURLの末尾に「/rss」を追加するだけで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の仕様は、たぶん今後いつか変わることもあるでしょう(リプライも取得してほしい)。そのときはこのコードが動かない可能性もあります。
この記事が気に入ったらサポートをしてみませんか?