Telegramボットを使用してリソースのステータスを監視する

こんにちは、Habr! 私は長い間あなたを見てきましたが、それでも私の最初の一歩を踏み出すことを敢えてしません。 今、私は準備ができているように見えました。 テレグラムボットでの私の経験についてお話しします-最近、このトピックはネットワークのオープンスペースで非常に人気があり、Habré自体についてはすでにかなりの記事を見ています。 しかし、ほとんどの場合、彼らはボットを作成する原則について話します。これらのボットから実際にどのような利益が得られるのかについての言葉はありません。



私は、サーバーのステータスを監視するためのシステムを作成した経験があり、テスト戦略を設定し、監視対象サーバーの1つで問題を通知するために短いSMSメッセージを送信する機能がありましたが、これらはすべて不便であり、支払いもされています-各メッセージには費用がかかります。



「状態監視システム」とは何ですか? そのアーキテクチャにより、状態をチェックし、通常の状態からの逸脱を通知する小さなモジュールである必要があります。



このような監視システムを含む、多くの既製の統合ソリューションがあります。 これは有名なzabbixnagios 、およびyandexメトリックスと同様のすばらしいツールの巨大な束です。



分析



サイトを作成する段階で、開発者はローカルの開発サーバーを使用します。 しかし、プロジェクトが動作状態になったらすぐに、すぐに運用サーバーにアップロードしたいと思います。 多くの場合、これは大きな間違いとなります。インターネットユーザーがサイトを利用できるようになると、すぐにすばらしい冒険の世界にたどり着き、開発する代わりにセットアップを開始するからです。 そして、ここで、強制的に、私は再び状態制御システムを思い出します。 情報提供者から問題や問題についてすぐに知ると、非常に便利です。



最初は、新しいサイトはユーザーにとってほとんど関心がありません。 ただし、十分な労力または金銭的投資(通常は両方)で、トラフィックがリソースに表示されます。



既にGoogleアナリティクススクリプトをコードに配置しており、視聴者の変化のダイナミクスを観察できます。 しかし、これだけでは十分ではありません。 時々私はもっと知りたいです-サイトでユーザーを見つけ、それを実行し、指示するプロセス全体を制御したいです。 要求および応答ヘッダーを分析することにより、各ユーザーが何を、いつ、なぜ行ったかについての包括的な情報を取得できます。 これを行うには、遅かれ早かれWebサーバーのログの読み取りを開始します。重大なバグを修正するのに役立つエラーがそこに隠されている場合があります。



ボット



Pythonとdjangoは、テレグラムボットを操作するのに最適です。 ボットとは何ですか? このコンテキストでは、ボットはアプリケーションと電報クライアントの間のインターフェースです。 このインターフェイスを使用すると、アプリケーションのビジネスロジックに応じてメッセージを送信できます。

ここでは、djangoでWebアプリケーションを作成および構成するプロセス全体については説明しません。公式ドキュメントの作成者よりも優れているのでしょうか。 このフレームワークを既に使用している場合、これで10分以上かかることはありません。



Pavel Durovと彼のチームに感謝したいと思います。webHookをインストールできるおかげで、ボットの操作はできる限りシンプルで便利になりました。 必要なことは次のとおりです。





さらに、単純なスキームになります。 ボットにメッセージが届くとすぐに、このメッセージに関する情報を含むリクエストがwebHookで設定されたURLに送信されます。 特に、メッセージの日付、送信者のチャットID、送信者に関する情報があります。 この情報を誤って失わないように、データベースに保存することをお勧めします。作業する必要があります。 コマンドであるメッセージを受信した場合、アクションを実行するようにボットをプログラムします。 ボットが私のサイトに来る各リクエストに関する情報を含む電報で私にメッセージを送って欲しいとしましょう。 これを行うには、たとえば次の2つのコマンドのみを与えます。



/ requestsおよび/ stop_requests 最初のチームはデータベースにサブスクリプションを追加して、リクエストに関する情報をサイトに送信し、2番目のチームはこのサブスクリプションを削除します。 次に、独自のコンテキストプロセッサを作成する必要があります。これは、ほとんどの最新のMVCフレームワークで実行できます。 彼のコードでは、ニュースレターへのサブスクリプションを処理してから、指定されたIDでメッセージをチャットに送信する必要があります。 また、当社のウェブサイト上のすべてのイベントを絶対に購読することができます:ユーザー登録(シグナルを介して実装するのが便利です)、コメント、エラー。 創造性の範囲は底なしです。 私のリソースborn2fishでは、世界の川や湖に関する情報を編集できますが、ボットを使用して、誰かが貯水池の本質を変えたときの情報を取得しました。 これにより、モデレーターによる確認が必要な水域に関するメッセージを迅速に受信できます。



メッセージの送信自体は実装に依存します。 Pythonでは、次のようになります。



def _send_msg(bot, chat_id, message): bot.sendMessage(chat_id=chat_id, text=message)
      
      





そして、これはサブスクリプションを処理し、リクエストに関する情報を送信する機能のように見えるかもしれません:



 def send_requests_subscriptions(request, city): """ send Telegram messages to subscribed users """ bot_message = request.META['HTTP_USER_AGENT'] + " request from " + get_client_ip( request) + " (" + str(city['city']) + ") url = [" + request.path_info + "]" subscriptions = RequestsSubscription.objects.all() for subscr in subscriptions: _send_msg(bot=bot, chat_id=subscr.chat_id, message=bot_message)
      
      





このメソッドにより、ユーザーはhelp.mdファイルから読み取ったヘルプを表示できます。



 def _display_help(): return render_to_string('help.md')
      
      





結論の代わりに



言葉では、すべてが非常に単純に思えますが、そのようなボットをテストすることは難しいことに注意してください。 最適なソリューションはユニットテストです。このテストでは、電報からのリクエストをシミュレートし、ボットのビジネスロジックの動作を確認します。



他に何が役に立つでしょうか? テレグラムユーザープロファイルの情報が常に完全に入力されるとは限らないため、 IndexErrorを取得しないように、データベースに保存する前に値をNoneで確認する必要があります



ボットをグループに追加できます。 これは、各ユーザーに情報を送信するのではなく、すべての人が利用できる場所から単一の場所に送信するのに役立ちます。 これを行うには、ボットとグループの設定で、電報クライアントインターフェイスを使用します。

例として、テストボットへのリンクを共有したいと思います: @ born2fishBot 、彼に電子メール/ヘルプ送り 、可能なコマンドのリストを取得します。



Telegramは、プログラマー、管理者、および一般ユーザーに新しい視野を開く素晴らしいアプリケーションです。 革新を使用すると、テレグラムボットを使用することで、開発時間をほとんどとらずに具体的なメリットを得ることができます。 最初にWebリソースのステータスに関するすべての最新データを取得します。 そして、このニュースを楽しいものにしてください。



All Articles