これはMisskey Advent Calendar 2020 18日目の記事です
はじめに
最初はAPIについて書こうと思っていたけど、今までおいしいBotについて話したことなかったのでこの機会に書きます
APIについても書くよ
おいしいBotとは
おいしいBotは、TLから言葉を学び、それをおいしいかまずいか決めて投稿するBotです
アカウントは@oishiibotです
作るきっかけは、ある方の投稿を参考しました
作り始めるとき、ioのBotといえばれいじゅさんのれいじゅぼっとしかいなかったので、何か作りたいと思ったのも理由の1つです
数年前にJavaScriptでDiscordやTwitterのBotを作ってた(作ろうとしてた)ので、 おいしいBotもJavaScriptで作り始めました
v1
最初の機能は、
- TLから単語を抜き取り、DBに保存して、それを投稿する
- リプライに対して、何か食べ物を言う
- リプライから覚えさせる
だけでした
当時はそこまで大きな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です
ここも分からないところは読み飛ばしてください
すべてのエンドポイントに共通すること
- POSTリクエスト
- 送る内容はJSONという気味の悪い形式2(一部formdata)
- 送る内容の
i
というプロパティにAPIキー(アクセストークン)を入れる - レスポンスもJSON形式(一部返ってこないものもある)
- レートリミットと呼ばれる制限がある
です
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をよろしくね!🍮