Python を使って、画像を添付したステータス「Hello, Bluesky!」を Bluesky へ投稿する方法を紹介する。
atproto のインストール
Python で Bluesky にメッセージを投稿するには atproto
というパッケージを使用する。Python から Bluesky (AT Protocol) に簡単にアクセスするためのツールである。
このパッケージは pip を使ってインストールできる。
pip install atproto
atproto を使って画像を添付したステータスを Bluesky へ投稿する
この例では bluesky_api
に bsky.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
成功すると下図のようにステータスを投稿できているはずだ。