PHPでTelegram用のシンプルなチャットボットを作成しています

@KinomanBotおよび@GaidarForum_botの開発者であるShukyurov Zaurは、 PHPで簡単なチャットボットを作成するためのガイドを作成しました。



2015年6月24日に、テレグラム開発者はボット(特定のアルゴリズムに従って特定のアクションを実行するプログラム)を作成するためプラットフォームを開きました



プラットフォームの作業の1年半にわたって、多くの問題を解決し、メッセンジャーで時間を過ごすことができる多くの興味深いチャットボットが蓄積されてきました。







ステップ1:ボットを@BotFatherに登録する



コードの記述を開始する前に、Telegram APIを操作するためのトークン(キー)を取得するために、「すべてのボットの父」- @BotFatherに新しいボットを登録する必要があります。



登録は5つの簡単な手順で行われます。



1) @BotFatherでチャットを開きます。

2)リストから/ newbotコマンドを入力または選択します。

3)希望するボットの名前を送信します。

4)検索で見つかったボットのユーザー名を書きます。 ユーザー名の末尾に「bot」または「_bot」という単語を必ず付けてください。 たとえば、 NetologyRSSbot ;

5)必要に応じて、完全な説明または短い説明、コマンドのリスト、およびアバターをすぐに構成できます。









登録の結果、トークン-375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8sを取得します。

注意:トークンを誰にも見せないでください。そうしないと、ボットが危険にさらされる可能性があります。 不幸な偶然により、良くない人があなたのトークンを認識した場合、「API Token」セクションの「 Revoke current token」ボタンをクリックして、同じ@BotFatherでそれを置き換えることができます。



ステップ2:リクエスト処理方法を選択する



公式文書に基づいて、Telegram APIは単純なHTTP要求に基づいています。 ユーザーがボットに送信するリクエストを処理する方法は2つしかありません。



1)「ロングポーリング」を使用して「手動で」チェックします。

2)「Webhook」を配置して、すべてをTelegramに任せます。 この場合、Telegramユーザーからのリクエスト自体がサーバー上で送信されます。



2番目のオプションに焦点を当てますが、制限があります。すべての要求が安全なHTTPSプロトコルを通過できるように、サイトにSSL証明書をインストールする必要があります。 ほとんどのホスティング会社でサポートされている自己署名および無料のLet's Encrypt証明書も適しています。



Telegramの公式ドキュメントから自己署名証明書セットアップする例



ステップ3:コードを書く



ボットコードはPHPで記述しますが、車輪を再発明しないように、既製の非常に便利なライブラリを使用します



まず、setWebhookメソッドを介してハンドラーファイルにボットをアタッチします。 ライブラリを使用してこれを行うことができますが、より高速で簡単なオプションがあります-このリンクを作成するには:

https:// API。 電報。 org / bot 375466075:AAEARK0r2nXjB67JiB35JCXXhKEKET42Px8s / setWebhook?url = https:// yoursitehere .ru / directory / bot.php

どこで

375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8sはトークンです。

https:// yousitehere。 ru / directory / bot.php-私たちのサイトのファイルハンドラへのリンク。



ブラウザーでこのリンクを開くと、 「Webhookが設定されました」という値のJSON応答が返されますつまり、webhookがインストールされ、ユーザーからのすべてのリクエストがファイルハンドラーのアドレスに送信されます。



最も重要なこと-これらの要求を処理し、ボット機能を作成します。



以下は、ハンドラファイルの完全なリストです。



<?php include('vendor/autoload.php'); //  use Telegram\Bot\Api; $telegram = new Api('375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s'); // ,   BotFather $result = $telegram -> getWebhookUpdates(); //   $result      $text = $result["message"]["text"]; //  $chat_id = $result["message"]["chat"]["id"]; //   $name = $result["message"]["from"]["username"]; //  $keyboard = [[" "],[""],[""]]; // if($text){ if ($text == "/start") { $reply = "   !"; $reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]); $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]); }elseif ($text == "/help") { $reply = "  ."; $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply ]); }elseif ($text == "") { $url = "https://68.media.tumblr.com/6d830b4f2c455f9cb6cd4ebe5011d2b8/tumblr_oj49kevkUz1v4bb1no1_500.jpg"; $telegram->sendPhoto([ 'chat_id' => $chat_id, 'photo' => $url, 'caption' => "." ]); }elseif ($text == "") { $url = "https://68.media.tumblr.com/bd08f2aa85a6eb8b7a9f4b07c0807d71/tumblr_ofrc94sG1e1sjmm5ao1_400.gif"; $telegram->sendDocument([ 'chat_id' => $chat_id, 'document' => $url, 'caption' => "." ]); }elseif ($text == " ") { $html=simplexml_load_file('http://netology.ru/blog/rss.xml'); foreach ($html->channel->item as $item) { $reply .= "\xE2\x9E\xA1 ".$item->title." (<a href='".$item->link."'></a>)\n"; } $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'disable_web_page_preview' => true, 'text' => $reply ]); }else{ $reply = "  \"<b>".$text."</b>\"   ."; $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode'=> 'HTML', 'text' => $reply ]); } }else{ $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => "  ." ]); } ?>
      
      





順番に見てみましょう。



1.最初に、ダウンロードしたライブラリを接続し、オートローダーファイルへのパス(できればフルパス)を示します。



 include('vendor/autoload.php'); //  use Telegram\Bot\Api;
      
      





2. $ telegram変数にクラスのインスタンスを作成し、トークンを渡します。



変数$ resultでは、 Telegramが送信するメッセージに関する情報を取得します。



 $telegram = new Api('375466075:AAEARK0r2nXjB67JiB35JCXXhKEyT42Px8s'); // ,   BotFather $result = $telegram -> getWebhookUpdates(); //   $result     
      
      





3.次に、主な変数を決定します。テキストメッセージ、ユーザーの一意の識別子、ユーザー名です。 データベースを操作する必要がある場合は、フィルタリングを忘れないでください(またはPDOを使用した方がよい)。



 $text = $result["message"]["text"]; //  $chat_id = $result["message"]["chat"]["id"]; //   $name = $result["message"]["from"]["username"]; // 
      
      





4. 3つのボタンで構成されるキーボードを作成します。



 $keyboard = [[" "],[""],[""]]; //
      
      





5.すべての変数を指定したので、受信したメッセージの処理に進むことができます。 これを行うには、 switch-caseまたはif-else構文を使用できます。 それらの間に基本的な違いはないので、最もよく知られているように、2番目のオプションについて説明します。



最初に、変数$ textが入力されているかどうか、およびユーザーのメッセージがテキストかどうかを確認します。



 if($text){ … // ... }else{ $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => "  ." ]); }
      
      





そうでない場合は、sendMessageメソッドを使用してテキストメッセージを要求するメッセージをユーザーに送信します。



6.ユーザーが/ startまたは/ helpコマンドを使用してメッセージを送信したときのオプションを検討します



 if ($text == "/start") { $reply = "   !"; $reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]); $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]); }elseif ($text == "/help") { $reply = "  ."; $reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]); $telegram->sendMessage([ 'chat_id' => $chat_id, 'text' => $reply, 'reply_markup' => $reply_markup ]); }
      
      





この場合、 $応答変数のテキストに加えて、「最近の記事」、「画像」、「GIF」の3つのボタンで構成されるキーボードがロードされます。



これは、 replyKeyboardMarkupメソッドを使用して実装されます。そのメソッドのパラメーターは次のとおりです。





7.キーボードが表示された後、ユーザーは明らかにその上にあるボタンをつついてみることを望んでいます。この場合の「内部」は次のとおりです。



 }elseif ($text == "") { $url = "https://68.media.tumblr.com/6d830b4f2c455f9cb6cd4ebe5011d2b8/tumblr_oj49kevkUz1v4bb1no1_500.jpg"; $telegram->sendPhoto([ 'chat_id' => $chat_id, 'photo' => $url, 'caption' => "." ]); }elseif ($text == "") { $url = "https://68.media.tumblr.com/bd08f2aa85a6eb8b7a9f4b07c0807d71/tumblr_ofrc94sG1e1sjmm5ao1_400.gif"; $telegram->sendDocument([ 'chat_id' => $chat_id, 'document' => $url, 'caption' => "." ]); }elseif ($text == " ") { $html=simplexml_load_file('http://netology.ru/blog/rss.xml'); foreach ($html->channel->item as $item) { $reply .= "\xE2\x9E\xA1 ".$item->title." (<a href='".$item->link."'></a>)\n"; } $telegram->sendMessage([ 'chat_id' => $chat_id, 'parse_mode' => 'HTML', 'disable_web_page_preview' => true, 'text' => $reply ]); }
      
      





8.画像を送信するには、 sendPhotoメソッドを使用してgif - sendDocumentを送信します。 どちらの場合も、Telegramではファイルへの直接リンクを転送できます。これは確かに非常に便利ですが、Telegramサーバー既に送信され画像またはgifのfile_idを転送した場合ほど高速ではありません。



9.最新の記事では、PHPに組み込まれたsimplexml_load_file関数を使用して、 Netology RSSフィードの単純な解析が使用されます。



sendMessageメソッドのパラメーターには、 2つの新しい値があります。



1) 'parse_mode' => 'HTML'



使用すると、メッセージにHTMLタグを挿入できます
 <b>, <a>, <i>, <code>
      
      



または
 <pre>
      
      





2)
 'disable_web_page_preview' => true
      
      



リンク付きのメッセージにプレビューが読み込まれないようにします。



10.スマイリー(右矢印)として、文字\ xE2 \ x9E \ xA1が使用されます。 このフォームのすべての笑顔のリストは特別なサイトで見つけることができます。







11.ボットをテストし、そのパフォーマンスに自信が持てたら、それを一般に送信できます。



便利なAPIのおかげで、Telegramボットは定期的なアクションの自動化、通知の設定、便利で迅速な情報の受信、ゲームの作成に適したプラットフォームになります。



テレグラムボットカタログTelegram Bot StoreTeleChappyまたは50botは、無料のプロモーションプラットフォームとして使用できます。



また、Yandex- Botanの無料ボット分析ツールを使用して、ユーザーアクティビティを分析できます。



編集者から



PHPは最も人気のあるプログラミング言語の1つです。 学びやすく、使いやすく、強力なコミュニティがあります。 5月5日、NetologiyaはPHP / SQL:バックエンド開発およびデータベースコースを開始します。このコースでは、主要なプログラマーが制御構造、ループ、関数、文字列、配列について説明します。 リレーショナルデータベースとSQLクエリ言語のすべてを学び、nginxとphp Webサーバーをインストールして構成する方法を学び、さまざまな複雑さのデータベースを管理します。 あなたを待っています!



All Articles