単一の機能を備えたPHPのYandex.AliceおよびTelegramボット

こんにちは



テレグラムボットのトピックに関する記事はたくさんありますが、アリスのスキルに関する記事はほとんどなく、私は単一のボットの作成方法に関する情報を見つけられなかったので、サイトのシンプルなテレグラムボットとYandex。単一の機能を持ちます。



そのため、Webサーバーを上げてSSL証明書を取得する方法については説明しません。



Telegramボットの作成



まず、Telegramボットを作成します。そのためには、Telegramに移動して、BotFatherボットを見つけます。











選択/ newbot







応答するボットの名前を入力し、次にボットの名前を入力します。ボットを制御するためのトークンを取得し、このキーを作成すると、今後便利になります。







次のステップは、ボットからデータを送信するサーバーをTelegramサーバーに伝えることです。 これを行うには、次の形式のリンクを作成します。



https: //api.telegram.org/bot______/setWebhook?url=https://_________
      
      





___トークン___以前に受け取ったボットトークンに置き換えます



____ PATH_DO_SCRIPT ___は、データが処理されるサーバー上のスクリプトのアドレス(たとえば、 www.my_server.ru/webhook_telegram.php )に置き換えられます。



問題があります。api.telegram.orgサーバーはロックされていますが、これを行うことができます。制限のない最も安いサーバーをレンタルし、このサーバーのコンソールからコマンドを実行します。



 wget _______
      
      





以上で、Telegramボットが作成され、サーバーに接続されます。



Yandex.Aliceのスキルを作成する



次に、Yandex.Aliceのスキルを作成します。



スキルを作成するには、Yandex.Dialogs開発者ページ、Yandex.Dialogs開発者ページに移動し、[ダイアログを作成]をクリックして[アリスのスキル]を選択する必要があります。







スキル設定ダイアログが開きます。







スキル設定の入力を開始します。



スキルの名前を入力します。







アクティベーション名は、アリスがニュアンスから正しく理解できるように非常に慎重に選択する必要があります。アリスとYandex.StationやIrbis Aなどの列を持つモバイルアプリケーションは、さまざまな方法で単語を認識できます。



Telegramの場合と同じ方法でサーバー上のスクリプトへのパスを入力しますが、 www.my_server.ru / webhook_alice.phpなど、Alice専用のスクリプトになります。







スキルが話す声を選択します。アリスの声が好きです。







モバイルデバイスまたはブラウザでのみ作業する場合は、[画面のあるデバイスが必要]を選択します。



次に、Aliceスキルカタログの設定を入力します。 ブランドという言葉を使用してアクティブ化する予定がある場合は、webmaster.yandex.ruサービスでブランドWebサイトの検証を行う必要があります。







すべてを設定したら、スクリプトに移動します。



電報ボットスクリプト



Telegramのスクリプトから始めましょう。



ボットとアリスからのメッセージが処理されるライブラリを接続します:



 include_once 'webhook_parse.php';
      
      





ボットのトークンを設定します。



 $tg_bot_token = "_____YOUR_BOT_TOKEN_____";
      
      





データを取得します。



 $request = file_get_contents('php://input'); $request = json_decode($request, TRUE);
      
      





