はじめに

つい先日、某氏からInvite Codeをいただき、Blueskyを始めました。

Blueskyとは、2019年に発表されたTwitterの共同創業者であるジャック・ドーシーらが発案した新たな分散型SNSプロジェクト。Twitter社内プロジェクトとして組織され、2021年8月に分社、その後完全にTwitterから独立した。 Bluesky - Wikipedia

私のSNSアカウントを見たことがある方はご存知かもしれませんが、毎晩おやすみツイートを自動で投稿しています。 Twitter Misskey Mastodon

早速BlueSkyにもおやすみツイートを投稿できるようにコードを改修したため、その内容をメモします。

ライブラリ選定

AT Protocol公式にライブラリ一覧があります。

以下が2023/06/08時点でのライブラリ一覧です。

ライブラリ名言語公式の説明
atprotoTypescriptthis is the leading protocol implementation, developed by Bluesky PBLLC
atproto and blueskyDart
indigoGonot stable
bsky4jJavanew, not stable
socialweb/atproto-lexiconPHPParses and resolves Lexicon schemas; useful for code generation
adenosineRustnot stable
lexrpcPythonnot stable
atprototoolsPythonnew, not stable
blue-pyinthe-skyPythonnew, not stable
atprotoPythonnew, not stable
ChitosePythonnew, not stable
arrobaPythonnew, not stable. PDS implementation with MST, commit repo, diff and com.atproto.sync XRPC methods
bskyrbRubynew, not stable
skyfallRubynew, not stable; only handles streaming from the firehose

今回は、Python用のライブラリの中で一番更新が活発に見えたatprotoを選択しました。

ライブラリのインストール

# Poetry
poetry add atproto
# pip
pip install atproto

Poetryでインストールする場合は一つ注意点があります。 2023/06/08時点では、atprotoのpyproject.tomlに以下のように記載されています。

[tool.poetry.dependencies]
python = ">=3.7,<3.12"

これは、Python3.7以上3.12未満のバージョンであればインストールできるという意味です。 しかし、Poetryはデフォルトで3.10以上のバージョンをインストールするようになっているため、パッケージをインストールする際にエラーが発生します。その場合は、自身のプロジェクトのpyproject.tomlに3.12未満のバージョンを指定する条件を追加する必要があります。

# 例
[tool.poetry.dependencies]
python = ">=3.10,<3.12"

実装

atprotoのリポジトリには、サンプルコードドキュメントがありますので、それらを参考に実装を進めます。

以下がコードの例です。

import os
from atproto import Client

address: str = "https://bsky.social/xrpc"
id: str = "<USERNAME>.bsky.social"
password: str = "<PASSWORD>"

client = Client(base_url=address)
client.login(login=id, password=password)

def post(text: str) -> None:
    """
    記事を投稿する関数
    引数:
        text: 記事に投稿する文字列
    戻り値: なし
    """
    client.send_post(text=text)

def post_with_media(text: str, media_path: str) -> None:
    """
    画像付き記事を投稿する関数
    引数:
        text: 記事に投稿する文字列
        media_path: 画像のパス
    戻り値: なし
    """
    with open(media_path, "rb") as f:
        img_data: bytes = f.read()
    client.send_image(text=text, image=img_data, image_alt="")

感想

当初は、思いつきで作ったものに過ぎませんでしたが、だんだんと気に入って今では4つ目のSNSにおやすみツイートを投稿できるようになりました。今後も継続して管理していきたいと思います。