Yandex.Alice i Telegram bot na PHP-u s jedinstvenom funkcionalnošću

Dobar dan.

O Telegram botovima postoji mnogo članaka, dok se o vještinama za Alisa malo piše, a informacije o tome kako napraviti jednog bota nisam mogao naći, pa sam odlučio podijeliti svoje iskustvo o tome kako napraviti jednostavnog Telegram bota i vještinu Yandex.Alice za web stranicu koja će imati jedinstvenu funkcionalnost.

Dakle, kako podići web poslužitelj i dobiti ssl certifikat neću pričati, o tome je već dovoljno napisano.

Izrada Telegram bota

Prvo ćemo izraditi Telegram bota, za to idemo u Telegram i tamo pronalazimo bota BotFather.

Yandex.Alice i Telegram bot na PHP-u s jedinstvenom funkcionalnošću

Yandex.Alice i Telegram bot na PHP-u s jedinstvenom funkcionalnošću

Biramo /newbot

Yandex.Alice i Telegram bot na PHP-u s jedinstvenom funkcionalnošću

Unosimo ime bota na kojem će se on odazivati, zatim unosimo korisničko ime bota, a u odgovoru dobivamo token za upravljanje botom, zapišemo ovu ključ, bit će nam potrebna kasnije.

Yandex.Alice i Telegram bot na PHP-u s jedinstvenom funkcionalnošću

Sljedeći korak je obavijestiti Telegram poslužitelje na koji poslužitelj slati podatke od bota. Za to pravimo link u obliku:

https://api.telegram.org/bot___TOKEN___/setWebhook?url=https://____PUT_DO_SKRIPTE___

___TOKEN___ zamijenimo našim tokenom od bota, koji smo ranije dobili

____PUT_DO_SKRIPTE___ zamijenimo adresom skripte na našem poslužitelju, gdje će se obraditi podaci (na primjer, www.my_server.ru/webhook_telegram.php).

Tu nastaje problem, poslužitelj api.telegram.org je pod blokadom, ali možemo učiniti sljedeće: iznajmiti najjeftiniji server gdje nema ograničenja i dati iz konzole tog poslužitelja naredbu

wget ___DOBIVENA_ADRESA___

Sve, Telegram bot je stvoren i povezan s vašim serverom.

Izrada vještine za Yandex.Alicu

Prelazimo na izradu vještine za Yandex.Alicu.

Za izradu vještine potrebno je otići na stranicu programera Yandex.Dialogs stranicu programera Yandex.Dialogs, kliknuti na "Kreiraj dijalog" i odabrati "Vještina u Alisi".

Yandex.Alice i Telegram bot na PHP-u s jedinstvenom funkcionalnošću

Otvorit će se dijalog za postavke vještine.

Yandex.Alice i Telegram bot na PHP-u s jedinstvenom funkcionalnošću

Počinjemo unositi postavke vještine.

Unosimo naziv vaše vještine.

Yandex.Alice i Telegram bot na PHP-u s jedinstvenom funkcionalnošću

Aktivacijsko ime treba pažljivo birati, da bi ga Alisa ispravno razumjela, od pojedinosti – mobilna aplikacija s Alisom i zvučnici kao što su Yandex.Stanica ili Irbis A mogu različito interpretirati riječi.

Unosimo put do skripte na našem poslužitelju baš kao i za Telegram, ali to će biti skripta namijenjena isključivo Alisi, na primjer www.my_server.ru/webhook_alice.php.

Yandex.Alice i Telegram bot na PHP-u s jedinstvenom funkcionalnošću

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

Yandex.Alice i Telegram bot na PHP-u s jedinstvenom funkcionalnošću

Ako je planirano da radite samo na mobilnim uređajima ili u pregledniku, odabiremo "Potrebno je uređaj s ekranom".

Dalje unosimo postavke za katalog vještina Alise. Ako planirate koristiti riječ - marka za aktivaciju, potrebno je proći verifikaciju web stranice brenda u servisu webmaster.yandex.ru.

Yandex.Alice i Telegram bot na PHP-u s jedinstvenom funkcionalnošću

S postavkama smo gotovi, prelazimo na skripte.

Skripta Telegram bota

Započnimo sa skriptom za Telegram.

Priključujemo biblioteku koja će obrađivati poruke od bota i Alise:

include_once 'webhook_parse.php';

Postavljamo token našeg bota:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Primamo podatke:

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

Raspoređujemo podatke u varijable:

if (!$request)
{
  die();
    \/\/ Neka greška (zahtev nije validan JSON)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
  die();
    \/\/ Neka greška (zahtev nema poruku)
}
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žemo raditi s varijablama:

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

$user_id - ovdje je id korisnika

$msg_chat_id - chat u kojem je bot dobio komandu

$msg_user_name - ime korisnika

Dalje, pozivamo funkciju Parse_Tokens za obradu:

$Out_Str = Parse_Tokens($tokens);

I šaljemo 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štine za Yandex.Ališu

Sada prelazimo na skriptu za Alisu, ona je gotovo ista kao i za Telegram.

Također priključujemo biblioteku koja će obrađivati poruke od bota i Alise, plus biblioteku s klasama za Alisu:

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

Primamo podatke:

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

Raspoređujemo podatke 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 nešto manje potrebnih varijabli:

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

$user_id - ovdje je id korisnika

Yandex neprestano provjerava objavljene vještine, dodao sam liniju kako bih odmah izašao iz skripte, ne pokrećući cjelovitu obradu poruke:

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

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

$Out_Str = Parse_Tokens($tokens);

I šaljemo odgovor:

Send_Out($user_id, $Out_Str);

Funkcija Send_Out ovdje je složenija:

function Send_Out($user_id, $out_text, $out_tts = "", $is_end = false)
{
  global $data_msg_sess_id, $user_id;

  //////////// GENERIRANJE OSNOVE IZLAZA ////////////
    $Data_Out = new Alice_Data_Out();
    $Data_Out->response = new Alice_Response();
    $Data_Out->session = new Alice_Session();
  //////////// GENERIRANJE OSNOVE IZLAZA Kraj ////////////

  //////////// GENERIRANJE PORUKE IZLAZA ////////////
  $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();
}

Završili smo skriptu za Alisu.

Sama skripta za obradu Parse_Tokens napravljena je samo kao primjer, vi možete dodati bilo kakve provjere i obrade.

function Parse_Tokens($tokens)
{
  $out = "";
  // učinite nešto s tokenima //
  $out =  "Vaš unosi " . count($tokens) . " riječi: " . implode($tokens, " ");
  return $out;
}

Ako vam je potrebna složenija interakcija s korisnikom od pitanje-odgovor, trebate pohraniti u bazi (npr. mysql) $user_id korisnika i već primljene podatke od korisnika i analizirati ih u funkciji Parse_Tokens.

U biti, to je skoro sve, ako je sve ispravno napravljeno, Telegram-bot je već dostupan, vještinu Alise možete provjeriti dialogs.yandex.ru/developer, odlaskom u svoju novu vještinu na kartici testiranje.

Yandex.Alice i Telegram bot na PHP-u s jedinstvenom funkcionalnošću

Ako sve ispravno funkcionira, možete poslati vještinu na moderaciju pritiskom na gumb "Na moderaciju".

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

Dokumentacija za servis Yandex.Dialogs ovdje

Cijeli skripti su objavljeni na githubu preuzimanje.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster