トップに戻る

おいしいBotについて

これはMisskey Advent Calendar 2020 18日目の記事です

はじめに

最初はAPIについて書こうと思っていたけど、今までおいしいBotについて話したことなかったのでこの機会に書きます

APIについても書くよ

おいしいBotとは

おいしいBotは、TLから言葉を学び、それをおいしいかまずいか決めて投稿するBotです

アカウントは@oishiibotです

作るきっかけは、ある方の投稿を参考しました

作り始めるとき、ioのBotといえばれいじゅさんのれいじゅぼっとしかいなかったので、何か作りたいと思ったのも理由の1つです

数年前にJavaScriptでDiscordやTwitterのBotを作ってた(作ろうとしてた)ので、 おいしいBotもJavaScriptで作り始めました

v1

最初の機能は、

だけでした

当時はそこまで大きなBotにならないだろうと、1つのファイルだけで書いていました

しかし、色々アイデアの提案や思いつきなどで追加していった結果、管理が大変になってしまいました

ここでv2に繋がります

v2

前からずっとTypeScriptで作り直したいと思い、2020年2月頃やっと書き始めました

それからずっとモジュールなど色々なことで悩んだ末、 おいしいBotがアカウント1周年のときまでになんとか作り直し、 GitHubという設計図共有サイト1にオープンソースとして公開しました

TSの書き方から調べ、モジュールの読み込みを実装したので管理が楽になりました

機能としては12個、管理用コマンドなどは8個になりました(執筆時)

機能の一覧はPagesにまとめているのでそっちを見てください(最近更新してなかったので後で更新する)

内部的なこと

コード見て分かる人には「GitHubのリポジトリを見てください」で終わりなんですけど、 個人的な実装とかしてるところを書いていきます

意味が分からない人は読み飛ばしてください

Linterなど

LinterにESLintを使い、フォーマッターにPrettierを使っています

ESLintで今風の書き方や制限をかけることが出来るようになります

Prettierで誰が書いても同じコードスタイルを保つことが出来ます

index.ts

Botの一番最初に実行されるファイルです

ここでコンフィグの読み込みやBotクラスの起動をしています

main.ts

Botの主な実装はmain.tsでしています

index.tsと分けているのは、loadConfig()がPromise実装なのでインデントが2段多くなってしまうことが理由です

インデントが2段になるのはPrettierのせいおかげです

module.ts

モジュールの元になるクラスを実装しています

ここのlog()でどのモジュールからログを出しているか分かるようにしています

LogNameというプロパティは、モジュールの名前を4文字で表しています

ng-words.ts

NGワードを管理するクラスです

ここの実装はゼルチカさんのシトリンパクリ参考にしました

NGワードのリストも使っていいと許可をもらったので使わせていただいています

misskey/

このフォルダの中にMisskeyのAPIやNoteなどのクラスを実装しています

APIやNoteにはコンストラクターにBotクラスを引数にするようにしています

一番最初にBotクラスでコンフィグを読み込んでいるので、再利用するためです

APIについて

ここからはAPIについてです

正直どういうことを書けばいいか分からないけど、みんなが使っているAPIを書いていきます

コード分からない人向けにコードは書きません

分かる人はドキュメント読んでください

ドキュメントはhttps://misskey.io/api-docです

ここも分からないところは読み飛ばしてください

すべてのエンドポイントに共通すること

です

i

これだけでは何をしているのかわからないかもしれないけど、 Misskeyを開いたときに毎回呼び出されるAPI

このAPIでアカウント情報を取得しています

ドキュメントに書いてあること以上にレスポンスが返ってくる

i/notifications

通知を取得するときに呼び出されます

メンションのみなどのフィルターを掛けて取得することも出来る

notes/timeline

Misskeyを開いてHTLを表示するときに呼び出されます

このAPIに時刻をつけて呼び出すと、過去のTLを見ることも出来る

notes/create

誰もが必ず毎日(?)投稿するときに使っているAPI

投稿ボタンを押すとこのAPIが呼び出されます

リノートするときもこのAPIが使われます

notes/reactions/create[delete]

これも毎日何回もしているであろうAPI

リアクションをしたとき、外したときに呼び出されます

notes/favorites/create[delete]

お気に入りに登録したとき、解除したときに呼び出されます

following/create[delete]

フォローをしたとき、解除したときに呼び出されます

drive/files/create

ドライブにファイルをアップロードするときに呼び出されます

このAPIがformdataで送信しなきゃいけないAPI

でもドキュメントにはJSON形式って書いてある

終わり

多分あまりいっぱい書いても読むほうも大変なのでこれくらいにしておきます

おいしいBotはこれからも機能とか追加していきます

GitHubに公開してるのでPull RequestとかIssueとかでアイデア書いてくれると、やるかもしれません

これからもおいしいBotをよろしくね!🍮


  1. 元ネタ ↩︎

  2. 元ネタ ↩︎