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

Dobar dan.

Postoji mnogo članaka na temu Telegram botova, ali malo ljudi piše o vještinama za Alice, a nisam pronašao nikakvu informaciju o tome kako napraviti niti jednog bota, pa sam odlučio podijeliti svoje iskustvo o tome kako napraviti jednostavan Telegram bot i vještina Yandex.Alice za stranicu koja ima istu funkcionalnost.

Dakle, neću vam govoriti kako da podignete web server i dobijete ssl certifikat, dovoljno je o tome napisano.

Kreiranje Telegram bota

Prvo, napravimo Telegram bot, za to idemo na Telegram i tamo pronalazimo bota BotFather.

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

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

Odaberite /newbot

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

Upisujemo ime bota kojim će odgovoriti, zatim unosimo ime bota, kao odgovor dobijamo token za kontrolu bota, zapisujemo ovaj ključ, biće nam koristan u budućnosti.

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

Sledeći korak je da kažete Telegram serverima na koji server da pošalju podatke od bota. Da bismo to učinili, pravimo vezu obrasca:

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

___TOKEN___ zamjenjujemo našim tokenom od bota, primljenim ranije

____PATH_TO_SCRIPT____ zamjenjujemo sa adresom skripte na našem serveru gdje će se podaci obrađivati ​​(npr. www.my_server.ru/webhook_telegram.php).

Ovde postoji problem, server api.telegram.org je u blokadi, ali ovo možete učiniti: iznajmite najjeftiniji server gde nema ograničenja i dajte komandu sa konzole ovog servera

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

To je to, Telegram bot je kreiran i povezan sa vašim serverom.

Kreiranje vještine za Yandex.Alisa

Pređimo na kreiranje vještine za Yandex.Alice.

Da biste kreirali vještinu, trebate otići na stranicu programera Yandex.Dialogues Stranica programera Yandex.Dialogs, kliknite tamo "Kreiraj dijalog" i odaberite "Skill in Alice".

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

Otvoriće se dijalog postavki vještine.

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

Počinjemo unositi postavke vještina.

Unesite naziv svoje vještine.

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

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

Put do skripte unosimo na naš server 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 sa istom funkcionalnošću

Mi biramo glas kojim će veština govoriti, meni se više sviđa Alisin glas.

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

Ako planirate raditi samo na mobilnim uređajima ili u pretraživaču, odaberite "Potreban vam je uređaj sa ekranom".

Zatim unesite postavke za Alisin katalog vještina. Ako planirate koristiti riječ "brend" za aktivaciju, morate provjeriti web stranicu brenda u usluzi webmaster.yandex.ru.

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

To je sve sa postavkama, idemo na skripte.

Telegram bot skripta

Počnimo sa skriptom za Telegram.

Povezujemo biblioteku u kojoj će se obrađivati ​​poruke od 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);

Rastavljanje 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 sa 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 komandu

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

Skripta vještina za Yandex.Alisa

Pređimo sada na skriptu za Alice, skoro je ista kao i za Telegram.

Povezujemo i biblioteku u kojoj će se obrađivati ​​poruke od bota i Alice, plus biblioteku sa klasama za Alice:

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

Primamo podatke:

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

Rastavljanje 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 je nekoliko varijabli manje:

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

$user_id - korisnički ID ovdje

Yandex konstantno pinguje objavljene vještine, a ja sam dodao redak da odmah izađem 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 i za Telegram:

$Out_Str = Parse_Tokens($tokens);

I pošaljite odgovor:

Send_Out($user_id, $Out_Str);

Funkcija Send_Out je ovdje složenija:

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 scenario za Alice.

Sama skripta za obradu Parse_Tokens je napravljena samo kao primjer, tamo možete obaviti sve provjere i obradu.

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ženijeg oblika od pitanja-odgovora, tada ćete morati sačuvati korisnikov $user_id i podatke koji su već primljeni od korisnika u bazu podataka (na primjer, mysql) i analizirati ih u funkcija Parse_Tokens.

Zapravo, ovo je skoro sve, ako je sve urađeno kako treba, onda je Telegram bot već dostupan, Alisina vještina se može provjeriti dialogs.yandex.ru/developertako što ćete otići na svoju novu vještinu na kartici za testiranje.

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

Ako sve radi kako treba, možete poslati vještinu na moderiranje klikom na dugme "Za moderiranje".

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

Dokumentacija za uslugu Yandex.Dialogues ovdje

Kompletne skripte objavljene na githubu скачать.

izvor: www.habr.com

Dodajte komentar