LoginSignup
0
1

Misskeyで自分のノートをrenoteするbot

Last updated at Posted at 2024-01-04

タイトルそのまま、備忘録。

やること

  • Misskey.ioでの自分の過去のノートを、同じアカウントでRenoteする

環境

  • Python 3.12.1(新しもの好き)
    • 使うライブラリの関係上、バージョンは3.7以上必須
  • Ubuntu(バージョンは忘れた……けどそもそもOS環境依存で発生する問題はないはず)

準備するもの

  • MisskeyのAPIアクセストークン
    • [設定] > [API] > [アクセストークンの発行] から入手できます
      image.png

    • 権限は「アカウントの情報を見る」と「ノートを作成・削除する」だけあれば十分です

Pythonを書く

エッセンスとなる部分だけ紹介します。

使うライブラリ

Misskey.pyというめちゃくちゃ便利なライブラリがあります。

PyPIからインストールできます。便利(2回目)
PyPIのこと、IをLの小文字と読んで「ペイパル」って呼ぶ人間は俺だけでいい

pip install -U Misskey.py

クイックスタート

本家の文面ほぼ丸パクリですが、まずインスタンスを作ります。
インスタンスって何?(by日曜大工コーダー)

main.py
from misskey import Misskey

TOKEN = '[MISSKEY APIのアクセストークン]'
mk = Misskey('misskey.io', i = TOKEN)

メソッドはここ↓にあります。

あとは煮るなり焼くなりしましょう。
例えば、アカウントの基本情報を得るには .i() メソッドを使います。

main.py
from misskey import Misskey
# 結構色々な情報が出てくるので、見やすくするためにpprint()を使えるようにしておくといいかも
from pprint import pprint

TOKEN = '[MISSKEY APIのアクセストークン]'
mk = Misskey('misskey.io', i = TOKEN)

pprint(mk.i())

dict形式で山のように情報が出てきますが、ここで必要になるのは 'id' だけです。
これが、自分のアカウントを走査するために必要なユーザIDになります。

main.py
# pprint(mk.i())
user_id = mk.i()['id']

自分のノートを取得する

自分のノートは .users_notes() メソッドで取得できます。

オプションはたくさんありますが、使いそうなのは……

  • user_id(上で取得したユーザID。必須)
  • include_replies(取得対象にリプライを含めるか。デフォルトは True
  • limit(取得するノート数。最大値は100。デフォルトは 10
  • since_date(datetime.datetime形式で指定して、その日付以降のノートを対象とする)
  • include_my_renotes(自身のrenoteを取得対象に含めるか。デフォルトは True

とかでしょうか。基本的には最新のノートから取得していきます。
例えばこんな感じに指定します:

main.py
user_id = mk.i()['id']
notes_response = mk.users_notes(
            user_id = user_id,
            limit = 100
            )

これで直近100件のノートが取得できます。

renoteやリプライを含む場合

notes_response はノートに関する様々な情報を含むlistになります。ここで、ノートが何かをrenoteしていたり、何かへのリプライを行っている場合( .users_notes() 実行時に include_ 系のオプションをデフォルトのままにしてある場合)、notes_response[i]['renote']notes_response[i]['reply'] といったキーが含まれます。
どうも、これらの要素も「取得するノート数」に含まれるようなので(要検証)、実際に .users_notes()limit=100 を指定していても、見かけ上取得できるノート数は100件に達しないかもしれません。

というかオプションを False にしたところでrenoteやリプライは取得されているのでうまく動いていないっぽい?

取得したノートをrenoteする

notes_response にある id(renoteしたノートの場合は ['renote']['id'] )を使ってrenoteができます。使うメソッドは .notes_create() です。

main.py
user_id = mk.i()['id']
notes_response = mk.users_notes(
            user_id = user_id,
            limit = 100
            )
            
for item in notes_response:
    mk.notes_create(
            renote_id = item['id']
            )

これで、検索したノートを全てrenoteすることになります。

が、こんなマジモンのrenote爆撃は停止措置にかかる可能性大なのでやめましょう

自分は、検索したノートから指定したタグを含むものだけを収集し、別のプログラムでcronを回し、一定期間に1回だけ収集したノートからランダムで1つ、renoteするようにしています。

例えばタグは ['tags'] (または ['renote']['tags'])、本文は ['text'](または ['renote']['text'] )というキーに入っているので、この中に指定した文字列があった場合に、別のファイルなどに書き出すような処理を書いておくと、別のプログラムや関数から読み込むことができます。

main.py
for item in notes_response:
    if 'tags' in item:
        if '[検索したいタグ]' in item['tags']:
            # item['id']を、変数なり外部ファイルなりに書き出す処理を書く

おしまい

能登半島地震でインプゾンビが湧いたTwitter Xなんて離れてみんなでMisskey、しよう!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1