はじめに
つい先日、某氏からInvite Codeをいただき、Blueskyを始めました。
Blueskyとは、2019年に発表されたTwitterの共同創業者であるジャック・ドーシーらが発案した新たな分散型SNSプロジェクト。Twitter社内プロジェクトとして組織され、2021年8月に分社、その後完全にTwitterから独立した。 Bluesky - Wikipedia
私のSNSアカウントを見たことがある方はご存知かもしれませんが、毎晩おやすみツイートを自動で投稿しています。
早速BlueSkyにもおやすみツイートを投稿できるようにコードを改修したため、その内容をメモします。
ライブラリ選定
AT Protocol公式にライブラリ一覧があります。
以下が2023/06/08時点でのライブラリ一覧です。
ライブラリ名 | 言語 | 公式の説明 |
---|---|---|
atproto | Typescript | this is the leading protocol implementation, developed by Bluesky PBLLC |
atproto and bluesky | Dart | |
indigo | Go | not stable |
bsky4j | Java | new, not stable |
socialweb/atproto-lexicon | PHP | Parses and resolves Lexicon schemas; useful for code generation |
adenosine | Rust | not stable |
lexrpc | Python | not stable |
atprototools | Python | new, not stable |
blue-pyinthe-sky | Python | new, not stable |
atproto | Python | new, not stable |
Chitose | Python | new, not stable |
arroba | Python | new, not stable. PDS implementation with MST, commit repo, diff and com.atproto.sync XRPC methods |
bskyrb | Ruby | new, not stable |
skyfall | Ruby | new, 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におやすみツイートを投稿できるようになりました。今後も継続して管理していきたいと思います。