こんにちは〜
特に難しいことをする訳でもないんですけど、
Mastodonに投稿した自分のtootを一気に取ってきたいっていう状況に陥ったので、
APIを叩いて、自分のアカウントの投稿を全部取ってみました。
ほんと簡単なんで、記事にするまでもないんですけどね。
Mastodonとは
ググると、
マストドン (Mastodon) はミニブログサービスを提供するためのフリーソフトウェア、またはこれが提供する連合型のソーシャルネットワークサービスである。
とのことですが、自分的には、居心地のいいtwitterって感じです。
twitter は3日と続かないんですが、Mastodonはよく使ってしまいます。
ものすごく個人的な情報を呟くアカウントと、
kotoba さんっていう、新たに学んだ言葉をメモっとくアカウントをこんな感じで運営?しています。

やりたいこと
この kotoba アカウントでは、
本 (小説) を読んで知らなかった単語や、読み方がわからなかった単語をメモってるんですが、
あまりにも多く。
「一冊でなんこくらいの単語知らなかったんだろう。」
という興味から、
kotoba (特定のアカウント) のこれまでの toot を全部取ってくる。
ことをしたいと思います。
結論から言うと、100近い単語をtootしていました。
では、早速取っていきましょう!
環境
python 3.6.0
macOS High Sierra 10.13.3
取得する方法
簡単な流れは、(MastodonにTootするまで(Python)) を参照します。
- Mastodon のモジュールインストール1pip3 install Mastodon.py
- アプリの登録
IDや鍵を発行してもらうために必要です。
これ以下はpythonのコードです。12345678from mastodon import Mastodonurl = "https://mstdn.lyker.jp" #ここは自分のホストを。Mastodon.create_app("myapp", # クライアント名(なんでも好きなので大丈夫)api_base_url = url, # アクセス先to_file = "myapp_clientcred.txt" # 出力先ファイル名) - OAuth 認証
ログインします。12345678mastodon = Mastodon(client_id="myapp_clientcred.txt",api_base_url = url)mastodon.log_in("**********@****", # ID(登録メールアドレス)"********", # passwordto_file = "my_usercred.txt") # 出力先ファイル名 - APIを使う。
これで、tootなどの機能が使えるようになります。1234mstdn = Mastodon(client_id="myapp_clientcred.txt",access_token="my_usercred.txt",api_base_url = url) - 過去の投稿を全てとる。
詳細は後ほど説明しますので、まずコードです。123456789101112max_id = Nonei = 0while True:timeline = mstdn.timeline(max_id=max_id, limit=40)try:max_id = timeline[-1]['id']for line in timeline:if line['account']['username'] == 'kotoba':print("{}: {} ({})".format(i, line['content'], line['id']))i += 1except:break
出力はこんな感じです。(みづらいけど)

解説
1 2 3 4 5 6 7 8 9 10 11 12 | max_id = None i = 0 while True: timeline = mstdn.timeline(max_id=max_id, limit=40) #タイムライン取得(max_idはそのidよりも小さいものから取得する) try: max_id = timeline[-1]['id'] #取得したタイムラインの最後のidを取得 for line in timeline: if line['account']['username'] == 'kotoba': #アカウントがkotobaの時 print("{}: {} ({})".format(i, line['content'], line['id'])) #投稿を出力 i += 1 except: break #終了 |
mstdn.timeline(timeline=“home“, max_id=None, since_id=None, limit=None) はタイムラインを取得するメソッドです。
丁寧な説明はマストドンAPIの解説に書いてあったり、
本家のこことか見ればわかるんですけど、
タイムラインはhome以外にも、local(ローカルタイムライン)やpublic(連合タイムライン)を指定することもできます。
気になる max_id と since_id はそれぞれ、
max_id : このid以下の投稿から取得。
since_id : このid以上の投稿から取得。
ってことを意味しています。
また、
limit : 取得する投稿数の最大値 (defaultは20で、最大で40までです。)
を表しています。
なので、特に何もしない状態だと、
homeに投稿されている最新の投稿を20件取得します。
以上を踏まえると、取得したidより小さいものを40こずつ何度も取得してこないといけないので、
max_idをタイムライン取得後に記録して、
次のタイムラインの取得時にそのidを指定してあげることで最も古い投稿まで取得し続けることができます。
その他の機能
投稿する
1 | mstdn.toot("こんにちは") |

hashtagもつけられます。
1 | mstdn.toot("青椒肉絲うまい #青椒肉絲研究会") |

画像の投稿は残念ながら一筋縄ではいきません。
1 | mstdn.media_post("hanakappa.jpg", description="ももかっぱちゃん") |
でできるかと思いきや、コードの不良?で動かないっぽいです。
mastodonをpythonからさわる API解説を参考にして、コードを書き換えてください。
変更の方法は、
まずsite-packagesの所在を確認し、
1 2 3 | pip3 -V #output #pip 9.0.1 from /your_file_path/python3.6/site-packages (python 3.6) |
次に、
1 | vim your_file_path/python3.6/site-packages/mastodon/Mastodon.py |
で変更しましょう!
修正箇所はだいたい1260行目あたりにあるかと思います。
vimの使い方はググってください!
書き換えたら
1 2 3 | media_files = ["hanakappa.jpg"] #ファイル名 dicts = [mstdn.media_post(media, "image/jpeg") for media in media_files] mstdn.status_post(status="ももかっぱちゃん", media_ids=dicts) #statusはコメント |

無事に投稿ができました。
タイムライン取得 (hashtag)
hashtagのついた投稿のみを取得したいときは
1 2 3 4 5 6 7 8 | mstdn.timeline_hashtag("青椒肉絲研究会") #hashtagを表す'#'は要らない #output (outputは辞書を含んだリストで返ってくる。その"content"を取得すると) ''' <p>青椒肉絲うまい <a href="https://mstdn.lyker.jp/tags/%E9%9D%92%E6%A4% 92%E8%82%89%E7%B5%B2%E7%A0%94%E7%A9%B6%E4%BC%9A" class="m ention hashtag" rel="tag">#<span>青椒肉絲研究会</span></a></p> ''' |
アカウントの検索
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | mstdn.account_search("kotoba") #username #output """ [{'id': 11, 'username': 'kotoba', 'acct': 'kotoba', 'display_name': '言葉', 'locked': False, 'created_at': datetime.datetime(2018, 2, 25, 4, 1, 35, 677000, tzinfo=tzutc()), 'note': '<p>普段使わないようなかっこいい言葉を呟きます。</p>', 'url': 'https://mstdn.lyker.jp/@kotoba', 'avatar': 'https://media.hostdon.jp/accounts/avatars/000/000/011/original/5b515f2eb41be95c.jpg', 'avatar_static': 'https://media.hostdon.jp/accounts/avatars/000/000/011/original/5b515f2eb41be95c.jpg', 'header': 'https://mstdn.lyker.jp/headers/original/missing.png', 'header_static': 'https://mstdn.lyker.jp/headers/original/missing.png', 'followers_count': 1, 'following_count': 2, 'statuses_count': 87}] """ |
他にもいろいろあるので、試してみてください。
最後に
この小説から取ってきた単語のデータ、何か (面白いこと) に使えないだろうか。
とかちょっと思ってます。