Published on

BlueskyをGolangから書き読みする (メモ)

isso

311 views

はじめに

なんか、Bluesky の招待制が無くなったぽくて、盛り上がっているらしい。

ということで、Bluesky を Golang から書き読みする記事です。 indigo という公式のクライアントを使用します。

全体の実装は、ここ にあります。

ちなみに BlueSky は AT Protocol という分散型 SNS 用のプロトコル上に構築されているらしいです。 内部実装は、HTTP ベースの XRPC というのを使っているのだとか。

実装

認証

以下で認証します。

	// クライアントを作成
	client := &xrpc.Client{
		Host: "https://bsky.social",
	}

	// 認証
	actor := "dummy.bsky.social" // ここに自分の ID を入れる
	pw := "dummy"                // ここに自分のパスワードを入れる
	input := &atproto.ServerCreateSession_Input{
		Identifier: actor,
		Password:   pw,
	}

	ctx := context.Background()
	output, err := atproto.ServerCreateSession(ctx, client, input) // ここで Bearer トークンが取得できる
	if err != nil {
		panic(err)
	}

	client.Auth = &xrpc.AuthInfo{
		AccessJwt:  output.AccessJwt,
		RefreshJwt: output.RefreshJwt,
		Handle:     output.Handle,
		Did:        output.Did,
	}

ちなみに output をアウトプットすると、JWT トークンが取得できます。

投稿

以下で投稿します。「Hello, World!」を投稿します。

注意したいのが、github.com/bluesky-social/indigo/utilgithub.com/bluesky-social/indigo/lex/utilutil 被りしてるので、 後者を lexutil としてインポートしています。

	// 投稿を作成
	inp := &atproto.RepoCreateRecord_Input{
		Collection: "app.bsky.feed.post",
		Repo:       client.Auth.Did,
		Record: &lexutil.LexiconTypeDecoder{
			&bsky.FeedPost{
				Text:      "Hello, World!",
				CreatedAt: time.Now().Format(util.ISO8601),
				Langs:     []string{"ja"},
			},
		},
	}

	res, err := atproto.RepoCreateRecord(ctx, client, inp)
	if err != nil {
		panic(err)
	}

	fmt.Println(res.Uri)

実行すると、fmt.Println(res.Uri) で、投稿の URI が取得できます。

at://did:plc:ec46fk3n34iklugwgirjlyak/app.bsky.feed.post/3kkyifpqjfg2x

image

ユーザ投稿の取得

自分の投稿を先頭から 10 件取得してみます。

	// actor (自分) のフィードを新しい順に 10 件取得
	feed, err := bsky.FeedGetAuthorFeed(ctx, client, actor, "", "", 10)
	if err != nil {
		panic(err)
	}

	for _, f := range feed.Feed {
		fmt.Printf("%s\n", f.Post.Record.Val.(*bsky.FeedPost).Text)
	}

実行結果は、以下のようになります。

Hello, World!

おわりに

Bluesky を Golang から書き読みするメモでした。

参考