Yandex.Alice și Telegram bot în PHP cu funcționalitate comună

Bună ziua.

Există o mulțime de articole pe tema roboților Telegram, dar puțini oameni scriu despre abilități pentru Alice și nu am găsit nicio informație despre cum să creez un singur bot, așa că am decis să împărtășesc experiența mea despre cum să creez un singur bot. bot simplu Telegram și o abilitate Yandex.Alice pentru site-ul având aceeași funcționalitate.

Deci, nu vă voi spune cum să configurați un server web și să obțineți un certificat SSL; s-a scris destul despre asta.

Crearea unui bot Telegram

Mai întâi, să creăm un bot Telegram. Pentru a face acest lucru, accesați Telegram și găsiți botul BotFather acolo.

Yandex.Alice și Telegram bot în PHP cu funcționalitate comună

Yandex.Alice și Telegram bot în PHP cu funcționalitate comună

Selectați /newbot

Yandex.Alice și Telegram bot în PHP cu funcționalitate comună

Introducem numele botului prin care va raspunde, apoi introducem numele botului, ca raspuns primim un token pentru controlul botului, notam aceasta cheie, ne va fi de folos pe viitor.

Yandex.Alice și Telegram bot în PHP cu funcționalitate comună

Următorul pas este să spuneți serverelor Telegram către ce server să trimită datele de la bot. Pentru a face acest lucru, facem un link de genul:

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

___TOKEN___ este înlocuit cu jetonul nostru de la botul primit mai devreme

____PATH_TO_SCRPIT___ este înlocuită cu adresa script-ului de pe serverul nostru unde vor fi procesate datele (de exemplu, www.my_server.ru/webhook_telegram.php).

Aici este o problemă, serverul api.telegram.org este blocat, dar puteți face acest lucru: închiriați cel mai ieftin server unde nu există restricții și lansați o comandă din consola acestui server

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

Gata, botul Telegram a fost creat și conectat la serverul tău.

Crearea unei aptitudini pentru Yandex.Alice

Să trecem la crearea unei abilități pentru Yandex.Alice.

Pentru a crea o abilitate, trebuie să accesați pagina pentru dezvoltatori Yandex.Dialogs Pagina pentru dezvoltatori Yandex.Dialogues, faceți clic pe „Creare dialog” acolo și selectați „Skill in Alice”.

Yandex.Alice și Telegram bot în PHP cu funcționalitate comună

Se va deschide caseta de dialog pentru setările abilităților.

Yandex.Alice și Telegram bot în PHP cu funcționalitate comună

Începem să introducem setările de abilități.

Introduceți numele aptitudinii dvs.

Yandex.Alice și Telegram bot în PHP cu funcționalitate comună

Numele de activare trebuie selectat cu mare atenție, astfel încât Alice să-l înțeleagă corect, din nuanțe - o aplicație mobilă cu Alice și difuzoare precum Yandex.Station sau Irbis A pot percepe cuvintele diferit.

Introducem calea către script pe serverul nostru în același mod ca și pentru Telegram, dar acesta va fi un script special pentru Alice, de exemplu www.my_server.ru/webhook_alice.php.

Yandex.Alice și Telegram bot în PHP cu funcționalitate comună

Alegem vocea cu care va vorbi talentul; îmi place mai mult vocea lui Alice.

Yandex.Alice și Telegram bot în PHP cu funcționalitate comună

Dacă intenționați să lucrați numai pe dispozitive mobile sau într-un browser, atunci selectați „Solicitați un dispozitiv cu ecran”.

Apoi, introduceți setările pentru catalogul de abilități al lui Alice. Dacă intenționați să utilizați cuvântul „brand” pentru activare, trebuie să treceți prin verificarea site-ului web al mărcii în serviciul webmaster.yandex.ru.

Yandex.Alice și Telegram bot în PHP cu funcționalitate comună

Cu setările finalizate, să trecem la scripturi.

Scriptul bot Telegram

Să începem cu un script pentru Telegram.

Conectăm biblioteca în care vor fi procesate mesajele de la bot și Alice:

include_once 'webhook_parse.php';

Setați simbolul botului nostru:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Primim date:

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

Să analizăm datele în variabile:

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

Acum puteți lucra cu variabile:

$tokens - acum iată toate cuvintele pe care le-a introdus utilizatorul

$user_id - aici este ID-ul utilizatorului

$msg_chat_id — chat în care botul a primit comanda

$msg_user_name - nume de utilizator

Apoi, numim funcția Parse_Tokens pentru procesare:

$Out_Str = Parse_Tokens($tokens);

Și trimiteți răspunsul:

Send_Out($user_id, $Out_Str);

Funcția Send_Out este simplă și arată astfel:

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

Script de calificare pentru Yandex.Alice

Acum să trecem la scenariul pentru Alice, este aproape la fel ca pentru Telegram.

De asemenea, conectăm biblioteca în care vor fi procesate mesajele de la bot și Alice, plus o bibliotecă cu clase pentru Alice:

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

Primim date:

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

Să analizăm datele în variabile:

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

Există puțin mai puține variabile necesare aici:

$tokens - acum iată toate cuvintele pe care le-a introdus utilizatorul

$user_id - aici este ID-ul utilizatorului

Yandex dă ping în mod constant la abilitățile publicate și am adăugat o linie pentru a ieși imediat din script fără a începe procesarea completă a mesajului:

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

Numim funcția Parse_Tokens pentru procesare, este la fel ca și pentru Telegram:

$Out_Str = Parse_Tokens($tokens);

Și trimiteți răspunsul:

Send_Out($user_id, $Out_Str);

Funcția Send_Out este mai complicată aici:

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

Am terminat scenariul pentru Alice.

Scriptul de procesare Parse_Tokens în sine a fost realizat doar de exemplu; puteți face orice verificări și procesări acolo.

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

Dacă aveți nevoie de comunicare cu un utilizator de un tip mai complex decât întrebare-răspuns, atunci va trebui să salvați $user_id al utilizatorului și datele deja primite de la utilizator într-o bază de date (de exemplu, mysql) și să le analizați în Parse_Tokens funcţie.

De fapt, asta este aproape tot, dacă totul este făcut corect, atunci botul Telegram este deja disponibil, abilitățile lui Alice pot fi verificate dialogs.yandex.ru/developer, accesând fila de testare din noua dvs. abilitate.

Yandex.Alice și Telegram bot în PHP cu funcționalitate comună

Dacă totul funcționează corect, puteți trimite abilitățile pentru moderare făcând clic pe butonul „Pentru moderare”.

Acum aveți doi roboți pentru platforme diferite care funcționează în același mod.

Documentație pentru serviciul Yandex.Dialogs aici

Scripturile complete sunt postate pe github descărca.

Sursa: www.habr.com

Adauga un comentariu