Yandex.Alisa en Telegram bot in PHP met dieselfde funksionaliteit

Goeie middag.

Daar is baie artikels oor die onderwerp van Telegram-bots, maar min mense skryf oor vaardighede vir Alice, en ek het geen inligting gekry oor hoe om 'n enkele bot te maak nie, so ek het besluit om my ervaring te deel oor hoe om 'n eenvoudige Telegram-bot en die Yandex.Alice-vaardigheid vir die webwerf wat dieselfde funksionaliteit het.

So, ek sal jou nie vertel hoe om 'n webbediener op te rig en 'n ssl-sertifikaat te kry nie, daar is genoeg daaroor geskryf.

Skep 'n Telegram-bot

Kom ons skep eers 'n Telegram-bot, hiervoor gaan ons na Telegram en vind die BotFather-bot daar.

Yandex.Alisa en Telegram bot in PHP met dieselfde funksionaliteit

Yandex.Alisa en Telegram bot in PHP met dieselfde funksionaliteit

Kies /newbot

Yandex.Alisa en Telegram bot in PHP met dieselfde funksionaliteit

Ons voer die naam van die bot in waarmee dit sal reageer, dan voer ons die naam van die bot in, in reaksie kry ons 'n teken om die bot te beheer, ons skryf hierdie sleutel neer, dit sal vir ons nuttig wees in die toekoms.

Yandex.Alisa en Telegram bot in PHP met dieselfde funksionaliteit

Die volgende stap is om die Telegram-bedieners te vertel na watter bediener data vanaf die bot moet stuur. Om dit te doen, maak ons ​​'n skakel van die vorm:

https: //api.telegram.org/bot___Π’ΠžΠšΠ•Π___/setWebhook?url=https://____ПУВЬ_Π”Πž_БКРПИВА___

___TOKEN___ vervang ons met ons teken van die bot, wat vroeΓ«r ontvang is

____PATH_TO_SCRIPT____ vervang ons met die adres van die skrip op ons bediener waar die data verwerk sal word (byvoorbeeld, www.my_server.ru/webhook_telegram.php).

Daar is 'n probleem hier, die api.telegram.org-bediener word geblokkeer, maar jy kan dit doen: huur die goedkoopste bediener waar daar geen beperkings is nie en gee die opdrag vanaf die konsole van hierdie bediener

wget ___ΠŸΠžΠ›Π£Π§Π˜Π’Π¨Π˜Π™Π‘Π―_АДРЕБ___

Dit is dit, die Telegram-bot word geskep en aan jou bediener gekoppel.

Skep 'n vaardigheid vir Yandex.Alisa

Kom ons gaan voort om 'n vaardigheid vir Yandex.Alice te skep.

Om 'n vaardigheid te skep, moet jy na die Yandex.Dialogues-ontwikkelaarsbladsy gaan Yandex.Dialogs-ontwikkelaarbladsy, klik daar "Skep dialoog" en kies "Vaardigheid in Alice".

Yandex.Alisa en Telegram bot in PHP met dieselfde funksionaliteit

Die dialoog vir vaardigheidsinstellings sal oopmaak.

Yandex.Alisa en Telegram bot in PHP met dieselfde funksionaliteit

Ons begin om die vaardigheidsinstellings in te voer.

Voer die naam van jou vaardigheid in.

Yandex.Alisa en Telegram bot in PHP met dieselfde funksionaliteit

Die aktiveringsnaam moet baie versigtig gekies word sodat Alice dit reg verstaan, uit die nuanses - 'n mobiele toepassing met Alice en kolomme soos Yandex.Station of Irbis A kan woorde anders waarneem.

Ons voer die pad na die script op ons bediener in op dieselfde manier as vir Telegram, maar dit sal 'n script spesifiek vir Alice wees, byvoorbeeld www.my_server.ru/webhook_alice.php.

Yandex.Alisa en Telegram bot in PHP met dieselfde funksionaliteit

