🦣

Mastodon.pyを使ってPythonからトゥートする

2023/02/05に公開

Twitter API有料化に伴い、個人で動かしているTwitter Botの運用継続が難しくなりそうなので、Mastodon APIのPythonラッパーであるMastodon.pyを使ってMastodonへのPythonによるToot実装を試してみました。

https://github.com/halcy/Mastodon.py

環境構築

Python環境の構築

Pythonの開発環境が構築できていない場合、以下の記事を参考に環境構築を行なって下さい。
https://zenn.dev/sion_pn/articles/4418eeda7c62d0
https://zenn.dev/sion_pn/articles/d0f9e45716cabb

Mastodon.pyをインストール

pipからMastodon.pyをインストールします。

zsh
pip install Mastodon.py

Mastodonアカウントの取得

Botとして運用するためのMastodonアカウントを用意します。
ここで一点注意点があるのですが、Mastodonインスタンスによって利用規約が異なり、Botの運用を制限されていたり運用ルールが定められている場合があります。
インスタンスの利用規約を熟読した上でBot用アカウントを作成すると良いでしょう。
例えば、日本最大のインスタンスであるmstdn.jpでは2023年2月4日現在、Bot運用ルールが以下のように定められています。

・Publicな投稿をしないこと(Unlisted, Private, Directを使ってください)
・能動的に他のアカウントをフォローしに行かないこと
・フォローしていない人のトゥートを自動でお気に入り登録したり、リプライを飛ばしたりしないこと

理由などについても利用規約に記載されていますので、是非一度ご一読ください。
https://mstdn.jp/about/more

利用規約を読んで用途や運用方法的に問題がなさそうであれば、アカウントを作成しましょう。

Mastodonアカウントの公開範囲の設定

アカウントが作成できたら、Mastodonアカウントの設定を変更します。
ユーザー設定/その他の設定項目を開き、投稿の公開範囲を変更します。

初期設定では公開(public)になっているので、利用規約に基づいた設定に変更します。
例えばmstdn.jpの場合、Unlisted, Private, Directを使ってくださいという規約になっているため、未収蔵(unlisted)以下の公開レベルに設定します。

Mastodonアカウントで新規アプリの登録

MastodonのAPIからアカウントを操作するために、アプリの登録を行います。


設定画面の左メニューから、開発の項目を選択します。


すると新規アプリボタンが表示されるので、ここを押してアプリの名前や権限の種類などを設定します。

設定が完了すると、
・クライアントキー
・クライアントシークレット
・アクセストークン
が表示されるので、これらの文字列をどこかに保存しておきましょう。

実装前に必要な事前準備は以上になります。

実装

それでは、実装を進めていきます。Mastodon.py公式のドキュメントはこちら。
https://mastodonpy.readthedocs.io/
公式ドキュメントに記載のUsageの項目に従って実装していきましょう…と言いたいところですが、公式ドキュメント通りにcreate_appメソッドを実行するとインスタンスによってはRequest Errorが発生することがあります。
https://github.com/halcy/Mastodon.py/issues/213

これは、インスタンスによってUserAgent次第でRequestを弾いているのが原因のようです。
一応、Mastodon.py側でもこちらの問題は認識されていて現在対応プルリクが出ているようです。
https://github.com/halcy/Mastodon.py/pull/305

とはいえ、create_appメソッドを実行することは実はMastodonの自動トゥートを行うにあたり必須ではないので、公式ドキュメントのUsageは一旦ガン無視して実装を進めることとします。

初期化からトゥートまで

それでは、初期化からトゥートまでのコードを書いてみます。

Web側でアプリを作成済みであれば、create_appを使用する必要はありません。
create_appを使用しなければ、前述のUserAgentにおける諸問題は回避することができます。

環境構築の際に用意した
・クライアントキー
・クライアントシークレット
・アクセストークン
をクラスインスタンス生成時に引数で指定して、あとはtootメソッドを呼ぶだけで任意のテキストをトゥートすることができます。

main.py
from mastodon import Mastodon

# 初期化
api = Mastodon(
    api_base_url  = 'マストドンインスタンスのURL(例:https://mstdn.jp)',
    client_id     = 'Webでアプリ登録時に発行されたクライアントキー',
    client_secret = 'Webでアプリ登録時に発行されたクライアントシークレット',
    access_token  = 'Webでアプリ登録時に発行されたアクセストークン'
)

# トゥート
api.toot('Hello World')

以上です。

Mastodon.pyを使用するにあたってのつまづきポイントは主にcreate_appに集約されると思いますので、それを回避して初期化さえ正常に出来てしまえば、大体のメソッドは実行可能と思います。
https://mastodonpy.readthedocs.io/en/stable/index.html
あとは、公式ドキュメントに記載のAPI METHODSを参考に色々と試してみてください。

Discussion