酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

atproto を使って画像を添付したステータスを Bluesky へ投稿する

Python を使って、画像を添付したステータス「Hello, Bluesky!」を Bluesky へ投稿する方法を紹介する。

atproto のインストール

Python で Bluesky にメッセージを投稿するには atproto というパッケージを使用する。Python から Bluesky (AT Protocol) に簡単にアクセスするためのツールである。

github.com

このパッケージは pip を使ってインストールできる。

pip install atproto

atproto を使って画像を添付したステータスを Bluesky へ投稿する

この例では bluesky_apibsky.social を指定しているが、皆さんが利用しているサーバーのAPIベースURLに変更して欲しい。

atproto ではステータスの投稿自体は send_post() を使って簡単に送信できるようになっているが、画像の投稿に関しては高レベルなAPIは提供されておらず、低レベルの XRPC を直接操作しなければいけない。素人には扱いがかなり難しいものとなっている。

import os
import sys
import time
from datetime import datetime
from atproto import Client, models

bluesky_api = Client('https://bsky.social/xrpc')
bluesky_user_name = 'ch3cooh.bsky.social'
bluesky_password = 'パスワード'

bluesky_api.login(
    bluesky_user_name,
    bluesky_password
)

# 引数から画像を含むディレクトリのパスを取得する
image_dir_path = sys.argv[1]

# 画像をアップロードする
bluesky_images = []
for filename in sorted(os.listdir(image_dir_path)):
    if filename.endswith('.png') or filename.endswith('.jpg'):
        file_path = os.path.join(image_dir_path, filename)
        with open(file_path, "rb") as f:
            upload = bluesky_api.com.atproto.repo.upload_blob(f)
            bluesky_images.append(models.AppBskyEmbedImages.Image(alt='Img alt', image=upload.blob))

# 投稿を作成する
status = 'Hello, Bluesky!'
bluesky_embed = models.AppBskyEmbedImages.Main(images=bluesky_images)

bluesky_api.com.atproto.repo.create_record(
    models.ComAtprotoRepoCreateRecord.Data(
        repo=bluesky_api.me.did,
        collection=models.ids.AppBskyFeedPost,
        record=models.AppBskyFeedPost.Main(
            createdAt=datetime.now().isoformat(), text=status, embed=bluesky_embed
        ),
    )
)

ターミナルで、アップロードしたい画像ファイルが入っているディレクトリパスを指定して実行しよう。

python post_media_bluesky.py /Users/ch3cooh/Desktop/images

成功すると下図のようにステータスを投稿できているはずだ。

関連記事