Yandex.Alice i bot Telegram na PHP z jednolitym funkcjonalnością

Dzień dobry.

Na temat botów Telegram jest wiele artykułów, ale mało kto pisze o umiejętnościach dla Alice, a informacji o tym, jak stworzyć jednego bota, w ogóle nie znalazłem, więc postanowiłem podzielić się swoim doświadczeniem na temat, jak stworzyć prostego bota Telegram i umiejętność Yandex.Alice dla strony, mających wspólną funkcjonalność.

A więc, jak uruchomić serwer webowy i uzyskać certyfikat ssl nie będę opowiadać, jest o tym wystarczająco dużo napisane.

Tworzenie bota Telegram

Najpierw stworzymy bota Telegram, w tym celu idziemy do Telegram i tam znajdujemy bota BotFather.

Yandex.Alice i bot Telegram na PHP z jednolitym funkcjonalnością

Yandex.Alice i bot Telegram na PHP z jednolitym funkcjonalnością

Wybieramy /newbot

Yandex.Alice i bot Telegram na PHP z jednolitym funkcjonalnością

Wprowadzamy nazwę bota, pod którą będzie reagował, następnie wpisujemy nazwę bota i otrzymujemy token do zarządzania botem, zapisujemy ten klucz, przyda nam się w dalszej części.

Yandex.Alice i bot Telegram na PHP z jednolitym funkcjonalnością

Następnym krokiem jest poinformowanie serwerów Telegram, na jaki serwer wysyłać dane od bota. W tym celu tworzymy link w formacie:

https://api.telegram.org/bot___TOKEN___/setWebhook?url=https://____ŚCIEŻKA_DO_SKRYPTU___

___TOKEN___ zamieniamy na nasz token bota, uzyskany wcześniej

____ŚCIEŻKA_DO_SKRYPTU___ zamieniamy na adres skryptu na naszym serwerze, gdzie będzie odbywała się obróbka danych (na przykład www.my_server.ru/webhook_telegram.php).

Tutaj jest problem, serwer api.telegram.org jest zablokowany, ale można to zrobić: wynająć najtańszy serwer gdzie nie ma ograniczeń i wydać z konsoli tego serwera polecenie

wget ___UZYSKANY_ADRES___

Gotowe, bot Telegram został utworzony i powiązany z Twoim serwerem.

Tworzenie umiejętności dla Yandex.Alice

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

Aby stworzyć umiejętność, należy przejść na stronę deweloperów Yandex.Dialogi stronę deweloperów Yandex.Dialogi, kliknąć „Utwórz dialog” i wybrać „Umiejętność w Alice”.

Yandex.Alice i bot Telegram na PHP z jednolitym funkcjonalnością

Otworzy się dialog ustawień umiejętności.

Yandex.Alice i bot Telegram na PHP z jednolitym funkcjonalnością

Zaczynamy wprowadzać ustawienia umiejętności.

Wprowadzamy nazwę Twojej umiejętności.

Yandex.Alice i bot Telegram na PHP z jednolitym funkcjonalnością

Nazwa aktywacyjna powinna być starannie dobrana, aby Alice prawidłowo ją rozumiała, z pewnymi niuansami – mobilna aplikacja z Alice i głośniki takie jak Yandex.Station lub Irbis A mogą różnie odbierać słowa.

Wprowadzamy ścieżkę do skryptu na naszym serwerze tak samo jak dla Telegram, ale to będzie skrypt właśnie dla Alice, na przykład www.my_server.ru/webhook_alice.php.

Yandex.Alice i bot Telegram na PHP z jednolitym funkcjonalnością

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

Yandex.Alice i bot Telegram na PHP z jednolitym funkcjonalnością

Jeśli planowana jest praca tylko na urządzeniach mobilnych lub w przeglądarkach, wybieramy „Potrzebne urządzenie z ekranem”.

Teraz wprowadzamy ustawienia dla katalogu umiejętności Alisy. Jeśli planujesz użyć słowa — marka do aktywacji, musisz przejść weryfikację strony marki w serwisie webmaster.yandex.ru.

Yandex.Alice i bot Telegram na PHP z jednolitym funkcjonalnością

Ustawienia mamy za sobą, przechodzimy do skryptów.

Skrypt bota Telegram

Zaczynamy od skryptu dla Telegramu.

Podłączamy bibliotekę, w której będą przetwarzane wiadomości od bota i Alisy:

include_once 'webhook_parse.php';

Ustalamy token naszego bota:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Odbieramy dane:

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

Rozdzielamy dane na zmienne:

if (!$request)
{
  die();
    // Wypisz jakiś błąd (żądanie nie jest poprawnym JSON)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
  die();
    // Wypisz jakiś błąd (żądanie nie zawiera wiadomości)
}
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żemy pracować ze zmiennymi:

$tokens — tutaj teraz wszystkie słowa, które użytkownik wpisał

$user_id — tutaj id użytkownika

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

$msg_user_name — imię użytkownika

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

$Out_Str = Parse_Tokens($tokens);

I wysyłamy 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.Alice

Teraz przejdźmy do skryptu dla Alisy, jest on prawie taki sam jak dla Telegramu.

Również podłączamy bibliotekę, w której będą przetwarzane wiadomości od bota i Alisy, plus bibliotekę z klasami dla Alisy:

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

Odbieramy dane:

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

Rozdzielamy dane na zmienne:

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

Tut potrzebnych zmiennych jest nieco mniej:

$tokens — tutaj teraz wszystkie słowa, które użytkownik wpisał

$user_id — tutaj id użytkownika

Yandex stale pinguję opublikowane umiejętności, dodałem linię, aby natychmiast wychodzić ze skryptu, nie uruchamiając pełnego przetwarzania wiadomości:

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

Wywołujemy do przetwarzania funkcję Parse_Tokens, jest ona taka sama jak w przypadku Telegrama:

$Out_Str = Parse_Tokens($tokens);

I wysyłamy odpowiedź:

Send_Out($user_id, $Out_Str);

Funkcja Send_Out jest tutaj nieco bardziej złożona:

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

Zakończyliśmy skrypt dla Alisy.

Sam skrypt przetwarzania Parse_Tokens zrobiłem wyłącznie dla przykładu, będziesz mogła wprowadzić dowolne sprawdzenia i przetwarzania.

function Parse_Tokens($tokens)
{
  $out = "";
  // zrób coś z tokenami //
  $out =  "Twoje wprowadzenie " . count($tokens) . " słów: " . implode($tokens, " ");
  return $out;
}

Jeśli potrzebujesz bardziej złożonej interakcji z użytkownikiem niż pytanie-odpowiedź, będziesz musiała zapisywać w bazie (na przykład mysql) $user_id użytkownika oraz już otrzymane od niego dane i analizować je w funkcji Parse_Tokens.

Właściwie to prawie wszystko, jeśli wszystko zostało zrobione poprawnie, bot Telegramu jest już dostępny, a umiejętność Alisy można sprawdzić dialogs.yandex.ru/developer, przechodząc do swojej nowej umiejętności na zakładkę testowanie.

Yandex.Alice i bot Telegram na PHP z jednolitym funkcjonalnością

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

Teraz masz dwa boty dla różnych platform, które działają identycznie.

Dokumentacja usługi Yandex.Dialogi tutaj

Pełne skrypty są udostępnione na githubie pobierz.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster