Blueskyに投稿する(GAS使用+IFTTTとの連携)

(2024/02/24 画像添付時のJSONを新しい仕様に対応するよう修正)

具体的にはGASに作成したWebサービスに本文や画像のURLをPostすると、その内容をBlueskyに投稿する、という内容のものを作る。

は?最初からBlueskyに投稿するのと何が違うの?

…なぜかというとこれは外部サイト(ブログ、他SNS等)の投稿をBlueskyに連携するときのためにつくるのです。

以前書いた「Blueskyの自分の投稿をRSSに変換する」記事を先に読んでもらえるとわかりやすいと思います。

Blueskyの自分の投稿をRSSに変換する(GAS使用)
🕒️2023/04/21
Google Apps Script(GAS)を使用してBlueskyの自分の投稿をRSSに変換する方法。IFTTTに食わせたい時などに。

ログインする

Blueskyの自分の投稿をRSSに変換する 参照。ただし今回はaccessJwtだけでなくdidも必要となるのでそれも取得しておく。

let responseJSON = JSON.parse(response.getContentText());
let accessJwt = responseJSON.accessJwt;
let did = responseJSON.did;

文章を投稿する

com.atproto.repo.createRecordに以下のJSONをPOSTする。

{
  "repo": "DIDを指定",
  "collection": "app.bsky.feed.post",
  "record": {
    "text": "投稿文",
    "createdAt": "ISO 8601フォーマットの投稿日時"
  }
}

というわけでこんな感じになる。文字数チェックとかは各自よしなにしてください。

let url = "https://bsky.social/xrpc/com.atproto.repo.createRecord";

let data = {
  "repo": did,
  "collection": "app.bsky.feed.post",
  "record": {
    "text": "New blog posts: https://nigauri.me/everyone-in-2023/",
    "createdAt": (new Date()).toISOString()
  }
};

const options: GoogleAppsScript.URL_Fetch.URLFetchRequestOptions & { method: GoogleAppsScript.URL_Fetch.HttpMethod } = {
  "method": "post",
  "headers": {
    "Authorization": Bearer ${accessJwt},
    "Content-Type": "application/json; charset=UTF-8"
  },
  "payload": JSON.stringify(data),
};
let response = UrlFetchApp.fetch(url, options);
let responseJSON = JSON.parse(response.getContentText());

これで投稿自体は成功する。

ただしこれだと本文中のURLがリンクにならない。ここにリンクを付けたい場合はfacetsという項目をJSONに追加する必要がある。