イーロン・マスクの買収以降、Twitterは何かと混乱していますが、日本ではそこまでの影響はないように思えます。
それでも一部の人たちはTwitterから新天地を求めて、いろいろなSNSを試している段階ではないでしょうか。
現在マイクロブログのトレンドは分散型で、サービスそのもので囲い込まずに、プロトコルを定義していろいろなサービス・サーバがつながっていく、という流れになっています。
主なプロトコルには、Mastodon・Misskeyなどが採用するW3C標準の
ActivityPub、Twitterの創設者であるジャック・ドーシーが投資しているNostr、そして今回の主題であるBlueskyが採用するAT Protocolなどがあります。
一応これらのサービスを一通り試して見たのですが、現状1番面白く、居心地良いのはBlueskyです。
Blueskyはなぜか日本の開発者が活発に活動しており、Blueskyの世界初のミートアップは日本で開催されました。
Bluesky Meetup in Tokyo - connpass
またタイムラインにはクライアントやライブラリに関する投稿やボットによる投稿がどんどん流れてきます。
自分も開発者の端くれではあるので、そんな投稿に触発されてAT Protocolで軽く何か試してみようという気になりました。
そこで今回、単純にSwift PlaygroundからBlueskyへの投稿をするスクリプトを作ってみることにします。
参考にしたもの
先ほど申し上げた通り、Blueskyは日本で活発に開発されており、有志による日本語ドキュメントが整備されています。
ただ、こちらのページを見ればAT Protocolがわかるという感じではありませんが、わからないことを検索するとこちらのページがヒットする、ということがままあります。
AT Protocol (BlueSky Social)仕様解説 ~ W3C DID仕様を添えて ~ - Qiita
全体像を知る、という意味ではこちらのページがまとまっていてわかりやすかったです。
またAT Protocolの仕様自体は、やはりというか本家のドキュメントを参照するのが1番早いように思われます。
Lexicon
AT protocolでできることは全てLexiconというJSONスキーマで定義されています。
上記ドキュメントではLexiconの詳細な定義が記載されていますが、Lexiconには有り体に言ってしまえば、サーバへのリクエスト方法とレスポンスのJSONのフォーマットが記載されています。
{
"lexicon": 1,
"id": "com.atproto.server.createSession",
"defs": {
"main": {
"type": "procedure",
"description": "Create an authentication session.",
"input": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": [
"identifier",
"password"
],
"properties": {
"identifier": {
"type": "string",
"description": "Handle or other identifier supported by the server for the authenticating user."
},
"password": {
"type": "string"
}
}
}
},
"output": {
"encoding": "application/json",
"schema": {
"type": "object",
"required": [
"accessJwt",
"refreshJwt",
"handle",
"did"
],
"properties": {
"accessJwt": {
"type": "string"
},
"refreshJwt": {
"type": "string"
},
"handle": {
"type": "string",
"format": "handle"
},
"did": {
"type": "string",
"format": "did"
},
"email": {
"type": "string"
}
}
}
},
"errors": [
{
"name": "AccountTakedown"
}
]
}
}
}
com.atproto.server | AT Protocol
こちらはサーバとのセッションを確立するためのcom.atproto.server.createSession
のLexiconになります。
input
以下のオブジェクトがリクエストの際に必要なパラメータを記載しており、output
以下がレスポンスで帰ってくるJSONのフォーマットが記載されています。
"type": "procedure"
という部分は主にHTTPのメソッドに関わるもので、procedure
の場合POSTメソッド、query
の場合GETメソッドというような分類になります。1
type
がprocedure
の場合、POSTのHTTPBodyにJSONを渡す形でリクエストを行います。
{"identifier":"(ハンドルもしくはDID)","password":"(パスワード)"}
するとこういったレスポンスが返ってきます。
{"accessJwt":"(アクセストークン)","refreshJwt":"(更新用トークン?)","handle":"(ハンドル)","did":"(DID)","email":"(メルアド)"}
XRPC
サーバへの問い合わせはXRPCというプロトコルで行われます。
上記記事を雑にまとめると、必要な場合はヘッダに認証情報を付加して、/xrpc/{methodId}
にアクセスするという感じになります。
先ほどのcom.atproto.server.createSession
を例にとると、
https://bsky.social/xrpc/com.atproto.server.createSession
にPOSTすることになります。
分散型SNSですので、インスタンスによってドメインの部分は変わる場合がありますが、問い合わせ方法は仕様として決まっています。
投稿までの流れ
今回、スクリプトを作成するためにいろいろ調べている間に、「Blueskyへの投稿を行うシェルスクリプト」という身も蓋もないものを見つけてしまいました。
こちらのスクリプトは
- ハンドルで
com.atproto.identity.resolveHandle
に問い合わせ、ユーザーのDIDを取得 - DIDとパスワードで
com.atproto.server.createSession
に問い合わせ、セッション確立し、アクセストークンを取得 - アクセストークンで
com.atproto.repo.createRecord
に問い合わせ、投稿
という流れになっています。
ただ、現状2はDIDでなくハンドルでアクセストークンを取得できるので、1はスキップできるようです。
ソースコード
そして今回作成したスクリプトがこちらになります。
Mac専用にはなりますが、ショートカットアプリに組み込んだりできるので、オートメーションなどとも組み合わせて色々やれそうです。
それで何をやるかは特に思いつきませんが、投稿ができただけで割と満足です。
-
XRPC - BlueskyのRequestsの項目を参照 ↩