ほぼ初めてのSNSで気づいたらBot作ってた

### まず初めに
六角レンチです
誰やねんって話ですが趣味レベルでプログラミングしてる人です
Qiitaよく見るので自分も書いてみたいなぁと思って作ってみます
中身は黙示録みたいなものです
初めてなのでかなり拙いと思います
## (ほぼ)初めてのSNS
自分はTwitterもといXをやっていましたがずっとROMってたので（4年くらい）SNSというのが情報を集める場所という認識でいました。

それであのマスクが名前をXに変えたあたりからスパムが多すぎて他のSNSに移りたいと思い色々調べてMisskey ioにたどり着きました(7月初めくらい)

それでどうせ新しいSNSに行くんだから発言もしてみようかなと思って発言したらレターパックで現金送れとかオフチョベットしたテフをマフガットしてリットにする様子とか送られてほ～～～んってなって気づいたら六角レンチになりました(どうして)
## pythonを使って334に勝ちたい
まぁそんなことは置いといてMisskey ioをやったことがあるなら知ってると思いますがioには`334`という競技があります

3時34分に一斉に334をノートして(ノートはツイートと同じ意味)誰が一番3時34分に近い時間にノートできるか競う過酷な競技です(実はこの時`3月1日でございます。`は競技化されてなかった)

そして自分も参加するのですがここで一つ悪いことを思いつきます

それがpyautoguiを使って正確にノートしようというものです
(pyautoguiとはなんぞやっていう人に解説すると画面のクリックとかを自動化できるライブラリです。)
## 試行錯誤が始まる
そしてpyautoguiを使ってノートしてみたのですがうまくいきません。

なぜなら

pyautoguiで3時34分にノートボタンをクリックする
↓
実際にノートされる

この矢印の部分に遅延が入るからです(0.6秒くらい)

これを解決するには**遅延を考えて早めにノートする**必要があります。

そしてここから改良が始まります

まず最初に`time.sleep()`を使って遅延させてノートさせるのですがどうもうまくいきません。

というのも実は`time.sleep()`というのは結構適当な時間寝てるからです
(といっても0.01秒のくらいの誤差、でも334は0.01秒の世界。)

そして最終的にはwhile Trueとbrakeとdatetimeを使って
```py
# 3:39:55くらいまで待ってから実行する
while True:
    dt = datetime.datetime.now()
    if dt.second == 59:
        break
now = time.time()
while time.time()-now <= 1-means:
    pass
pyautogui.click()
```
といった感じのものになりました(meansは遅延だったはず、もう使ってないからわからない)

ちなみにこのプログラムを使って3回くらい勝ちました(たぶん)
## APIを知る
いままでpyautoguiを使ってましたがとうとうあの存在を知ってしまいます

**API**です

APIを使えば一々マウスカーソルをノートボタンの上に持ってきて334までずっとそこに置いとく～とかせずにプログラムを裏で動かしておけば勝手にノートしてくれます

しかしAPIを使うにはrequests(HTTP通信のライブラリ)の知識が必要です

さらにAPIに関する知識も全くないのでそれも学習する必要があります

さらに言えばその時はまだdef文すら曖昧な感じだったのでpythonの知識も必要です(辞書とかリストとかも少ししか知らなかった)

そんな感じでいろいろ困っていたところとあるライブラリに出会います(そして今も使ってます)

それが[misskey.py](https://github.com/YuzuRyo61/Misskey.py)です
## misskey.pyすごい
最初にこのライブラリの使い方を教えます
```py
from misskey import Misskey
mk = Misskey("misskey.io")
print(mk.notes_local_timeline(1))
```
これだけでローカルタイムライン(この場合misskey.ioだけのノートが流れるTL)から一個ノートを持ってきて返り値(もちろんjsonからpythonの型にされてる)がprintされます。

一々jsonのデータとかエンドポイントとか書かなくてもこれだけでできます。

すごくない？

さらにノートを作るのも
```py
from misskey import Misskey
mk = Misskey("misskey.io",i="token")
mk.notes_create("中身のテキスト")
```
といった感じですごい簡単に書けます(i=にはトークンを入れる)

そして334のことをすっかり忘れて気づいたらとあることを考えていました
## Bot作りたい
SNSには結構な量のBotがいます

例えばTwitterだったら最近終了しちゃったけど3文字Botとかいましたよね

もちろんmisskey ioにもBotは存在して例えば
- Misskeyの看板娘　[藍ちゃん](https://misskey.io/@ai)
- 自分は知らなかったけどTwitterに居たらしい　[しゅうまい君](https://misskey.io/@shuumai)
- 初めてのノートしたらリノートして通知破壊してくる　[ようこそBot](https://misskey.io/@youkoso_bot)
- 変な食べ物ばっかり記憶してる　[おいしいBot](https://misskey.io/@oishiibot)


...等々色々Botがいます

そしてBotを作るのはいい経験になりそうという~~浅はかな~~理由でBotを作ろうとします
## ストリーミング？　Websocket？
最初から難所が来ます、普通のBotなら(例えば3文字botとかなら)適当にノートさせるだけで終わりますが自分が作りたいと思ったのは**ユーザーに反応したりするBotです。**

つまりリアルタイムなBotです。

APIについての知識はある程度蓄えたとはいえまだまだ初心者です(今もだけど)

ここで登場するのがasyncio(非同期処理ライブラリ)とwebsockets(非同期通信ライブラリ)なわけですがもちろん知識なんて持ってるはずもなく頭が爆発しそうになります🤯

そこでとあるQiitaの記事を見つけます(この記事が本当にありがたかったからQiita書いてみようかなってなった)

それがこの記事です

https://qiita.com/CyberRex/items/e49828dba8e5867d8b26

そこに書いてあったのはmisskey.pyとwebsocketsを使ってストリーミングBotを作ってみようという自分が考えていたことと完璧に一致することが書いてありました
(ただちょっと情報が古かったので注意)

そしてこの記事を参考にして色々な機能を付けたりMisskeyにいるいろんな人から助言をもらったりして完成したのが
<br>
[ぶろみね](https://misskey.io/@bromine35)君です。
## いつの間にかBot作ってた
このBot、いつ作られたのかというと
2023/8/17

そしてMisskey\.ioにアカウントを作ったのが
2023/7/8

つまり、大体1ヶ月と少しでdef文少しわかるくらいの状態からBotを作りました。
<br><br><br><br><br>
？？？？？？？？？？？？？？？？？
## まとめ
まとめると
- TwitterもといXがスパムだらけになる
- Misskey ioに行く
- 334という競技を知り悪いことをする
- APIを知る
- Botを作る

今振り返るとAPIを知ってからBotを作ろうっていう発想になったの我ながらすごいなぁと感じます

そしてもう長くなってきたので書かないですがここからさらにラズパイを買って最終的にはCUIで運用したりGitHubを使うようになったりしてます

これらも全部Botを作ったおかげでやったので本当にためになったなぁと思ってます~~浅はかな理由でもやってよかった~~