ポタージュを垂れ流す。

マイペースこうしん(主に旅行)

個人discord鯖にbotを導入して生活を豊かにする

昨年の9月頃に個人discord鯖を立て、たまにメモするためとかで使ってはいたがなんだかイマイチ。しかし10月頃に自作のbotを導入してから飛躍的に利便性が向上して気に入っている。いま自分が個人discord鯖をどんな感じで運用しているかを(特にbotを中心に)紹介しようと思う。

概観

現状では以下のチャンネルが存在している。

  • welcome:ユーザーが入ってきた時に通知されるあのチャンネル。多分消せないよね?だからとりあえずそのままになっている。
  • 明日やる:明日やるタスク系を書くチャンネルだが、twitterでやってるので実質未使用。自分のtwitterのを拾ってきて転送できたらかなり面白い気はするが、イーロンにAPIを㊙️されたので多分できないだろうな...
  • 欲しい物リスト:amazonとかで気になったもののリンクをとりあえずなんでもぶち込んでいるチャンネル。
  • 旅行:気になるスポットとかがあったら載せたりする用。基本google mapに直接ピンを刺してるというのもあり、あんまり使っていない。
  • links:雑多に気になったリンクを貼る用。
  • paper:気になった論文を貼る用。
  • gpt-playground:ChatGPTを常駐させているチャンネル。後で詳しく紹介。
  • memo:なんでもありのメモ用。
  • program-notification:計算機で回してるプログラムの開始と終了の通知をする用。後で詳しく紹介。
  • vtubers:vtuberの配信予定・開始・終了などの通知をする用。後で詳しく紹介。
  • arXivグループ:arXivの新着をジャンル別で毎日流す。とりあえずcs.LG, stat.ML, cond-mat.dis-nnを登録している。後で詳しく紹介。

個人discord鯖の様子

以下ではbotやwebhook apiをどう使って導入しているかを紹介しようと思う。

bot

discord鯖にbotを導入したことで飛躍的に利便性が上がったように感じる。自分は転がっていたraspberry pi自宅サーバー化して、botのクライアントを動かしている。

ちなみに、tailscaleとかいうのを入れると、自宅サーバーでありがちな面倒なセキュリティの設定とか全くなしに普通にSSHの設定ができてクソ便利。これで別のネットワークからでもどこからでもノートPCからvscode使って自宅サーバーに接続してバグを直すなりなんなりし放題。vscodeの拡張もある。

tailscale.com

ChatGPTとvtuberの通知とarXivの通知は以下のプログラムで動かしている。たまにバグがある。

github.com

一応ログが取られるようにコードが書かれている。tomlに設定が書いてある。

GPT bot

今やChatGPTなしではやっていけないので、discordにbotとして1つのチャンネルに常駐させることにした。わざわざopenaiのwebページを開く必要がなく、履歴も全て残る。また、コマンドでGPTのモデルをスイッチできるようにしている。1つの話題が終わったらGPTが読み込む会話の履歴を消せるようにもしている。会話履歴に上限があるが、トークン数を計算してその辺はいい感じにしている。おまけで使用料金もトークン数から計算させている。適当にその時見ていたvtuberの名前をもじって名付けた。何となくキャラ付けのプロンプトでタメ口にしてってことにしているが、関西人っぽいような謎の口調になっている…。

使用例

GPT-4Vに数式を投げるとlatex形式で返してくれるのいいっすね

面倒な数式をlatex形式に変換してもらう。ただしこの例の場合、若干間違っている。とはいえイチから打つよりは圧倒的に楽。

YouTube bot

配信してるかどうか追いたいチャンネルをコマンドでデータベースに登録。15分に1回RSSフィードを見に行って新しく放送や動画が出現していないか確認する(この確認頻度はcron式で設定変更できるように作ってはいる)。ただし、放送時間の情報はRSSには載ってないのでここだけYouTubeAPIを叩きに行く。GASでなんかよくわからん設定をしないといけないのが面倒かもしれない。APIを叩きすぎるとお金かかるので節約のためにコードが素直ではない構成で複雑になっている。自分で書いてて読みづらい。

APIからの情報に基づいて、配信前は灰色、配信中は赤色、配信後や動画の場合は青色になるようにして、また配信時間とかも更新するようにしている。当然その投稿から配信ページに飛ぶことができる。

偶にアーカイブがなかったり動画が消されたりするがそれにも対応している。

動画が消えた場合の例とコマンドの一覧

arXiv bot

arXivRSSフィードを1日1回見に行って、そこの情報を流すことにしている。ジャンル毎がいいと思って、ジャンルをコマンドから登録するとそのジャンルを流す専用のチャンネルが作られるシステム。これの巡回頻度も無駄な機能としてコマンド呼び出すとcron式で設定できるようになっている。甘えているのでabstractを日本語訳したものを流すようにしている。翻訳もお金をかけたくないのでGASでgoogle翻訳APIみたいなのを使っている。ちゃんと読みたかったら原文を読むので翻訳にわざわざDeepLとか使わなくても大体わかれば問題ないかなと思っている。

おまけで投稿に適当なリアクションをつけるとdiscordの別のチャンネルとかnotionのデータベースに転送する機能もつけた。が、動いたり動かなかったりするので何かバグがあると思う。

arXivチャンネルの例

コマンド一覧

コードがうまく動けばリアクションで別のチャンネルに転送される

webhook

botはちょっとリッチなプログラムを動かすのに使っているが、投げっぱなしでいいようなものではwebhookを使っている。

arXivbotは元はwebhookで動かしていたが、チャンネルごとに別々のwebhook apiを使ったりスタンプに反応させるたりするのは大変だったのでbotになっている。)

(Zapier入れてやってみたこともあるが、カスタマイズ性とか考えると微妙だし全部作るのが早いな...という感じになった)

program notificator

LLMのembeddingや大量のページのDLや研究など、走らせるコードによっては非常に時間がかかる場合があるので、その通知をこのチャンネルに流すようにしている。

これはプログラムを走らせてるマシンにスクリプトを仕込んでおく必要がある。以下のリンクを参考にしている。参考リンクではslackに流すコードになっているが、discordのwebhookのやつに置き換えて利用した。使い方は大体同じ。

qiita.com

使用例

さいごに

みんなも個人discord鯖を立てて活用しよう!