記事一覧に戻る

Bluesky APIで自動投稿する方法

はじめに

BlueskyというSNSをご存知でしょうか?

Twitterの社内プロジェクトから独立したSNSで、いわゆる分散型SNSと呼ばれるものです。

2023年頃にサービスを開始してから、しばらくは招待制だったようですが、ついに2024年2月からは誰でも使えるようになりました!

しかもAPIも充実しており、これを使ってサードパーティ製のアプリの作成もして良いようです。昔のTwitterみたいですね。

さっそく、Pythonを使って自動投稿を試してみました。こんな感じで、物語を自動投稿するBotです。

bot-exapmle

ということで、今回はAPIを実行するための準備と、Pythonのatprotoというパッケージを使ってBlueskyにテキストの投稿と画像投稿をする方法を紹介します。

準備

APIを使うためには、アカウントのIDとパスワードが必要です。

アカウントID

名前の下にある@を除いた文字列が、アカウントです。@は不要なのでご注意を。

account-name

パスワード

API実行用のパスワードを生成します。

Blueskyにログインし、左のサイドバーにある歯車マークをクリックします。そして、「高度な設定」セクションにある「アプリパスワード」をクリックします。

app-password

「アプリパスワードを追加」をクリックします。

add-password

パスワードにつける名前を入力します。デフォルトで英語で色の名前が生成されているので、拘りがなければそのまま使って良いと思います。そして、「アプリパスワードを作成」をクリックします。

generate-password

パスワードが表示されるので、コピペしておきましょう。画面上でも、再表示はしないと言われていますので、ここでコピペを忘れないようにしましょう。

complete-password

AT Protocol

At Protocolについて

BlueskyではAT ProtocolというプロトコルでAPIを実行します。いわゆるREST APIとは実行の仕方は少し異なります。この辺りが分散型SNSたる所以なのでしょう。

TypeScript、Python、Go、DartではAPIを実行するためのパッケージが準備されています。投稿するだけなら、パッケージの使い方が分かれば、AT Protocolの仕様や、APIの仕様を詳細に理解していなくても問題はありません。

私もAPIの仕様自体はあまり確認できていないので、今回は割愛させていただきます。

ちなみに、公式が作成しているのはTypeScriptのパッケージとのことです。

今回紹介するPythonのパッケージは、有志のコミュニティが作成しているもので、現在バージョンは0.0.41です。バージョン1.0.0になるまでは、互換性は保証されない、と公式サイトでアナウンスされています。

Under construction. Until the 1.0.0 release compatibility between versions is not guaranteed.

「製作中。1.0.0のリリースまで、バージョン間の互換性は保証されません」とのことです。まだ試験中のパッケージと捉えたほうが良さそうですね。とはいえ、Blueskyの公式サイトのチュートリアルにバッチリ使われていますが笑

インストール

pipでatprotoをインストールします。Pythonのv3.7.1以上である必要があります。

pip install atproto

v0.0.41がインストールされました。

> pip freeze | findstr "atproto"
atproto==0.0.41

これで準備完了です。

pipが動かなくなった場合

私のLinux環境でatprotoをインストールした時、既にインストールされていたpyOpenSSLのバージョンと嚙み合わせが悪かったのか、どんなpipコマンドを打っても、以下のようなエラーが出るにようになってしまいました。

AttributeError: module 'lib' has no attribute 'X509_V_FLAG_CB_ISSUER_CHECK'

pipをインストールし直した上で、pyOpenSSLをアップデートしたら解消しました。もし同じエラーが出た場合は参考にしてみてください。

pipや依存パッケージのバージョンによると思うので、一概には言えないと思いますが、あらからじめpyOpenSSLをアップデートしておくと発生しないかもしれません。

もしくは、venv環境にインストールすればリスクを減らせるかと思います。

API実行

ログイン

アカウントIDとさきほど生成したパスワードでログインをします。

from atproto import Client

# アカウントID
account = "zenryoku-kun.bsky.social"
# さきほど生成したパスワード
pwd = "*******" 

client = Client(base_url='https://bsky.social')
client.login(account, pwd)

atprotoからClientをimportし、base_url="https://bsky.social"で初期化しています。

このurlは、BlueskyのメインPDS(Personal Data Store)とのことです。分散SNS特有の概念なのですかね。

そして、clientのloginメソッドにアカウントIDとパスワードを渡し、ログインしています。

テキスト投稿

ログイン後、clientのsend_postメソッドに投稿したい文字列を指定します。

client.send_post("今日は、世界")

実行すると以下のように投稿されました。

post-text-example

すごい簡単ですね!

画像投稿

投稿用の画像として、test.jpgを同じ階層に置いてあります。

画像をバイナリで読み取り、clientのsend_imageメソッドに渡すのが基本的な使い方です。

# 画像をバイナリで読み取る
with open("test.jpg","rb") as f:
    img = f.read()

# 画像埋込投稿
client.send_image("今日は、世界",img,"鳩")

send_imageに3つ引数を渡しています。1つ目が投稿するテキスト、2つ目が画像データ、3つ目は画像の代替テキストです。

実行すると、以下のように投稿されました。

post-image-example

こちらもシンプルですね。

なお、仕様上は画像は4つまで投稿することができるようです。TypeScriptの例を見ていると、確かに複数指定できそうなのですが、Pythonのatprotoではやり方が分かりませんでした。もしご存知の方いたら教えてください。

最後に

今回は、API利用に必要な準備と、Pythonでatprotoを使ってBlueskyに自動投稿する方法を解説しました。

「分散型SNS」ということで、何か複雑な処理が必要かと思いましたが、パッケージがいい感じに抽象化してくれて、結構簡単にできますね。

BlueskyのAPIは、他にもリプライやメンション等、豊富な機能があるようです。ドキュメントの理解が進んだら、また別の記事に書くかもしれません。

しかし、公式もBot制作などのテンプレート等も準備してくれていたり、サードパーティ製アプリの作成もOKだったり、昔のTwitterのようですね。実際のアプリの使い勝手もTwitterそっくりです。

現在のTwitter(X)は、近年の混乱からか、少なくとも私のタイムラインからは人がかなり減ってしまいました。皆どこに行ってしまったのでしょう。。。寂しいです。

昨年、Meta社からThreadsもリリースされましたし、SNS界隈も群雄割拠の時代になるのでしょうか。

私はまだTwitterに残りますが、今後どこに人が集まっていくのかは注目していきたいです。

参考

記事一覧に戻る