Yandex.Alice og Telegram-bot på PHP med fælles funktionalitet

Goddag.

Der er mange artikler om Telegram-bots, men der er ikke meget skrevet om færdigheder til Alice, og jeg har slet ikke fundet information om, hvordan man laver en samlet bot. Derfor vil jeg dele min erfaring om, hvordan man laver en simpel Telegram-bot og en færdighed til Yandex.Alice til en hjemmeside, der har en fælles funktion.

Så, hvordan man opsætter en webserver og får ssl-certifikat vil jeg ikke fortælle om, der er skrevet rigeligt om dette.

Oprettelse af en Telegram-bot

Først skal vi oprette en Telegram-bot, til dette går vi ind i Telegram og finder botten BotFather.

Yandex.Alice og Telegram-bot på PHP med fælles funktionalitet

Yandex.Alice og Telegram-bot på PHP med fælles funktionalitet

Vælger /newbot

Yandex.Alice og Telegram-bot på PHP med fælles funktionalitet

Indtast navnet på botten, som den skal reagerer på, indtast derefter botens brugernavn, og i svar får vi en token til at styre botten, vi noterer denne nøgle, da den vil være nyttig for os senere.

Yandex.Alice og Telegram-bot på PHP med fælles funktionalitet

Næste skridt er at informere Telegram-serverne om, hvilken server de skal sende data fra botten til. For dette laver vi et link som:

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

___TOKEN___ erstattes med vores token for botten, modtaget tidligere

____STI_TIL_SCRIPTET___ erstattes med adressen på scriptet på vores server, hvor databehandlingen vil finde sted (for eksempel www.my_server.ru/webhook_telegram.php).

Her er der et problem, serveren api.telegram.org er blokeret, men man kan gøre det sådan: leje den billigste server hvor der ikke er nogen begrænsninger og give kommandoen fra konsollen på denne server

wget ___MODTAGEN_ADRESSE___

Alt, Telegram-botten er oprettet og knyttet til dit serveren.

Oprettelse af en færdighed til Yandex.Alice

Lad os gå videre til oprettelse af en færdighed til Yandex.Alice.

For at oprette en færdighed skal du gå til Yandex.Dialoger udviklerside Yandex.Dialoger udviklerside, klik på 'Opret dialog' og vælg 'Færdighed i Alice'.

Yandex.Alice og Telegram-bot på PHP med fælles funktionalitet

Indstillingerne for færdigheden åbnes.

Yandex.Alice og Telegram-bot på PHP med fælles funktionalitet

Vi begynder at indtaste indstillingerne for færdigheden.

Indtast navnet på din færdighed.

Yandex.Alice og Telegram-bot på PHP med fælles funktionalitet

Det aktiverende navn skal vælges meget omhyggeligt, så Alice korrekt forstår det, med nuancer - mobilapplikationen med Alice og højttalere som Yandex.Station eller Irbis A kan opfatte ord forskelligt.

Indtast stien til scriptet på vores server ligesom for Telegram, men dette vil være et script specifikt for Alice, for eksempel www.my_server.ru/webhook_alice.php.

Yandex.Alice og Telegram-bot på PHP med fælles funktionalitet

Vælg den stemme, som færdigheden skal tale med; jeg foretrækker faktisk Alices stemme.

Yandex.Alice og Telegram-bot på PHP med fælles funktionalitet

Hvis der kun planlægges arbejde på mobile enheder eller i browseren, så vælg 'Behøver en enhed med skærm'.

Here we enter the settings for Alice's skill catalog. If you plan to use a brand name for activation, you need to validate the brand's website at webmaster.yandex.ru.

Yandex.Alice og Telegram-bot på PHP med fælles funktionalitet

All settings are done, let's move on to the scripts.

Telegram bot script

Let's start with the script for Telegram.

We connect the library that will handle messages from the bot and Alice:

include_once 'webhook_parse.php';

We set the token for our bot:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

We receive the data:

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

We parse the data into variables:

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

Now we can work with the variables:

$tokens — here are all the words the user entered

$user_id — here is the user's id

$msg_chat_id — the chat in which the bot received the command

$msg_user_name — the user's first name

Next, we call the function Parse_Tokens for processing:

$Out_Str = Parse_Tokens($tokens);

And send the response:

Send_Out($user_id, $Out_Str);

The Send_Out function is simple and looks like this:

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 for Yandex.Alice

Now let's move on to the script for Alice, which is almost the same as for Telegram.

We also connect the library that will handle messages from the bot and Alice, plus the library with classes for Alice:

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

We receive the data:

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

We parse the data into variables:

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

Her er der lidt færre nødvendige variabler:

$tokens — here are all the words the user entered

$user_id — here is the user's id

Yandex pinger konstant de offentliggjorte færdigheder, og jeg har tilføjet en linje til straks at forlade scriptet uden at køre den samlede behandling af beskeden:

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

Vi kalder funktionen Parse_Tokens til behandling; den er den samme som til Telegram:

$Out_Str = Parse_Tokens($tokens);

And send the response:

Send_Out($user_id, $Out_Str);

Funktionen Send_Out er lidt mere kompleks 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) 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();
}

Vi har afsluttet scriptet til Alisa.

Den faktiske token behandlingsscript Parse_Tokens er lavet udelukkende som eksempel; du kan lave enhver kontrol og behandling der.

function Parse_Tokens($tokens)
{
  $out = "";
  // do something with tokens //
  $out =  "Du har indtastet " . count($tokens) . " ord: " . implode($tokens, " ");
  return $out;
}

Hvis du har brug for mere kompleks kommunikation med brugeren end spørgsmål-svar, skal du gemme $user_id for brugeren og allerede indsamlede data fra brugeren i databasen (f.eks. MySQL) og analysere dem i funktionen Parse_Tokens.

Det er stort set det hele; hvis alt er gjort korrekt, er Telegram-boten allerede tilgængelig, og Alisa-færdigheden kan testes. dialogs.yandex.ru/developer, ved at gå til din nye færdighed under fanen testning.

Yandex.Alice og Telegram-bot på PHP med fælles funktionalitet

Hvis alt fungerer korrekt, kan du sende færdigheden til moderation ved at trykke på knappen "Til moderation".

Nu har du to bots til forskellige platforme, der fungerer ens.

Dokumentation til Yandex.Dialogs servicen her

De komplette scripts er offentliggjort på GitHub downloade.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster