Yandex.Alisa og Telegram bot i PHP med samme funksjonalitet

God dag.

Det er mange artikler om temaet Telegram-roboter, men få mennesker skriver om ferdigheter for Alice, og jeg fant ingen informasjon om hvordan man lager en enkelt bot, så jeg bestemte meg for å dele min erfaring om hvordan man lager en enkel Telegram-bot og Yandex.Alice-ferdigheten for nettstedet som har samme funksjonalitet.

Så jeg vil ikke fortelle deg hvordan du kan øke en webserver og få et ssl-sertifikat, det er skrevet nok om det.

Opprette en Telegram-bot

Først, la oss lage en Telegram-bot, for dette går vi til Telegram og finner BotFather-boten der.

Yandex.Alisa og Telegram bot i PHP med samme funksjonalitet

Yandex.Alisa og Telegram bot i PHP med samme funksjonalitet

Velg /newbot

Yandex.Alisa og Telegram bot i PHP med samme funksjonalitet

Vi skriver inn navnet på boten som den vil svare på, så skriver vi inn navnet på boten, som svar får vi et token for å kontrollere boten, vi skriver ned denne nøkkelen, den vil være nyttig for oss i fremtiden.

Yandex.Alisa og Telegram bot i PHP med samme funksjonalitet

Det neste trinnet er å fortelle Telegram-serverne hvilken server de skal sende data fra boten til. For å gjøre dette lager vi en lenke til skjemaet:

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

___TOKEN___ erstatter vi med vårt token fra boten, mottatt tidligere

____PATH_TO_SCRIPT____ erstatter vi med adressen til skriptet på serveren vår der dataene skal behandles (f.eks. www.my_server.ru/webhook_telegram.php).

Det er et problem her, api.telegram.org-serveren er under blokkering, men du kan gjøre dette: leie den billigste serveren der det ikke er noen begrensninger og gi kommandoen fra konsollen til denne serveren

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

Det er det, Telegram-boten er opprettet og koblet til serveren din.

Opprette en ferdighet for Yandex.Alisa

La oss gå videre til å lage en ferdighet for Yandex.Alice.

For å lage en ferdighet, må du gå til Yandex.Dialogues-utviklersiden Yandex.Dialogs utviklerside, klikk der "Create dialogue" og velg "Skill in Alice".

Yandex.Alisa og Telegram bot i PHP med samme funksjonalitet

Dialogboksen for ferdighetsinnstillinger åpnes.

Yandex.Alisa og Telegram bot i PHP med samme funksjonalitet

Vi begynner å gå inn i ferdighetsinnstillingene.

Skriv inn navnet på ferdigheten din.

Yandex.Alisa og Telegram bot i PHP med samme funksjonalitet

Aktiveringsnavnet bør velges veldig nøye slik at Alice forstår det riktig, fra nyansene - en mobilapplikasjon med Alice og kolonner som Yandex.Station eller Irbis A kan oppfatte ord annerledes.

Vi legger inn stien til scriptet på serveren vår på samme måte som for Telegram, men det vil være et script spesielt for Alice, for eksempel www.my_server.ru/webhook_alice.php.

Yandex.Alisa og Telegram bot i PHP med samme funksjonalitet

Vi velger stemmen som ferdigheten skal snakke med, jeg liker Alices stemme mer.

Yandex.Alisa og Telegram bot i PHP med samme funksjonalitet

Hvis du planlegger å jobbe bare på mobile enheter eller i en nettleser, velger du «Du trenger en enhet med skjerm».

Deretter skriver du inn innstillingene for Alices ferdighetskatalog. Hvis du planlegger å bruke ordet "merke" for aktivering, må du bekrefte merkevarenettstedet i webmaster.yandex.ru-tjenesten.

Yandex.Alisa og Telegram bot i PHP med samme funksjonalitet

Det er alt med innstillingene, la oss gå videre til skriptene.

Telegram bot-skript

La oss starte med et manus til Telegram.

Vi kobler til biblioteket der meldinger fra boten og Alice vil bli behandlet:

include_once 'webhook_parse.php';

Vi setter tokenet til boten vår:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Vi mottar data:

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

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

Nå kan du jobbe med variabler:

$tokens - her er nå alle ordene som brukeren skrev inn

$user_id - bruker-ID her

$msg_chat_id - chat der boten mottok kommandoen

$msg_user_name - brukernavn

Deretter kaller vi Parse_Tokens-funksjonen for behandling:

$Out_Str = Parse_Tokens($tokens);

Og send et svar:

Send_Out($user_id, $Out_Str);

Send_Out-funksjonen er enkel og ser slik ut:

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.Alisa

La oss nå gå videre til manuset til Alice, det er nesten det samme som for Telegram.

Vi kobler også til biblioteket der meldinger fra boten og Alice vil bli behandlet, pluss et bibliotek med klasser for Alice:

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

Vi mottar data:

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

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

Det er noen færre variabler her:

$tokens - her er nå alle ordene som brukeren skrev inn

$user_id - bruker-ID her

Yandex pinger konstant publiserte ferdigheter, og jeg la til en linje for å avslutte skriptet umiddelbart uten å starte full behandling av meldingen:

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

Vi kaller Parse_Tokens-funksjonen for 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-funksjonen er mer komplisert 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();
}

Fullførte manuset til Alice.

Selve Parse_Tokens-behandlingsskriptet ble laget kun for et eksempel, du kan gjøre alle kontroller og prosessering der.

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

Hvis du trenger å kommunisere med en bruker i en mer kompleks form enn et spørsmål-svar, må du lagre $user_id til brukeren og dataene som allerede er mottatt fra brukeren i databasen (for eksempel mysql) og analysere dem i funksjonen Parse_Tokens.

Faktisk er dette nesten alt, hvis alt er gjort riktig, så er Telegram-boten allerede tilgjengelig, Alices ferdigheter kan sjekkes dialogs.yandex.ru/utviklerved å gå til den nye ferdigheten din på testfanen.

Yandex.Alisa og Telegram bot i PHP med samme funksjonalitet

Hvis alt fungerer som det skal, kan du sende ferdigheten til moderering ved å klikke på knappen "For moderering".

Nå har du to roboter for forskjellige plattformer samtidig, som fungerer på samme måte.

Dokumentasjon for Yandex.Dialogues-tjenesten her

Fullstendige skript lagt ut på github скачать.

Kilde: www.habr.com

Legg til en kommentar