Yandex.Alisa i Telegram bot u PHP-u s istom funkcionalnošću

Dobar dan.

Postoji puno članaka na temu Telegram botova, ali malo ljudi piše o vještinama za Alice, a ja nisam našao nikakve informacije o tome kako napraviti niti jedan bot, pa sam odlučio podijeliti svoje iskustvo o tome kako napraviti jednostavan Telegram bot i Yandex.Alice vještina za web mjesto koje ima istu funkcionalnost.

Dakle, neću vam govoriti kako podići web poslužitelj i dobiti ssl certifikat, o tome je dovoljno napisano.

Izrada Telegram bota

Prvo, napravimo Telegram bot, za to idemo na Telegram i tamo pronađemo BotFather bot.

Yandex.Alisa i Telegram bot u PHP-u s istom funkcionalnošću

Yandex.Alisa i Telegram bot u PHP-u s istom funkcionalnošću

Odaberite /newbot

Yandex.Alisa i Telegram bot u PHP-u s istom funkcionalnošću

Upisujemo ime bota kojim će odgovarati, zatim upisujemo ime bota, kao odgovor dobivamo token za kontrolu bota, zapisujemo taj ključ, koristit će nam u budućnosti.

Yandex.Alisa i Telegram bot u PHP-u s istom funkcionalnošću

Sljedeći korak je reći Telegram poslužiteljima na koji poslužitelj da šalju podatke s bota. Da bismo to učinili, napravimo vezu obrasca:

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

___TOKEN___ zamjenjujemo našim tokenom od bota, primljenim ranije

____PATH_TO_SCRIPT___ zamjenjujemo adresom skripte na našem poslužitelju gdje će se podaci obrađivati ​​(npr. www.my_server.ru/webhook_telegram.php).

Ovdje postoji problem, server api.telegram.org je u blokadi, ali možete ovo: unajmite najjeftiniji server gdje nema ograničenja i dajte naredbu s konzole tog servera

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

To je to, Telegram bot je kreiran i spojen na vaš poslužitelj.

Stvaranje vještine za Yandex.Alisa

Prijeđimo na stvaranje vještine za Yandex.Alice.

Da biste stvorili vještinu, morate otići na stranicu za programere Yandex.Dialogues Stranica razvojnog programera Yandex.Dialogs, tamo kliknite "Stvori dijalog" i odaberite "Vještina u Alice".

Yandex.Alisa i Telegram bot u PHP-u s istom funkcionalnošću

Otvorit će se dijaloški okvir postavki vještina.

Yandex.Alisa i Telegram bot u PHP-u s istom funkcionalnošću

Počinjemo unositi postavke vještina.

Unesite naziv svoje vještine.

Yandex.Alisa i Telegram bot u PHP-u s istom funkcionalnošću

Ime za aktivaciju treba odabrati vrlo pažljivo kako bi ga Alice ispravno razumjela, od nijansi - mobilna aplikacija s Alice i stupcima poput Yandex.Station ili Irbis A može drugačije percipirati riječi.

Put do skripte na našem poslužitelju unosimo na isti način kao i za Telegram, ali to će biti skripta posebno za Alice, na primjer www.my_server.ru/webhook_alice.php.

Yandex.Alisa i Telegram bot u PHP-u s istom funkcionalnošću

Biramo glas kojim će vještina govoriti, meni se više sviđa Alicin glas.

Yandex.Alisa i Telegram bot u PHP-u s istom funkcionalnošću

Ako planirate raditi samo na mobilnim uređajima ili u pregledniku, odaberite "Potreban vam je uređaj sa zaslonom".

Zatim unesite postavke za Alicein katalog vještina. Ako planirate koristiti riječ "brand" za aktivaciju, morate potvrditi web mjesto marke u webmaster.yandex.ru servisu.

Yandex.Alisa i Telegram bot u PHP-u s istom funkcionalnošću

To je sve s postavkama, prijeđimo na skripte.

Telegram bot skripta

Počnimo sa skriptom za Telegram.

Povezujemo biblioteku u kojoj će se obrađivati ​​poruke bota i Alice:

include_once 'webhook_parse.php';

Postavili smo token našeg bota:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Primamo podatke:

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

Raščlanjivanje podataka u varijable:

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

Sada možete raditi s varijablama:

$tokeni - ovdje su sada sve riječi koje je korisnik unio

$user_id - korisnički ID ovdje

$msg_chat_id - chat u kojem je bot primio naredbu

$msg_user_name - korisničko ime

Zatim pozivamo funkciju Parse_Tokens za obradu:

$Out_Str = Parse_Tokens($tokens);

I pošaljite odgovor:

Send_Out($user_id, $Out_Str);

funkcija Send_Out je jednostavna i izgleda ovako:

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 skripta za Yandex.Alisa

Sada idemo na scenarij za Alice, gotovo je isti kao i za Telegram.

Također povezujemo knjižnicu u kojoj će se obrađivati ​​poruke od bota i Alice, plus knjižnicu s razredima za Alice:

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

Primamo podatke:

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

Raščlanjivanje podataka u varijable:

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

Ovdje postoji nešto manje varijabli:

$tokeni - ovdje su sada sve riječi koje je korisnik unio

$user_id - korisnički ID ovdje

Yandex neprestano pinga objavljene vještine, a ja sam dodao redak za trenutni izlaz iz skripte bez pokretanja pune obrade poruke:

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

Pozivamo funkciju Parse_Tokens za obradu, ista je kao za Telegram:

$Out_Str = Parse_Tokens($tokens);

I pošaljite odgovor:

Send_Out($user_id, $Out_Str);

Funkcija Send_Out ovdje je kompliciranija:

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

Završio scenarij za Alice.

Sama skripta za obradu Parse_Tokens napravljena je čisto kao primjer, tamo možete raditi bilo kakve provjere i obrade.

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

Ako trebate komunicirati s korisnikom složenije forme od pitanja-odgovora, tada ćete morati spremiti $user_id korisnika i podatke koji su već primljeni od korisnika u bazu podataka (na primjer, mysql) i analizirati u funkciji Parse_Tokens.

Zapravo, ovo je gotovo sve, ako je sve učinjeno kako treba, onda je Telegram bot već dostupan, Aliceina vještina se može provjeriti dialogs.yandex.ru/developerodlaskom na svoju novu vještinu na kartici za testiranje.

Yandex.Alisa i Telegram bot u PHP-u s istom funkcionalnošću

Ako sve radi ispravno, možete poslati skill na moderiranje klikom na gumb "Za moderiranje".

Sada imate dva bota za različite platforme odjednom, koji rade na isti način.

Dokumentacija za uslugu Yandex.Dialogues ovdje

Pune skripte objavljene na githubu preuzimanje.

Izvor: www.habr.com

Dodajte komentar