PHPのダイアログテレグラムボット

この主題については、 Habréおよび単にインターネットに関する多くの記事が書かれています。 そして、電報ボットでの私の経験と、「額」で解決できなかった瞬間についてお話します。



ボットの作成



最初に行う必要があるのは、ボットの作成です。 公式のドキュメントがあり、手順が詳しく説明されています。



説明されている指示で明確なものがない場合は、ここにステップバイステップの指示があります
  1. ボットの電報でBotFatherを見つけ、自分に連絡先リストを追加します
  2. / helpコマンドを使用して、使用可能なボットコマンドを確認します





  3. / newbotを選択し、指示に従って必要なアクションを実行します(次の写真はGoogleから撮影されます)









ボットの作成後、ボットのコードで使用する必要があるトークンを受け取るため、トークンを含むメッセージを保存する必要があります。



ボットをアプリケーション\サイトに接続します



楽しみが始まり、ここで最初の問題に遭遇しました。

まず、ボットを作成するためにphpライブラリを選択します。 私にとってこのライブラリが最も便利だと思われたため、 このライブラリを選択しました。



ライブラリを接続したら、ボットとサイト\アプリケーションとの相互作用を整理する必要があります。 webhookを使用してこの対話を整理できます。



Webhookは、Webhookの登録中に指定されたアドレスにボットからすべての要求を送信する一種のリレーです。 webhookの登録は非常に簡単です。https://api.telegram.org/bot~token~/setWebhook?url=https://example.ru/pathの形式のリクエストを送信するだけです。

https://example.ru/-これは、ボットがリクエストをリダイレクトするサイトへのリンクです。

〜token〜は、ボットの登録時に受け取ったトークンです。

pathは、呼び出しが行われるURLの一部です。



そして、これは問題が発生する場所です。 Webhookは、サイトがhttps上にある場合にのみ登録できることがわかりました。 サイトがhttp上にある場合、webhookを登録することはできません。



ただし、証明書を購入したくない場合は解決方法があります
Let's Encryptサービスを使用できます

開始セクションに移動し、指示に従います。



ボットコードの記述



それではプログラミングを始めましょう。 関係が整理されたら、ボットのロジックの記述を開始できます。



テレグラム開発者は、ユーザーがボットを使いやすくするために、すべての開発者に次のチームのサポートを実装するよう依頼します。



/ start-ユーザーとの通信を開始します(たとえば、挨拶メッセージを送信します)。 このコマンドに追加の引数を渡すこともできます。

/ help-コマンドプロンプトを使用してメッセージを表示します。 ボットに関する短いメッセージと使用可能なコマンドのリストがあります。



必要なのは、アプリケーション/サイトのコントローラーに次のコードを書くことだけです。



$token = ""; $bot = new \TelegramBot\Api\Client($token); //   start $bot->command('start', function ($message) use ($bot) { $answer = ' !'; $bot->sendMessage($message->getChat()->getId(), $answer); }); //    $bot->command('help', function ($message) use ($bot) { $answer = ': /help -  '; $bot->sendMessage($message->getChat()->getId(), $answer); }); $bot->run();
      
      





これで、ボットのテレグラムウィンドウで書き込み/ヘルプを行うと、テキストが表示されます。



チーム:

/ help-ヘルプの表示



さて、推奨チームのリストを作成しました。 その後、必要なコマンドを実装できます。



チームは議論を引き受けることができるため、この機会を利用します。 たとえば、ボットにHello Vasyaコマンドにメッセージ「Hello、Vasya」で応答させます。



これを行うには、次のコードを記述します。



 $bot->command('hello', function ($message) use ($bot) { $text = $message->getText(); $param = str_replace('/hello ', '', $text); $answer = ' '; if (!empty($param)) { $answer = ', ' . $param; } $bot->sendMessage($message->getChat()->getId(), $answer); });
      
      





すべてが非常にシンプルで高速であることがわかりました。



ボットコマンドのリストを入力します



ボットがオンラインヘルプを提供できるようにするため







BotFatherにはコマンドのリストが必要です。

彼の/ setcommandsコマンドでこれを行うことができます



自転車



上記のオプションは完全に便利ではありません。ボットからのヒントを使用する場合、これは完全に非現実的であるため、コマンドの後にテキストを駆動したくないためです。



そのため、入力したコマンドをボットに記憶させる必要があります。 これは、任意のリポジトリ(MySQL、memcached、redis、tarantool、Postgresなど)を使用して実行できます。

必要なのは、以前のユーザー入力を記憶することだけです。



これを行うには、メッセージをユーザーに送信する前にリポジトリに配置し、メッセージを受け入れる前に、データがリポジトリにあるかどうかを確認します。 そして、もしあれば、これらのデータに基づいて、さらにロジックを構築します。



この段階では、コマンドメソッドを呼び出す前にコマンドを取得する機会をライブラリで見つけられなかったため、再び困難になりました。 また、すべてのロジックが1つのアプリケーションコントローラー内でロックされるという事実も気に入らなかった。



各コマンドを個別のアプリケーションコントローラーに移動できる機能を備えた独自のデータプロセッサを作成することが決定されました。



最初に、コントローラへのエントリポイントについて説明します



 function main() { $telegram = new Telegram(); //   $storage = new Storage(); //    $message = $telegram->getMessage(); //  ,    $command = $message->getCommand(); //  ,    (  ,    ) $text = $message->getParams($command); //   ,   ,             if (empty($command)) { $command = $storage->restoreCommand($message->getChat()->getId()); } //  ,    $storage->storeCommand( $message->getChat()->getId(), $command ); //       $this->chooseMethod($command, $message, $text); }
      
      





次に、いずれかの方法を検討します。



 function getnewtext(Message $telegram, $text) { //    ,      if (empty($text)) { $answer = "      .       5  ."; $telegram->sendMessage($telegram->getChat()->getId(), $answer); } else { //   $tgNews = new TelegramNews(); $arData = $tgNews->getByWord($text, 'new'); if (empty($arData)) { $answer = '  '; } else { $answer = common_setViewGetContent('telegram/get', [ 'data' => $arData ]); } $telegram->sendMessage($telegram->getChat()->getId(), $answer); } }
      
      





そのため、より楽しく、インタラクティブで便利になりました。







最後まで読んでいただきありがとうございます。 ここでは、ダイアログモード動作するライブボットで遊ぶことができます



UPD:写真を特定の種類のリクエストに送信する機能がボットに追加されました。 たとえば

/ gettable-スポーツイベントの結果のテーブルを返します

/ getevents-スポーツイベントを返します



All Articles