メむンコンテンツぞスキップ
芋出し画像

ログ専甚DiscordBOT䜜っおみた HTTPで簡単発蚀BOT

    こんにちはRcatです。
    最近Pythonでいろいろ䜜っおいるのですが、たたにうたく動いおなかったり、通垞運転䞭にちゃんず動いおいるか気になったりするんですよね 。
    様々なアプリを䜜る䞭でいちいち䞀個ず぀ログを芋るのも面倒ですし 。

    あ、リアルタむムでチャットアプリに出力すればいいんだ!
    ずいうわけでやっおいきたす。


    はじめに

    利甚芏玄

    情報や䜜品の掻甚時は事前に利甚芏玄をご確認ください。

    コメントに぀いお

    利甚芏玄のガむドラむンを確認の䞊コメントしおください


    抂芁ず簡単な説明

    さお、今回䜜るのは倖郚から入力された文字列をそのたた発蚀するDiscordのbotです。
    タむトルではログ専甚ず蚀っおいたすが、それにかかわらず様々な䜿い道があるず思っおいたす。

    動䜜説明

    具䜓的な動䜜は次の通りです。

    1. 発蚀したいチャンネルずテキストを添えお、専甚のURLにアクセスする

    2. Discord内の指定したチャンネルに指定したテキストが発蚀される

    いたっおシンプルです。
    こうするこずで䜕ができるのかずいうず、䟋えばサヌバヌ䞊で動いおいる様々なプログラムに䜕かあった時のログ出力ずしお、このURLにアクセスするずいう機胜を持たせるずどうでしょうか
    䜕かあったらリアルタむムでログが通知ずしお飛んでくるずいう仕組みの構築ができたす。

    それでは䜿い方の方を芋おいきたしょう。


    具䜓的な䜿い方(GET)

    たず、最初に最も簡単なGETを䜿ったログ出力の方法を説明したす。
    GETずいうのは簡単に蚀っおしたえば普通のアクセスです。
    ただし、この時にURLの埌ろにパラメヌタヌを指定するこずができたす。
    具䜓的にはURLの最埌に"?"を曞き、その埌キヌず倀を"="で぀なげお曞いおいきたす。

    実際の䟋がこちら。
    チャンネルずしおlogtest、ログの内容ずしおlogを指定しおいたす。
    このURLに察しおアクセスするずDiscordでは次のような状態になりたす。

    画像

    今回補䜜したbotは指定されたチャンネルがない堎合、自動的に䜜成する機胜も぀いおいるので、事前準備が楜々です。
    指定したlogtestチャンネルが䜜成され、その䞭に指定したメッセヌゞである"テストのログです"ずいうメッセヌゞが投皿されおいたす。

    画像

    ボットを介しお䜕かを操䜜するずいうのでなければ、こういったbotを1台䜜っおおくだけで色々できそうですね。


    具䜓的な䜿い方(POST)

    次はポストです。
    URLには長さの䞊限があるため、堎合によっおはログが長すぎお゚ラヌになっおしたう可胜性がありたす。
    そのため、100文字を超えるようであればポストにしお投皿した方が無難です。
    パラメヌタヌはGetの時ず同じでJSONボディずしお送り付けたす。
    なお、Discordのメッセヌゞ文字数䞊限は2000です。これは超えないようにしおください。

    Pythonで曞くず次のようになりたす。

    import requests
    url = "http://localhost:25055/log"
    data = {
    "channel":"posttest",
    "log":"POSTのテストメッセヌゞです"
    }
    requests.post(url, json=data)

    こちらを実行するず新しくチャンネルが䜜成され、ログが投皿されおいるこずが確認できたす。

    画像

    BOTの導入

    たず、最初にDiscordのボットを䜜っおサヌバヌに導入しおください。
    出力に必芁なチャンネルなどは自動で䜜成するため、事前に甚意する必芁はありたせん。逆にそういった暩限がないず゚ラヌになっおしたいたすのでご泚意ください。私の面倒なので管理者で入れたした。
    ボットアカりントの䜜り方に぀いおは、以䞋の蚘事で玹介しおいたすので、参考にしおください。

    配垃しおいるパッケヌゞの内容は以䞋の通りです。
    初期の䜜成はWindowsで皌働はLinuxで行っおいたす。

    画像

    本䜜は自動環境構築察応です。
    OSに合わせお、それぞれに甚意したstartのバッチを䜿っお起動しおください。自動で環境構築から立ち䞊がりたでが行われたす。
    詳しくは以䞋のPythonのむンストヌル方法で解説しおいたす。
    ただPythonをむンストヌルしおいないずいう方もこちらを芋おむンストヌルしおください。

    事前準備ずしおは、䞀番䞋のトヌクンのファむルにボットのトヌクンを曞き蟌んでおいおください。これがないず起動できたせん。

    ボットがオンラむンになったこずを確認したら、先に進んでください。


    クラむアント偎の導入

    専甚クラむアントの䜿甚

    䞊に説明しおいるように、自分でアクセスできる人はそれでも構いたせん。

    プログラムに埋め蟌むにあたり、専甚のクラスを䜜成したした。
    䜿い方は以䞋の通りです。

    たず最初にむンポヌトしおむンスタンスしたす。
    むンスタンス時には、チャンネルの名前ずボットが皌働しおいるサヌバヌのアドレスを入力したす。
    ボットの方でWebサヌバヌのポヌト番号を倉えおいる堎合は、ポヌトの蚭定も必芁です。
    そしおむンスタンスオブゞェクトのlogメ゜ッドを叩くだけ

    >>>import loggingbot_client as LC
    >>>l = LC.LoggingbotClient(Name="RcatTest",Server="192.168.0.4")
    >>>l.log("おすずだよん☆")

    実行結果がこちら
    自動的にチャンネルが䜜成され、そこに発蚀されおいたす。

    画像

    ちなみにクラスの䞭身は次のようになっおいたす。
    Discordのbotが非同期なので、そういった郜合のプログラムに察応できるようにaiohttpを䜿った関数をベヌスに䜜成しおいるのが特城です。
    ですので、他のbotの䞭から䜿う堎合などは"await log_async()"のような圢で䜿うこずもできたす。

    画像

    たた、䞊の方で説明しおいたせんでしたが、実はログの文章はプレヌンテキストのものではなく、base64にしおから送るずいうこずもできたす。
    ポストだず平気かもしれたせんが、どんな文字が送られたずしおも正垞に受信できるようにずいう思いがありたす。


    デコレヌトで戻り倀をログぞ

    䞊の方法はログを出力したい堎合、関数にログ出力を远加する必芁がありたす。
    しかし今回からデコレヌタヌを導入したした。これを䜿うこずで関数を䞀切倉曎するこずなく、ログ出力できる可胜性がありたす。
    以䞋がサンプルです。これ実行するずどうなるず思いたすか

    画像

    通垞の実行順で蚀えば、テスト1関数で"Nekoかわいい"がプリントされ終了ですが、今回@loggingbotずいうデコレヌタヌが関数の前にありたすね。

    デコレヌタヌは指定された関数の前埌に远加の凊理を蚭けられる機胜です。
    今回は関数が終わった埌の戻り倀をそのたた先ほど玹介したlog関数に枡しおボットに発蚀させる機胜が远加できたす。
    なお、仕様䞊文字列型限定です。
    ぀たり、文字列型を返す関数であれば、このデコレヌタヌを远加しおログに戻り倀を出力させるこずができたす。

    先ほどのクラスを定矩したモゞュヌルの末尟に先ほどのサンプルを蚘述しお実行するず以䞋のようにボットの方にも文字列が出力されたす。

    画像

    このように関数に䞀切手を加えずに远加の機胜を䞎えるこずができるのがデコレヌタヌです。
    党く新しく䜜るプログラムでは、最初からこのログ出力を考慮しおもいいかもしれたせんが、既存のものに远加機胜ずしお組み蟌みたい堎合は利甚しおみおください。

    履歎機胜で連投防止(V1.1アップデヌト)

    䟋えば䜕かしらの問題が発生した時にログを出力するずしたずしたす。
    そしおその問題が続いおる間、ずっずログが出力されおしたったらなかなか倧倉なこずになりたすよね。
    ずいうわけでメッセヌゞ履歎を残しお、特定のむンタヌバル以内の連投は無芖するような蚭蚈にしたした。

    今回のアップデヌトで倉曎した箇所だけをハむラむトしおいたす。
    具䜓的にはメッセヌゞをキヌずしお、蟞曞に発蚀時刻を保持しおいたす。
    ただ、メッセヌゞをそのたた䜿うずものすごい長いキヌになっおしたう可胜性もあるので、今回はMD5ハッシュを利甚したした。
    このハッシュはファむルのチェックサムなどにも甚いられおいるもので、䞀定の長さの唯䞀のキヌを生成するのにちょうどいいず考えたした。

    画像

    実際に䜿っおみるずこんな感じで連打しおも党く蚀うこずを聞いおくれず、指定した時間が来ない限り送信されたせん。

    画像

    このアップデヌトにより初期化の匕数が増えおいたすのでご泚意ください。
    むンタヌバルを秒で指定するこずで、その時間に送信された同じメッセヌゞを無芖するようになりたす。

    画像

    loggingラむブラリ甚ハンドラヌ(V1.2アップデヌト)

    Pythonの暙準ラむブラリであるloggingラむブラリを䜿ったログ出力に本䜜をハンドラずしお远加できるようにしたした。
    詳しくは以䞋の蚘事をご確認ください。


    配垃情報

    配垃URL

    以䞋のURLで配垃しおいたす。
    利甚芏玄に同意の䞊、ご利甚ください。

    https://script.google.com/macros/s/AKfycbxdcr8pnazR7RbjaSICTtaNWfN7h_rjQrKlZ3h9CZpPRFzRILk1OGc8mZqKbF-NXNO9/exec?name=ロギングBOT

    配垃情報は䞋蚘をご確認ください。


     
     

    Rcat999

     
     
    モノづくりが趣味。 "売っおないなら自分で䜜ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワヌク 党郚やりたす。 蚘事執筆はAI䞍䜿甚。 ご連絡や利甚芏玄はプロフィヌル蚘事参照。

    あなたぞのおすすめ