noellabo's tech blog

@noellaboの技術ブログ

MastodonのAPIでブックマークをエクスポートする

Mastodon v3.3.0から、ブックマークのインポート・エクスポートに対応しています。 もしあなたのサーバがv3.1.0以降、v3.3.0未満の場合は、APIで取得して、自力で書き出してしまいましょう。

bookmark_exporterの作成

何で書こうかと思いましたが、まぁPythonが簡単そうなので、それでいきましょう。 python3が実行できる環境を用意してください。Linux環境やmacOSでは最初から使えると思います。Windowsの方は調べて下さい……。

Python 2.xとPython 3.xが両方使える環境ではpython3pip3で、3.xしか入っていない環境ではpythonpipで実行する感じです。 詳細は省略します。

まずMastodon.pyという便利なモジュールをインストールしておきます。MastodonのAPIを、Pythonから簡単に扱えるようにするプログラム部品です。

pip3 install Mastodon.py

次の内容のファイル(bookmark_exporter.py)を作成してください。

(なお、前半の'class MastodonEx`の定義はMastodon.pyのbookmark取得のコードを修正するパッチです。そのうち必要なくなるハズ……。ぽぷんじゃさんに助けて頂きました。ありがとう!)

import csv
from mastodon import Mastodon

class MastodonEx(Mastodon):
    def bookmarks(self, max_id=None, min_id=None, since_id=None, limit=None):
        if max_id != None:
            max_id = super()._Mastodon__unpack_id(max_id)
    
        if min_id != None:
            min_id = super()._Mastodon__unpack_id(min_id)        
    
        if since_id != None:
            since_id = super()._Mastodon__unpack_id(since_id)
    
        params = super()._Mastodon__generate_params(locals())
        return super()._Mastodon__api_request('GET', '/api/v1/bookmarks', params)

mastodon = MastodonEx(
    access_token = 'hCz9gtDZ8TTN2bI_hcXi_pMuQWNQdyUgs5pxkHZHlLQ',
    api_base_url = 'https://nemushee.net/'
)

toots = []
result = mastodon.bookmarks(limit = 40)
toots += result

while hasattr(result[-1], '_pagination_next'):
    result = mastodon.bookmarks(limit = 40, max_id = result[-1]._pagination_next['max_id'])
    toots += result

with open('bookmark.csv', 'w') as f:
    writer = csv.DictWriter(f, ['uri'], extrasaction='ignore')
    writer.writerows(toots)

このうち、access_tokenとapi_base_urlはあなたの利用しているサーバのものに書き換えます。

まず、あなたのアカウントで、設定画面を開き、『開発』から『新規アプリ』ボタンでアプリケーションを追加します。

f:id:noellabo:20210307151439p:plain
アプリケーションの追加

f:id:noellabo:20210307151826p:plain
アプリケーションの作成

アプリケーションの名前だけつけて、画面下の方で決定しちゃってください。本来はここで、アプリケーションに許可する権限を設定して、不必要なアクセスができないように制限します。

f:id:noellabo:20210307151301p:plain
アプリケーションの確認

一覧画面に戻ったら、出来上がったアプリケーションがリストされるので、それを選んで下さい。この中から、アプリケーショントークンをコピーして、先程のプログラムのaccess_tokenの箇所にペーストしてください。

api_base_urlは、例えば社畜丼であればapi_base_url = 'https://mstdn-workers.com'と設定します。

bookmark_exporterの実行

python3 bookmark_exporter.py

実行するとbookmark.csvというファイルが作成されます。エラーが出なければ!

後始末

先程作成したアプリケーションは、もう使わないならさっさと削除しておきましょう。長く使う場合は、アクセストークンを漏らさないようにすること、与える権限(今回の例ではread:bookmarksだけあれば良い)をきちんとしらべて、安全に配慮してください。

インポート

Mastodon v3.3.0以降のサーバであれば、インポートが可能です。さきほど作成したbookmark.csvを指定してください。

ブックマークは、そのサーバがキャッシュしていなかった投稿でもインポートの際に新規に取得してくれる、かなり強力な機能です。状況によってはかなり負荷がかかるので、大量にブックマークをインポートする場合は、管理者に一報を入れた方がいいかもしれません(管理者の方針次第です)。

また、フォロワー限定の投稿などは、インポートするアカウントが対象アカウントをフォローしてからでないと取得できません。フォローインポートや、手動での再フォローなどを実行して、落ち着いた状態で実行することをオススメします。