PythonでMisskeyのBotFrameWorkを作ってみた

Dev 2022年7月4日

これは Misskey Advent Calendar 21 日目の記事です。

はじめに

Python で Misskey の Bot を作って見る際に第一に選択肢に出てくるのが、 YuzuRyo61 さんの Misskey.py です。ですが、私は WebSocket を受信してリアルタイムにタイムラインや通知の情報を取得したかったため、この BotFrameWork を作ってみました。

使い方

まず、今回作成したライブラリ Mi.py をインストールします

pip install mi.py

次に実際に実行するためのコードを書きます。

import asyncio
from mi import Note
from mi.ext import commands
from mi.router import Router

class MyBot(commands.Bot):
    def __init__(self, cmd_prefix: str):
        super().__init__(cmd_prefix)
    
    async def on_ready(self, ws):
        print(f'{self.i.username}' に接続しました)
        await Router(ws).connect_channel(['global', 'main'])
    
    async def on_message(self, note: Note):
        print(f'{note.author.username}: {note.content}')

if __name__ == '__main__':
    uri = "wss://example.com/streaming"
    token = "This is your token"

    bot = MyBot('!')
    asyncio.run(bot.start(url, token))

これで、グローバルタイムラインを受信する初歩的な bot ができました。

投稿をしてみる

今度は投稿をしてみましょう、先程のコードを一部書き換えてみます

async def on_ready(self, ws):
    print(f'{self.i.username}' に接続しました)
    await Router(ws).connect_channel(['global', 'main'])
+   res = await self.post_note('hello~')
+   print(res.author.username, res.content)

このように、自分で投稿し、そのレスポンスをオブジェクトとして取得することが可能です。

大変だったこと

今回のライブラリは絶賛開発中なのですが、Python の循環参照がとにかく最初の頃多く発生してとても大変でした。他には、非同期の websocket ライブラリが少なかったことなど、色々とあり、作成にとても時間がかかりました。(まだできてないですけど)

ドキュメントについて

ここ に commit したら自動で生成するようにしてあるドキュメントがあるので、何かわからないことがあれば参考にしてみてください。

最後に

~のプロジェクトは一応頑張って作っているつもりなので、もしよければ、使った感想などを 私の Misskey アカウント に送ってくださるとモチベーションも上がってとても嬉しいです。
あと、MIT License で GitHub にて公開しています。 pull request なども歓迎していますので、もしよければやってみてください。

このプロジェクトの開発は終了しました。後継として開発しているMiPA または MiPAC のご利用をご検討ください

最後になりますが、Misskey は リアクションなどをインスタンスごとのカスタム絵文字で貰うことができ、自分のつぶやきに Twitter のようなハート以外のリアクションがほしいという方にも楽しめると思うので、Misskey にご興味がある場合は joinmisskey をぜひご覧ください。

ここまでご覧頂きありがとうございました。

タグ

yupix

yupix(ゆぴ)と申します。趣味でプログラミングをたしなんでいます。Pythonが一番好きで何の役にも立たないものとかを作ったりしてます。