具体的にはGASに作成したWebサービスに本文や画像のURLをPostすると、その内容をBlueskyに投稿する、という内容のものを作る。
は?最初からBlueskyに投稿するのと何が違うの?
…なぜかというとこれは外部サイト(ブログ、他SNS等)の投稿をBlueskyに連携するときのためにつくるのです。
以前書いた「GASを使用してBlueskyの自分の投稿をRSSに変換する」記事を先に読んでもらえるとわかりやすいと思います。
もくじ
ログインする
Blueskyの自分の投稿をRSSに変換する 参照。ただし今回はaccessJwt
だけでなくdid
も必要となるのでそれも取得しておく。
1 2 3 |
let responseJSON = JSON.parse(response.getContentText()); let accessJwt = responseJSON.accessJwt; let did = responseJSON.did; |
文章を投稿する
com.atproto.repo.createRecord
に以下のJSONをPOSTする。
1 2 3 4 5 6 7 8 |
{ "repo": "DIDを指定", "collection": "app.bsky.feed.post", "record": { "text": "投稿文", "createdAt": "ISO 8601フォーマットの投稿日時" } } |
というわけでこんな感じになる。文字数チェックとかは各自よしなにしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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に追加する必要がある。