Yandex.Alisa i Telegram bot w PHP z tą samą funkcjonalnością

Dzień dobry.

Istnieje wiele artykułów na temat botów Telegrama, ale niewiele osób pisze o umiejętnościach dla Alice, a ja nie znalazłem żadnych informacji, jak zrobić jednego bota, więc postanowiłem podzielić się moimi doświadczeniami, jak zrobić prosty bot Telegram i umiejętność Yandex.Alice dla witryny o tej samej funkcjonalności.

Więc nie powiem ci, jak postawić serwer WWW i uzyskać certyfikat ssl, na ten temat napisano już wystarczająco dużo.

Tworzenie bota Telegrama

Najpierw stwórzmy bota Telegram, w tym celu przechodzimy do Telegrama i znajdujemy tam bota BotFather.

Yandex.Alisa i Telegram bot w PHP z tą samą funkcjonalnością

Yandex.Alisa i Telegram bot w PHP z tą samą funkcjonalnością

Wybierz /nowybot

Yandex.Alisa i Telegram bot w PHP z tą samą funkcjonalnością

Wpisujemy nazwę bota, którym będzie odpowiadał, następnie wpisujemy nazwę bota, w odpowiedzi dostajemy token do sterowania botem, zapisujemy ten klucz, przyda nam się w przyszłości.

Yandex.Alisa i Telegram bot w PHP z tą samą funkcjonalnością

Następnym krokiem jest poinformowanie serwerów Telegrama, do którego serwera wysłać dane z bota. W tym celu tworzymy link do formularza:

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

___TOKEN___ zastępujemy naszym tokenem od bota, otrzymanym wcześniej

____PATH_TO_SCRIPT____ zastępujemy adresem skryptu na naszym serwerze, na którym dane będą przetwarzane (np. www.my_server.ru/webhook_telegram.php).

Tu jest problem, serwer api.telegram.org jest w trakcie blokowania, ale można to zrobić: wynająć najtańszy serwer gdzie nie ma ograniczeń i wydać komendę z konsoli tego serwera

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

To wszystko, bot Telegram został utworzony i podłączony do twojego serwera.

Tworzenie umiejętności dla Yandex.Alisa

Przejdźmy do tworzenia umiejętności dla Yandex.Alice.

Aby utworzyć umiejętność, musisz przejść do strony programistów Yandex.Dialogues Strona programisty Yandex.Dialogs, kliknij tam "Stwórz dialog" i wybierz "Skill in Alice".

Yandex.Alisa i Telegram bot w PHP z tą samą funkcjonalnością

Otworzy się okno dialogowe ustawień umiejętności.

Yandex.Alisa i Telegram bot w PHP z tą samą funkcjonalnością

Zaczynamy wchodzić w ustawienia umiejętności.

Wpisz nazwę swojej umiejętności.

Yandex.Alisa i Telegram bot w PHP z tą samą funkcjonalnością

Nazwę aktywacji należy wybrać bardzo ostrożnie, aby Alice zrozumiała ją poprawnie, z niuansów - aplikacja mobilna z Alice i kolumnami takimi jak Yandex.Station lub Irbis A może inaczej postrzegać słowa.

Ścieżkę do skryptu na naszym serwerze wpisujemy tak samo jak do Telegrama, ale będzie to skrypt specjalnie dla Alicji np. www.my_server.ru/webhook_alice.php.

Yandex.Alisa i Telegram bot w PHP z tą samą funkcjonalnością

Wybieramy głos, którym będzie przemawiać umiejętność, bardziej podoba mi się głos Alicji.

Yandex.Alisa i Telegram bot w PHP z tą samą funkcjonalnością

Jeśli planujesz pracować tylko na urządzeniach mobilnych lub w przeglądarce, wybierz „Potrzebujesz urządzenia z ekranem”.

Następnie wprowadź ustawienia katalogu umiejętności Alicji. Jeśli planujesz używać słowa „marka” do aktywacji, musisz zweryfikować stronę internetową marki w serwisie webmaster.yandex.ru.

Yandex.Alisa i Telegram bot w PHP z tą samą funkcjonalnością

To wszystko z ustawieniami, przejdźmy do skryptów.

Skrypt bota telegramu

Zacznijmy od skryptu dla Telegrama.

Łączymy bibliotekę, w której będą przetwarzane wiadomości od bota i Alicji:

include_once 'webhook_parse.php';

Ustawiamy token naszego bota:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Otrzymujemy dane:

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

Parsowanie danych do zmiennych:

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

Teraz możesz pracować ze zmiennymi:

$tokeny - tutaj są teraz wszystkie słowa, które wprowadził użytkownik

$user_id - identyfikator użytkownika tutaj

$msg_chat_id - czat, w którym bot otrzymał polecenie

$msg_user_name - nazwa użytkownika

Następnie wywołujemy funkcję Parse_Tokens do przetwarzania:

$Out_Str = Parse_Tokens($tokens);

I wyślij odpowiedź:

Send_Out($user_id, $Out_Str);

funkcja Send_Out jest prosta i wygląda tak:

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

Skrypt umiejętności dla Yandex.Alisa

Przejdźmy teraz do skryptu dla Alice, jest prawie taki sam jak dla Telegrama.

Łączymy też bibliotekę, w której będą przetwarzane wiadomości od bota i Alicji, plus bibliotekę z klasami dla Alicji:

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

Otrzymujemy dane:

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

Parsowanie danych do zmiennych:

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

Tutaj jest kilka mniej zmiennych:

$tokeny - tutaj są teraz wszystkie słowa, które wprowadził użytkownik

$user_id - identyfikator użytkownika tutaj

Yandex stale pinguje opublikowane umiejętności, a ja dodałem linię, aby natychmiast wyjść ze skryptu bez rozpoczynania pełnego przetwarzania wiadomości:

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

Do przetwarzania wywołujemy funkcję Parse_Tokens, jest ona taka sama jak dla Telegrama:

$Out_Str = Parse_Tokens($tokens);

I wyślij odpowiedź:

Send_Out($user_id, $Out_Str);

Funkcja Send_Out jest tutaj bardziej skomplikowana:

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

Skończyłem scenariusz dla Alice.

Sam skrypt przetwarzania Parse_Tokens został stworzony wyłącznie dla przykładu, można tam wykonać dowolne kontrole i przetwarzanie.

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

Jeśli potrzebujesz komunikować się z użytkownikiem w bardziej złożonej formie niż pytanie-odpowiedź, będziesz musiał zapisać $user_id użytkownika oraz dane już otrzymane od użytkownika w bazie danych (na przykład mysql) i przeanalizować je w funkcja Parse_Tokens.

Właściwie to prawie wszystko, jeśli wszystko jest zrobione poprawnie, to bot Telegram jest już dostępny, umiejętności Alicji można sprawdzić dialogs.yandex.ru/developerprzechodząc do nowej umiejętności na karcie testowania.

Yandex.Alisa i Telegram bot w PHP z tą samą funkcjonalnością

Jeśli wszystko działa poprawnie, możesz wysłać umiejętność do moderacji, klikając przycisk „Do moderacji”.

Teraz masz dwa boty na różne platformy jednocześnie, które działają w ten sam sposób.

Dokumentacja usługi Yandex.Dialogues tutaj

Pełne skrypty opublikowane na github pobranie.

Źródło: www.habr.com

Dodaj komentarz