同じ機能を持つ PHP の Yandex.Alisa およ​​び Telegram ボット

今日は。

Telegram ボットに関する記事はたくさんありますが、アリスのスキルについて書いている人は少なく、単一のボットの作り方についての情報が見つからなかったので、私の経験を共有することにしました。シンプルな Telegram ボットと、同じ機能を持つサイトの Yandex.Alice スキル。

したがって、Web サーバーを立ち上げて SSL 証明書を取得する方法については説明しません。それについては十分に書かれています。

電報ボットの作成

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

同じ機能を持つ PHP の Yandex.Alisa およ​​び Telegram ボット

同じ機能を持つ PHP の Yandex.Alisa およ​​び Telegram ボット

/newbot を選択します

同じ機能を持つ PHP の Yandex.Alisa およ​​び Telegram ボット

応答するボットの名前を入力し、次にボットの名前を入力します。応答として、ボットを制御するためのトークンを取得します。このキーを書き留めます。このキーは将来的に役立ちます。

同じ機能を持つ PHP の Yandex.Alisa およ​​び Telegram ボット

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

https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___

___TOKEN___ は、以前に受信したボットからのトークンに置き換えます

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

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

wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___

これで、Telegram ボットが作成され、サーバーに接続されました。

Yandex.Alisa のスキルの作成

Yandex.Alice のスキルの作成に進みましょう。

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

同じ機能を持つ PHP の Yandex.Alisa およ​​び Telegram ボット

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

同じ機能を持つ PHP の Yandex.Alisa およ​​び Telegram ボット

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

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

同じ機能を持つ PHP の Yandex.Alisa およ​​び Telegram ボット

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

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

同じ機能を持つ PHP の Yandex.Alisa およ​​び Telegram ボット

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

同じ機能を持つ PHP の Yandex.Alisa およ​​び Telegram ボット

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

次に、アリスのスキルカタログの設定を入力します。 アクティベーションに「ブランド」という単語を使用する場合は、webmaster.yandex.ru サービスでブランドの Web サイトを確認する必要があります。

同じ機能を持つ PHP の Yandex.Alisa およ​​び Telegram ボット

設定はこれですべてです。スクリプトに進みましょう。

テレグラムボットスクリプト

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);
}

これで、変数を操作できるようになります。

$tokens - ユーザーが入力したすべての単語がここに表示されます

$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.Alisa のスキル スクリプト

次に、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'];}
  }
}

ここには変数がいくつかあります。

$tokens - ユーザーが入力したすべての単語がここに表示されます

$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;
}

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

実際、これでほぼすべてが完了します。すべてが正しく行われていれば、Telegram ボットはすでに利用可能であり、Alice のスキルを確認できます。 Dialogs.yandex.ru/開発者テストタブの新しいスキルに移動します。

同じ機能を持つ PHP の Yandex.Alisa およ​​び Telegram ボット

すべてが正しく動作する場合は、[モデレーション用] ボタンをクリックしてスキルをモデレート用に送信できます。

これで、異なるプラットフォーム用の XNUMX つのボットが同時に動作し、同じように動作するようになりました。

Yandex.Dialogues サービスのドキュメント ここで

完全なスクリプトは github に投稿されています ダウンロード.

出所: habr.com

コメントを追加します