Yandex.Alisa og Telegram bot i PHP med samme funktionalitet

Goddag.

Der er mange artikler om emnet Telegram-bots, men få mennesker skriver om færdigheder til Alice, og jeg fandt ingen information om, hvordan man laver en enkelt bot, så jeg besluttede at dele min erfaring med, hvordan man laver en simpel Telegram-bot og Yandex.Alice-færdigheden for webstedet med samme funktionalitet.

Så jeg vil ikke fortælle dig, hvordan du rejser en webserver og får et ssl-certifikat, der er skrevet nok om det.

Oprettelse af en Telegram-bot

Lad os først oprette en Telegram-bot, til dette går vi til Telegram og finder BotFather-boten der.

Yandex.Alisa og Telegram bot i PHP med samme funktionalitet

Yandex.Alisa og Telegram bot i PHP med samme funktionalitet

Vælg /newbot

Yandex.Alisa og Telegram bot i PHP med samme funktionalitet

Vi indtaster navnet på den bot, som den vil svare på, så indtaster vi navnet på botten, som svar får vi et token til at styre botten, vi skriver denne nøgle ned, det vil være nyttigt for os i fremtiden.

Yandex.Alisa og Telegram bot i PHP med samme funktionalitet

Det næste trin er at fortælle Telegram-serverne, hvilken server de skal sende data fra botten til. For at gøre dette laver vi et link til formularen:

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

___TOKEN___ erstatter vi med vores token fra botten, modtaget tidligere

____PATH_TO_SCRIPT____ erstatter vi med adressen på scriptet på vores server, hvor dataene vil blive behandlet (f.eks. www.my_server.ru/webhook_telegram.php).

Der er et problem her, api.telegram.org-serveren er under blokering, men du kan gøre dette: Lej den billigste server, hvor der ikke er nogen begrænsninger, og giv kommandoen fra konsollen på denne server

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

Det er det, Telegram-botten er oprettet og forbundet til din server.

Oprettelse af en færdighed til Yandex.Alisa

Lad os gå videre til at skabe en færdighed til Yandex.Alice.

For at oprette en færdighed skal du gå til Yandex.Dialogues-udviklersiden Yandex.Dialogs udviklerside, klik der "Create dialogue" og vælg "Skill in Alice".

Yandex.Alisa og Telegram bot i PHP med samme funktionalitet

Dialogboksen for færdighedsindstillinger åbnes.

Yandex.Alisa og Telegram bot i PHP med samme funktionalitet

Vi begynder at indtaste færdighedsindstillingerne.

Indtast navnet på din færdighed.

Yandex.Alisa og Telegram bot i PHP med samme funktionalitet

Aktiveringsnavnet skal vælges meget omhyggeligt, så Alice forstår det korrekt, ud fra nuancerne - en mobilapplikation med Alice og kolonner som Yandex.Station eller Irbis A kan opfatte ord forskelligt.

Vi indtaster stien til scriptet på vores server på samme måde som for Telegram, men det vil være et script specifikt til Alice f.eks. www.my_server.ru/webhook_alice.php.

Yandex.Alisa og Telegram bot i PHP med samme funktionalitet

Vi vælger den stemme, som færdigheden vil tale med, jeg kan bedre lide Alices stemme.

Yandex.Alisa og Telegram bot i PHP med samme funktionalitet

Hvis du planlægger kun at arbejde på mobile enheder eller i en browser, skal du vælge "Du skal bruge en enhed med en skærm."

Indtast derefter indstillingerne for Alices færdighedskatalog. Hvis du planlægger at bruge ordet "brand" til aktivering, skal du bekræfte brandets websted i webmaster.yandex.ru-tjenesten.

Yandex.Alisa og Telegram bot i PHP med samme funktionalitet

Det er alt med indstillingerne, lad os gå videre til scripts.

Telegram bot script

Lad os starte med et manuskript til Telegram.

Vi forbinder biblioteket, hvor beskeder fra botten og Alice vil blive behandlet:

include_once 'webhook_parse.php';

Vi sætter tokenet for vores bot:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Vi modtager data:

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

Parsing af data i variabler:

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 kan du arbejde med variabler:

$tokens - her er nu alle de ord, som brugeren har indtastet

$user_id - bruger-id her

$msg_chat_id - chat, hvor botten modtog kommandoen

$msg_user_name - brugernavn

Dernæst kalder vi Parse_Tokens-funktionen til behandling:

$Out_Str = Parse_Tokens($tokens);

Og send et svar:

Send_Out($user_id, $Out_Str);

Send_Out-funktionen er enkel og ser sådan ud:

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 script til Yandex.Alisa

Lad os nu gå videre til manuskriptet til Alice, det er næsten det samme som for Telegram.

Vi forbinder også biblioteket, hvor beskeder fra botten og Alice vil blive behandlet, plus et bibliotek med klasser for Alice:

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

Vi modtager data:

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

Parsing af data i variabler:

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

Der er et par færre variabler her:

$tokens - her er nu alle de ord, som brugeren har indtastet

$user_id - bruger-id her

Yandex pinger konstant offentliggjorte færdigheder, og jeg tilføjede en linje for straks at afslutte scriptet uden at starte den fulde behandling af beskeden:

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

Vi kalder Parse_Tokens-funktionen til behandling, den er den samme som for Telegram:

$Out_Str = Parse_Tokens($tokens);

Og send et svar:

Send_Out($user_id, $Out_Str);

Send_Out-funktionen er mere kompliceret her:

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

Fuldførte manuskriptet til Alice.

Selve Parse_Tokens-behandlingsscriptet blev lavet udelukkende for et eksempel, du kan foretage enhver kontrol og behandling der.

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

Hvis du har brug for at kommunikere med en bruger af en mere kompleks form end et spørgsmål-svar, så skal du gemme brugerens $user_id og de data, der allerede er modtaget fra brugeren i databasen (f.eks. mysql) og analysere dem i funktionen Parse_Tokens.

Faktisk er dette næsten alt, hvis alt er gjort korrekt, så er Telegram-bot allerede tilgængelig, Alices færdigheder kan kontrolleres dialogs.yandex.ru/developerved at gå til din nye færdighed på testfanen.

Yandex.Alisa og Telegram bot i PHP med samme funktionalitet

Hvis alt fungerer korrekt, kan du sende færdigheden til moderering ved at klikke på knappen "For moderering".

Nu har du to bots til forskellige platforme på én gang, som fungerer på samme måde.

Dokumentation til Yandex.Dialogues-tjenesten her

Fuld scripts udgivet på github скачать.

Kilde: www.habr.com

Tilføj en kommentar