Yandex.Alisa in Telegram bot v PHP z enako funkcionalnostjo

Dober dan.

Obstaja veliko člankov na temo Telegram botov, vendar le malo ljudi piše o veščinah za Alice in nisem našel nobenih informacij o tem, kako narediti enega samega bota, zato sem se odločil deliti svojo izkušnjo o tem, kako narediti preprost Telegram bot in spretnost Yandex.Alice za spletno mesto z enako funkcionalnostjo.

Torej, ne bom vam povedal, kako dvigniti spletni strežnik in pridobiti ssl certifikat, o tem je bilo že dovolj napisanega.

Ustvarjanje Telegram bota

Najprej ustvarimo bota Telegram, za to gremo v Telegram in tam poiščemo bota BotFather.

Yandex.Alisa in Telegram bot v PHP z enako funkcionalnostjo

Yandex.Alisa in Telegram bot v PHP z enako funkcionalnostjo

Izberite /newbot

Yandex.Alisa in Telegram bot v PHP z enako funkcionalnostjo

Vnesemo ime bota, s katerim se bo odzval, nato vnesemo ime bota, v odgovor dobimo žeton za nadzor bota, zapišemo ta ključ, koristil nam bo v prihodnosti.

Yandex.Alisa in Telegram bot v PHP z enako funkcionalnostjo

Naslednji korak je, da strežnikom Telegram poveste, na kateri strežnik naj pošljejo podatke iz bota. Če želite to narediti, naredimo povezavo obrazca:

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

___TOKEN___ zamenjamo z našim žetonom iz bota, prejetim prej

____PATH_TO_SCRIPT____ zamenjamo z naslovom skripte na našem strežniku, kjer bodo podatki obdelani (npr. www.my_server.ru/webhook_telegram.php).

Tukaj je problem, strežnik api.telegram.org je v blokadi, vendar lahko naredite tole: najemite najcenejši strežnik, kjer ni omejitev in dajte ukaz s konzole tega strežnika

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

To je to, bot Telegram je ustvarjen in povezan z vašim strežnikom.

Ustvarjanje spretnosti za Yandex.Alisa

Preidimo na ustvarjanje spretnosti za Yandex.Alice.

Če želite ustvariti veščino, morate iti na stran za razvijalce Yandex.Dialogues Stran razvijalca Yandex.Dialogs, tam kliknite "Ustvari dialog" in izberite "Skill in Alice".

Yandex.Alisa in Telegram bot v PHP z enako funkcionalnostjo

Odpre se pogovorno okno z nastavitvami spretnosti.

Yandex.Alisa in Telegram bot v PHP z enako funkcionalnostjo

Začnemo vnašati nastavitve spretnosti.

Vnesite ime svoje spretnosti.

Yandex.Alisa in Telegram bot v PHP z enako funkcionalnostjo

Aktivacijsko ime je treba izbrati zelo previdno, tako da ga Alice pravilno razume, glede na nianse - mobilna aplikacija z Alice in stolpci, kot sta Yandex.Station ali Irbis A, lahko besede zaznavajo drugače.

Pot do skripte na našem strežniku vnesemo na enak način kot za Telegram, vendar bo to skript posebej za Alice, npr. www.my_server.ru/webhook_alice.php.

Yandex.Alisa in Telegram bot v PHP z enako funkcionalnostjo

Izberemo glas, s katerim bo spretnost govorila, bolj mi je všeč Alicin glas.

Yandex.Alisa in Telegram bot v PHP z enako funkcionalnostjo

Če nameravate delati samo na mobilnih napravah ali v brskalniku, izberite "Potrebujete napravo z zaslonom."

Nato vnesite nastavitve za Alicein katalog spretnosti. Če nameravate za aktivacijo uporabiti besedo "blagovna znamka", morate preveriti spletno mesto blagovne znamke v storitvi webmaster.yandex.ru.

Yandex.Alisa in Telegram bot v PHP z enako funkcionalnostjo

To je vse z nastavitvami, pojdimo na skripte.

Telegram bot skript

Začnimo s skriptom za Telegram.

Povezujemo knjižnico, kjer bodo obdelana sporočila bota in Alice:

include_once 'webhook_parse.php';

Nastavili smo žeton našega bota:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Prejemamo podatke:

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

Razčlenitev podatkov v spremenljivke:

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

Zdaj lahko delate s spremenljivkami:

$tokens - tukaj so zdaj vse besede, ki jih je uporabnik vnesel

$user_id - ID uporabnika tukaj

$msg_chat_id - klepet, v katerem je bot prejel ukaz

$msg_user_name - uporabniško ime

Nato pokličemo funkcijo Parse_Tokens za obdelavo:

$Out_Str = Parse_Tokens($tokens);

In pošlji odgovor:

Send_Out($user_id, $Out_Str);

funkcija Send_Out je preprosta in izgleda takole:

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

Skill skript za Yandex.Alisa

Zdaj pa preidimo na scenarij za Alice, je skoraj enak kot za Telegram.

Povezujemo tudi knjižnico, kjer bodo obdelana sporočila bota in Alice, ter knjižnico z razredi za Alice:

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

Prejemamo podatke:

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

Razčlenitev podatkov v spremenljivke:

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

Tukaj je nekaj manj spremenljivk:

$tokens - tukaj so zdaj vse besede, ki jih je uporabnik vnesel

$user_id - ID uporabnika tukaj

Yandex nenehno pinga objavljene spretnosti in dodal sem vrstico za takojšen izhod iz skripta, ne da bi začel celotno obdelavo sporočila:

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

Za obdelavo pokličemo funkcijo Parse_Tokens, je enaka kot pri Telegramu:

$Out_Str = Parse_Tokens($tokens);

In pošlji odgovor:

Send_Out($user_id, $Out_Str);

Funkcija Send_Out je tukaj bolj zapletena:

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

Končal scenarij za Alice.

Sama skripta za obdelavo Parse_Tokens je bila narejena zgolj za primer, tam lahko izvajate poljubna preverjanja in obdelave.

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

Če morate komunicirati z uporabnikom bolj zapletene oblike kot je vprašanje-odgovor, boste morali shraniti $user_id uporabnika in podatke, ki ste jih že prejeli od uporabnika, v bazo podatkov (na primer mysql) in jih analizirati v funkcijo Parse_Tokens.

Pravzaprav je to skoraj vse, če je vse narejeno pravilno, potem je Telegram bot že na voljo, Alicino spretnost je mogoče preveriti dialogs.yandex.ru/developertako da obiščete svojo novo spretnost na zavihku za testiranje.

Yandex.Alisa in Telegram bot v PHP z enako funkcionalnostjo

Če vse deluje pravilno, lahko spretnost pošljete v moderacijo s klikom na gumb "Za moderiranje".

Sedaj imate naenkrat dva robota za različne platforme, ki delujeta na enak način.

Dokumentacija za storitev Yandex.Dialogi tukaj

Celotni skripti so objavljeni na githubu prenos.

Vir: www.habr.com

Dodaj komentar