概要
「公式:BlueskyのPDS分割実施はオープンネットワークへの接近 | GNU social JP Web」に続くAT Protocolの公式情報の紹介です。時系列としては、「公式: AT Protocolの2023年のロードマップでの連合開始は2024年初めの予定 | GNU social JP Web」の後で前回の記事の前です。
2023-11-06 Monに「Download and Parse Repository Exports | AT Protocol」の投稿があったので紹介します。
内容は、リポジトリ―のダウンロード・パース・エクスポート方法です。
Download and Parse Repository Exports
ATPの中核原則は、公開データへのシンプルなデータアクセスです。ユーザーデータはリポジトリ―に保存され、CARファイル (.car) としてエクスポートできます。今回はこのデータリポジトリ―のエクスポートと解析方法を説明します。
ユーザーのデータリポジトリ―はレコードで構成されており、各レコードはHTTP APIエンドポイントでJSON形式でアクセス可能です。
サンプルコードはGoプログラミング言語で記述されており、indigoのatproto SDKパッケージを使用してます。完全なソースコードは「cookbook/go-repo-export at main · bluesky-social/cookbook」にあります。
開発者向けに書いています。将来的には、ユーザーはアプリ内から自分のデータを簡単にエクスポートする機能を追加予定です。
Privacy Notice
ATPのデータは公開されているものの、他人の権利を尊重するように注意が必要です。
著作権だけでなく、コンテンツの削除やブロック関係もです。アカウント所有者による明示的な記載がない限り、画像その他のコンテンツに再利用の権利はないです。
Download a Repository
BlueskyのメインPDSのリポジトリ―のダウンロードURLを構築します。この場合、PDSホスト=tps://bsky.socialで、Lexiconエンドポイント=om.atproto.sync.getRepoで、アカウントDIDをクエリーパラメーターに指定します。
@atproto.comアカウントのダウンロードURLは以下となります。
https://bsky.social/xrpc/com.atproto.sync.getRepo?did=did:plc:ewvi7nxzyoun6zhxrhs64oiz
このエンドポイントは認証が不要な点に注意してください。ユーザーのリポジトリ―内データは公開されており、誰でもWebからダウンロード可能です。ただし、ミュートやリスト登録などのコンテンツは含まれません。
このURLを開くと、@atproto.comのリポジトリ―をダウンロードします。データの解析方法は後述します。
一般的な別のサーバーの場合、任意の [AT Identifier] (ハンドルかDID) から始めます。そして、アカウントのPDSサーバーを見つける必要があります。具体的には、ハンドルかDIDの解決と、#atproto_pdsuエントリーのパースも必要です。
github.com/bluesky-social/indigo/atproto/identityパッケージでこれらを以下のように処理します。
import (
"fmt"
"context"
"github.com/bluesky-social/indigo/atproto/identity"
"github.com/bluesky-social/indigo/atproto/syntax"
"github.com/bluesky-social/indigo/xrpc"
)
func main() {
run()
}
func run() error {
ctx := context.Background()
atid, err := syntax.ParseAtIdentifier("atproto.com")
if err != nil {
return err
}
dir := identity.DefaultDirectory()
ident, err := dir.Lookup(ctx, *atid)
if err != nil {
return err
}
if ident.PDSEndpoint() == "" {
return fmt.Errorf("no PDS endpoint for identity")
}
fmt.Println(ident.PDSEndpoint())
}
PDSエンドポイントがわかれば、ATP APIクライアントを作成し、tRepoエンドポイントを呼び出し、結果を保存できます。
carPath := ident.DID.String() + ".car"
xrpcc := xrpc.Client{
Host: ident.PDSEndpoint(),
}
repoBytes, err := comatproto.SyncGetRepo(ctx, &xrpcc, ident.DID.String(), "")
if err != nil {
return err
}
err = os.WriteFile(carPath, repoBytes, 0666)
if err != nil {
return err
}
go-export-repoクックブックリポジトリ―の例では、download-repoの以下のコマンドで実現しています。
./go-export-repo download-repo atproto.com
resolving identity: atproto.com downloading from https://bsky.social to: did:plc:ewvi7nxzyoun6zhxrhs64oiz.car
これで@atproto.comのハンドルがbsky.socialのPDSにあることがわかり、CARファイルを保存できました。
Parse Records from CAR File as JSON
CARファイルはIPLDの標準ファイル形式です (IPLD♦ CARv1 Specification)。Content Addressable aRchivesの略です。一連のバイナリー (CBOR) ブロックが連結された単純なバイナリー形式で、tarファイルやGitパックファイルと似ています。効率的なデータ処理・アーカイブストレージには適しますが、開発者はアクセスしにくいです。
詳細プロフィール。SNS: X Twitter/GS=gnusocialjp@gnusocial.jp/WP=gnusocialjp@web.gnusocial.jp。2022-07-17からgnusocial.jpとweb.gnusocial.jpのサイトを運営しています。WordPressで分散SNSに参加しています。このアカウントの投稿に返信すると、サイトのコメント欄にも反映されます。
Comments