Ons kies die stem waarmee die vaardigheid sal praat, ek hou meer van Alice se stem.

Yandex.Alisa en Telegram bot in PHP met dieselfde funksionaliteit

As jy van plan is om net op mobiele toestelle of in 'n blaaier te werk, kies dan "Jy benodig 'n toestel met 'n skerm."

Voer dan die instellings vir Alice se vaardigheidskatalogus in. As jy van plan is om die woord "handelsmerk" vir aktivering te gebruik, moet jy die handelsmerk se webwerf in die webmaster.yandex.ru-diens verifieer.

Yandex.Alisa en Telegram bot in PHP met dieselfde funksionaliteit

Dit is alles met die instellings, kom ons gaan aan na die skrifte.

Telegram bot skrif

Kom ons begin met 'n draaiboek vir Telegram.

Ons verbind die biblioteek waar boodskappe van die bot en Alice verwerk sal word:

include_once 'webhook_parse.php';

Ons stel die teken van ons bot:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Ons ontvang data:

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

Ontleding van die data in veranderlikes:

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

Nou kan jy met veranderlikes werk:

$tokens - hier is nou al die woorde wat die gebruiker ingevoer het

$user_id - gebruiker-ID hier

$msg_chat_id - klets waarin die bot die opdrag ontvang het

$msg_user_name - gebruikernaam

Vervolgens noem ons die Parse_Tokens-funksie vir verwerking:

$Out_Str = Parse_Tokens($tokens);

En stuur 'n antwoord:

Send_Out($user_id, $Out_Str);

die Send_Out-funksie is eenvoudig en lyk soos volg:

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

Vaardigheidskrip vir Yandex.Alisa

Kom ons gaan nou oor na die draaiboek vir Alice, dit is amper dieselfde as vir Telegram.

Ons verbind ook die biblioteek waar boodskappe van die bot en Alice verwerk sal word, plus 'n biblioteek met klasse vir Alice:

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

Ons ontvang data:

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

Ontleding van die data in veranderlikes:

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

Daar is 'n paar minder veranderlikes hier:

$tokens - hier is nou al die woorde wat die gebruiker ingevoer het

$user_id - gebruiker-ID hier

Yandex ping voortdurend gepubliseerde vaardighede, en ek het 'n reΓ«l bygevoeg om die skrif onmiddellik te verlaat sonder om die volle verwerking van die boodskap te begin:

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

Ons noem die Parse_Tokens-funksie vir verwerking, dit is dieselfde as vir Telegram:

$Out_Str = Parse_Tokens($tokens);

En stuur 'n antwoord:

Send_Out($user_id, $Out_Str);

Die Send_Out-funksie is hier meer ingewikkeld:

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

Het die draaiboek vir Alice voltooi.

Die Parse_Tokens-verwerkingskrip self is bloot vir 'n voorbeeld gemaak, u kan enige kontrole en verwerking daar doen.

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

As jy met 'n gebruiker van 'n meer komplekse vorm as 'n vraag-antwoord moet kommunikeer, dan sal jy die gebruiker se $user_id en die data wat reeds van die gebruiker ontvang is in die databasis moet stoor (byvoorbeeld, mysql) en dit moet ontleed in die Parse_Tokens-funksie.

Eintlik is dit amper alles, as alles korrek gedoen word, dan is die Telegram-bot reeds beskikbaar, Alice se vaardigheid kan nagegaan word dialogs.yandex.ru/ontwikkelaardeur na jou nuwe vaardigheid op die toetsoortjie te gaan.

Yandex.Alisa en Telegram bot in PHP met dieselfde funksionaliteit

As alles reg werk, kan jy die vaardigheid vir moderering stuur deur op die "Vir moderering"-knoppie te klik.

Nou het jy twee bots vir verskillende platforms gelyktydig, wat op dieselfde manier werk.

Dokumentasie vir die Yandex.Dialogues-diens hier

Volledige skrifte geplaas op github download.

Bron: will.com

Voeg 'n opmerking