データを変数に解析します。



 if (!$request) { die(); // Some Error output (request is not valid JSON) } else if (!isset($request['update_id']) || !isset($request['message'])) { die(); // Some Error output (request has not message) } else { $user_id = $request['message']['from']['id']; $msg_user_name = $request['message']['from']['first_name']; $msg_user_last_name = $request['message']['from']['last_name']; $msg_user_nick_name = $request['message']['from']['username']; $msg_chat_id = $request['message']['chat']['id']; $msg_text = $request['message']['text']; $msg_text = mb_strtolower($msg_text, 'UTF-8'); $tokens = explode(" ", $msg_text); }
      
      





これで変数を操作できます:



$トークン-ユーザーがここに入力したすべての単語



$ user_id-ユーザーIDです



$ msg_chat_id-ボットがコマンドを受信したチャット



$ msg_user_name-ユーザー名



次に、処理のためにParse_Tokens関数を呼び出します。



 $Out_Str = Parse_Tokens($tokens);
      
      





そして答えを送ります:



 Send_Out($user_id, $Out_Str);
      
      





Send_Out関数は単純で、次のようになります。



 function Send_Out($user_id, $text, $is_end = true) { global $tg_bot_token; if (strlen($user_id) < 1 || strlen($text) < 1) {return;} $json = file_get_contents('https://api.telegram.org/bot' . $tg_bot_token . '/sendMessage?chat_id=' . $user_id . '&text=' . $text); }
      
      





Yandex.Aliceのスキルスクリプト



それでは、Aliceのスクリプトに移りましょう。これはTelegramのスクリプトとほとんど同じです。



ボットとアリスからのメッセージが処理されるライブラリに加えて、アリスのクラスを含むライブラリも接続します。



 include_once 'classes_alice.php'; include_once 'webhook_parse.php';
      
      





データを取得します。



 $data = json_decode(trim(file_get_contents('php://input')), true);
      
      





データを変数に解析します。



 if (isset($data['request'])) { //original_utterance if (isset($data['meta'])) { $data_meta = $data['meta']; if (isset($data_meta['client_id'])) {$client_id = $data_meta['client_id'];} } if (isset($data['request'])) { $data_req = $data['request']; if (isset($data_req['original_utterance'])) { $original_utterance = $data_req['original_utterance']; } if (isset($data_req['command'])) {$data_msg = $data_req['command'];} if (isset($data_req['nlu'])) { $data_nlu = $data_req['nlu']; if (isset($data_nlu['tokens'])) {$tokens = $data_nlu['tokens'];} // $data_token_count = count($data_tokens); } } if (isset($data['session'])) { $data_session = $data['session']; if (isset($data_session['new'])) {$data_msg_new = $data_session['new'];} if (isset($data_session['message_id'])) {$data_msg_id = $data_session['message_id'];} if (isset($data_session['session_id'])) {$data_msg_sess_id = $data_session['session_id'];} if (isset($data_session['skill_id'])) {$skill_id = $data_session['skill_id'];} if (isset($data_session['user_id'])) {$user_id = $data_session['user_id'];} } }
      
      





ここで、必要な変数はわずかに少なくなっています。



$トークン-ユーザーがここに入力したすべての単語



$ user_id-ユーザーIDです



Yandexは公開されたスキルに絶えずpingを送信し、完全なメッセージ処理を開始せずにスクリプトを直ちに終了する行を追加しました。



  if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
      
      





処理のためにParse_Tokens関数を呼び出します。これはTelegramの場合と同じです:



 $Out_Str = Parse_Tokens($tokens);
      
      





そして答えを送ります:



 Send_Out($user_id, $Out_Str);
      
      





Send_Out関数はここではより複雑です。



 function Send_Out($user_id, $out_text, $out_tts = "", $is_end = false) { global $data_msg_sess_id, $user_id; ///// GENERATE BASE OF OUT ////// $Data_Out = new Alice_Data_Out(); $Data_Out->response = new Alice_Response(); $Data_Out->session = new Alice_Session(); ///// GENERATE BASE OF OUT End ////// ///// OUT MSG GENERATE ///// $Data_Out->session->session_id = $data_msg_sess_id;; $Data_Out->session->user_id = $user_id; $Data_Out->response->text = $out_text; $Data_Out->response->tts = $out_tts; if (strlen($out_tts) < 1) {$Data_Out->response->tts = $out_text;} $Data_Out->response->end_session = $is_end; header('Content-Type: application/json'); print(json_encode($Data_Out, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT)); die(); }
      
      





アリスのスクリプトを完成させました。



処理スクリプトParse_Tokens自体は単なる例として行われたものであり、そこでチェックや処理を行うことができます。



 function Parse_Tokens($tokens) { $out = ""; // do something with tokens // $out = "Your eneter " . count($tokens) . " words: " . implode($tokens, " "); return $out; }
      
      





質問と回答よりも複雑な形式のユーザーと通信する必要がある場合、データベース(たとえば、mysql)にユーザーの$ user_idとユーザーから既に受信したデータを保存し、Parse_Tokens関数で分析する必要があります。



実際、これがほぼすべてです。すべてが正しく行われ、テレグラムボットが既に利用可能になっている場合、アリスのスキルはdialogs.yandex.ru/developerで確認でき、テストタブの新しいスキルに移動できます。







すべてが正常に機能する場合、「モデレート」ボタンをクリックして、スキルをモデレートに送信できます。



これで、同じように機能する異なるプラットフォーム用の2つのボットができました。



Yandex.Dialogサービスのドキュメントはこちら



完全なスクリプトはgithub downloadに投稿されています



更新:すべてをクラスにラップし、githubのリポジトリを更新しました



All Articles