Yandex.Alisa en Telegram bot in PHP met dezelfde functionaliteit

Goedemiddag.

Er zijn veel artikelen over het onderwerp Telegram-bots, maar weinig mensen schrijven over vaardigheden voor Alice, en ik vond geen informatie over het maken van een enkele bot, dus besloot ik mijn ervaring te delen over het maken van een eenvoudige Telegram-bot en de Yandex.Alice-vaardigheid voor de site met dezelfde functionaliteit.

Dus ik zal je niet vertellen hoe je een webserver ophaalt en een ssl-certificaat krijgt, er is genoeg over geschreven.

Een Telegram-bot maken

Laten we eerst een Telegram-bot maken, hiervoor gaan we naar Telegram en zoeken daar de BotFather-bot.

Yandex.Alisa en Telegram bot in PHP met dezelfde functionaliteit

Yandex.Alisa en Telegram bot in PHP met dezelfde functionaliteit

Kies /newbot

Yandex.Alisa en Telegram bot in PHP met dezelfde functionaliteit

We voeren de naam van de bot in waarmee deze zal reageren, dan voeren we de naam van de bot in, als reactie krijgen we een token om de bot te besturen, we schrijven deze sleutel op, deze zal in de toekomst nuttig voor ons zijn.

Yandex.Alisa en Telegram bot in PHP met dezelfde functionaliteit

De volgende stap is om de Telegram-servers te vertellen naar welke server gegevens van de bot moeten worden verzonden. Hiervoor maken we een link van het formulier:

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

___TOKEN___ die we vervangen door ons token van de bot, dat we eerder hebben ontvangen

____PATH_TO_SCRIPT____ vervangen we door het adres van het script op onze server waar de gegevens worden verwerkt (bijvoorbeeld www.my_server.ru/webhook_telegram.php).

Er is hier een probleem, de api.telegram.org-server wordt geblokkeerd, maar u kunt dit doen: huur de goedkoopste server waar geen beperkingen zijn en geef het commando vanaf de console van deze server

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

Dat is alles, de Telegram-bot is gemaakt en verbonden met uw server.

Een vaardigheid maken voor Yandex.Alisa

Laten we verder gaan met het maken van een vaardigheid voor Yandex.Alice.

Om een ​​vaardigheid te creëren, moet je naar de ontwikkelaarspagina van Yandex.Dialogues gaan Yandex.Dialogs ontwikkelaarspagina, klik daar op "Dialoog aanmaken" en selecteer "Skill in Alice".

Yandex.Alisa en Telegram bot in PHP met dezelfde functionaliteit

Het dialoogvenster met vaardigheidsinstellingen wordt geopend.

Yandex.Alisa en Telegram bot in PHP met dezelfde functionaliteit

We beginnen de vaardigheidsinstellingen in te voeren.

Voer de naam van uw vaardigheid in.

Yandex.Alisa en Telegram bot in PHP met dezelfde functionaliteit

De activeringsnaam moet zeer zorgvuldig worden gekozen, zodat Alice deze correct begrijpt, uit de nuances - een mobiele applicatie met Alice en kolommen zoals Yandex.Station of Irbis A kan woorden anders waarnemen.

We voeren het pad naar het script op onze server op dezelfde manier in als voor Telegram, maar het zal bijvoorbeeld een script zijn dat specifiek voor Alice is www.my_server.ru/webhook_alice.php.

Yandex.Alisa en Telegram bot in PHP met dezelfde functionaliteit

We kiezen de stem waarmee de vaardigheid zal spreken, ik hou meer van de stem van Alice.

Yandex.Alisa en Telegram bot in PHP met dezelfde functionaliteit

Als u van plan bent alleen op mobiele apparaten of in een browser te werken, selecteert u 'U hebt een apparaat met een scherm nodig'.

Voer vervolgens de instellingen in voor de vaardighedencatalogus van Alice. Als u van plan bent het woord "merk" te gebruiken voor activering, moet u de website van het merk verifiëren in de webmaster.yandex.ru-service.

Yandex.Alisa en Telegram bot in PHP met dezelfde functionaliteit

Dat is alles met de instellingen, laten we verder gaan met de scripts.

Telegram-botscript

Laten we beginnen met een script voor Telegram.

We verbinden de bibliotheek waar berichten van de bot en Alice worden verwerkt:

include_once 'webhook_parse.php';

We stellen het token van onze bot in:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Wij ontvangen gegevens:

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

De gegevens ontleden in variabelen:

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

Nu kunt u met variabelen werken:

$tokens - hier zijn nu alle woorden die de gebruiker heeft ingevoerd

$user_id - gebruikers-ID hier

$msg_chat_id - chat waarin de bot de opdracht heeft ontvangen

$msg_user_name - gebruikersnaam

Vervolgens noemen we de Parse_Tokens-functie voor verwerking:

$Out_Str = Parse_Tokens($tokens);

En stuur een reactie:

Send_Out($user_id, $Out_Str);

de functie Send_Out is eenvoudig en ziet er als volgt uit:

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

Vaardigheidsscript voor Yandex.Alisa

Laten we nu verder gaan met het script voor Alice, het is bijna hetzelfde als voor Telegram.

We koppelen ook de bibliotheek waar berichten van de bot en Alice worden verwerkt, plus een bibliotheek met klassen voor Alice:

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

Wij ontvangen gegevens:

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

De gegevens ontleden in variabelen:

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

Er zijn hier een paar minder variabelen:

$tokens - hier zijn nu alle woorden die de gebruiker heeft ingevoerd

$user_id - gebruikers-ID hier

Yandex pingt constant gepubliceerde vaardigheden en ik heb een regel toegevoegd om het script onmiddellijk te verlaten zonder de volledige verwerking van het bericht te starten:

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

We noemen de Parse_Tokens-functie voor verwerking, het is hetzelfde als voor Telegram:

$Out_Str = Parse_Tokens($tokens);

En stuur een reactie:

Send_Out($user_id, $Out_Str);

De functie Send_Out is hier ingewikkelder:

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 script voor Alice afgemaakt.

Het verwerkingsscript Parse_Tokens zelf is puur als voorbeeld gemaakt, u kunt daar alle controles en verwerkingen uitvoeren.

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

Als u moet communiceren met een gebruiker met een complexere vorm dan een vraag-antwoord, dan moet u de $user_id van de gebruiker en de gegevens die al van de gebruiker zijn ontvangen in de database opslaan (bijvoorbeeld mysql) en deze analyseren in de Parse_Tokens-functie.

Dit is eigenlijk bijna alles, als alles correct is gedaan, is de Telegram-bot al beschikbaar, de vaardigheid van Alice kan worden gecontroleerd dialogen.yandex.ru/developerdoor naar je nieuwe vaardigheid te gaan op het testtabblad.

Yandex.Alisa en Telegram bot in PHP met dezelfde functionaliteit

Als alles correct werkt, kun je de vaardigheid voor moderatie verzenden door op de knop "Voor moderatie" te klikken.

Nu heb je twee bots voor verschillende platforms tegelijk, die op dezelfde manier werken.

Documentatie voor de Yandex.Dialogues-service hier

Volledige scripts gepost op github скачать.

Bron: www.habr.com

Voeg een reactie