Yandex.Alice și botul Telegram pe PHP cu funcționalitate unică

Bună ziua.

Despre boturile Telegram există foarte multe articole, dar puțini scriu despre abilitățile pentru Alice, iar informații despre cum să faci un bot unic nu am găsit deloc, așa că am decis să îmi împărtășesc experiența despre cum să creezi un bot simplu Telegram și o abilitate pentru Yandex.Alice pentru un site, având funcționalitate comună.

Deci, cum să ridici un server web și să obții certificat ssl nu voi povesti despre asta, s-au scris destule.

Crearea unui bot Telegram

Mai întâi, vom crea un bot Telegram, pentru aceasta mergem în Telegram și căutăm botul BotFather.

Yandex.Alice și botul Telegram pe PHP cu funcționalitate unică

Yandex.Alice și botul Telegram pe PHP cu funcționalitate unică

Alegem /newbot

Yandex.Alice și botul Telegram pe PHP cu funcționalitate unică

Introduci numele botului, la care va răspunde, apoi introduci numele botului și, în răspuns, primim un token pentru gestionarea botului, notăm acest cheie, ne va fi util mai departe.

Yandex.Alice și botul Telegram pe PHP cu funcționalitate unică

Pasul următor este să comunicăm serverelor Telegram pe ce server să trimită datele de la bot. Pentru asta facem un link de tip:

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

___TOKEN___ înlocuim cu tokenul nostru de la bot, obținut anterior

____PATH_TO_SCRIPT___ înlocuim cu adresa scriptului de pe serverul nostru, unde va avea loc procesarea datelor (de exemplu, www.my_server.ru/webhook_telegram.php).

Aici este o problemă, serverul api.telegram.org este sub blocaj, dar putem face așa: închiriem cel mai ieftin serverul unde nu sunt restricții și dăm din consola acestui server comanda

wget ___GET_ADDRESS___

Totul, botul Telegram a fost creat și asociat cu serverul.

Crearea unei abilități pentru Yandex.Alice

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

Pentru a crea o abilitate, trebuie să accesați pagina dezvoltatorilor Yandex.Dialogs pagina dezvoltatorilor Yandex.Dialogs, apăsați acolo „Creează dialog” și alegeți „Abilitate în Alice”.

Yandex.Alice și botul Telegram pe PHP cu funcționalitate unică

Se va deschide dialogul de setări ale abilității.

Yandex.Alice și botul Telegram pe PHP cu funcționalitate unică

Începem să introducem setările abilității.

Introduci numele abilității tale.

Yandex.Alice și botul Telegram pe PHP cu funcționalitate unică

Numele de activare trebuie ales cu foarte multă atenție, pentru ca Alice să îl înțeleagă corect, un aspect important – aplicația mobilă cu Alice și difuzoarele de tip Yandex.Station sau Irbis A pot percepe cuvintele diferit.

Introduci calea către scriptul de pe serverul nostru exact ca pentru Telegram, dar acesta va fi un script dedicat pentru Alice, de exemplu www.my_server.ru/webhook_alice.php.

Yandex.Alice și botul Telegram pe PHP cu funcționalitate unică

Alegem vocea cu care va vorbi abilitatea, mie îmi place mai mult vocea lui Alice.

Yandex.Alice și botul Telegram pe PHP cu funcționalitate unică

Dacă se planifică să funcționeze doar pe dispozitive mobile sau în browser, atunci alegem „Este nevoie de un dispozitiv cu ecran”.

Apoi introducem setările pentru catalogul abilităților Alisei. Dacă plănuiți să folosiți cuvântul - brand pentru activare, trebuie să treceți prin verificarea site-ului brandului în serviciul webmaster.yandex.ru.

Yandex.Alice și botul Telegram pe PHP cu funcționalitate unică

Cu setările e totul, trecem la scripturi.

Scriptul botului Telegram

Să începem cu scriptul pentru Telegram.

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

include_once 'webhook_parse.php';

Setăm tokenul botului nostru:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Primim datele:

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

Descompunem 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 putem lucra cu variabilele:

$tokens — aici sunt toate cuvintele pe care utilizatorul le-a introdus

$user_id — aici este id-ul utilizatorului

$msg_chat_id — chat-ul în care botul a primit comanda

$msg_user_name — numele utilizatorului

Apoi, apelăm funcția Parse_Tokens pentru procesare:

$Out_Str = Parse_Tokens($tokens);

Și trimitem 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);
}

 

Scriptul abilității pentru Yandex.Alice

Acum să trecem la scriptul pentru Alisa, care este aproape identic cu cel pentru Telegram.

De asemenea, conectăm biblioteca în care vor fi procesate mesajele de la bot și de la Alisa, plus biblioteca cu clasele pentru Alisa:

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

Primim datele:

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

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

Aici sunt puținele variabile necesare:

$tokens — aici sunt toate cuvintele pe care utilizatorul le-a introdus

$user_id — aici este id-ul utilizatorului

Yandex monitorizează constant abilitățile publicate, iar eu am adăugat o linie pentru a ieși imediat din script, fără a rula procesarea completă a mesajului:

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

Apelăm pentru procesare funcția Parse_Tokens, care este aceeași ca și pentru Telegram:

$Out_Str = Parse_Tokens($tokens);

Și trimitem răspunsul:

Send_Out($user_id, $Out_Str);

Funcția Send_Out aici este un pic mai complexă:

function Send_Out($user_id, $out_text, $out_tts = "", $is_end = false)
{
  global $data_msg_sess_id, $user_id;

  ////////// GENERAȚI BAZA DE IEȘIRE //////////
    $Data_Out = new Alice_Data_Out();
    $Data_Out->response = new Alice_Response();
    $Data_Out->session = new Alice_Session();
  ////////// GENERAȚI BAZA DE IEȘIRE End //////////

  ////////// GENERAȚI MESAJUL DE IEȘIRE //////////
  $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();
}

Am terminat scriptul pentru Alice.

Scriptul de procesare Parse_Tokens a fost creat doar ca exemplu; veți putea face orice verificări și procesări acolo.

function Parse_Tokens($tokens)
{
  $out = "";
  // facți ceva cu tokenii //
  $out =  "Ați introdus " . count($tokens) . " cuvinte: " . implode($tokens, " ");
  return $out;
}

Dacă aveți nevoie de interacțiuni mai complexe cu utilizatorul decât o întrebare-răspuns, va trebui să salvați în baza de date (de exemplu, mysql) $user_id al utilizatorului și datele deja primite de la utilizator și să le analizați în funcția Parse_Tokens.

Aceasta este aproape tot, dacă totul a fost realizat corect, botul Telegram este deja disponibil, abilitățile Alice pot fi verificate dialogs.yandex.ru/developer, trecând la noua dvs. abilitate în tab-ul de testare.

Yandex.Alice și botul Telegram pe PHP cu funcționalitate unică

Dacă totul funcționează corect, puteți trimite abilitatea la moderare, apăsând butonul „Pentru moderare”.

Acum aveți două boți pentru platforme diferite, care funcționează în mod identic.

Documentația pentru serviciul Yandex.Dialogs aici

Scripturile complete sunt disponibile pe github descărcați.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster