Yandex.Alisa è Telegram bot in PHP cù a listessa funziunalità

Bona bbch.

Ci sò assai articuli nantu à u tema di i bots di Telegram, ma pocu persone scrivenu nantu à e cumpetenze per Alice, è ùn aghju micca truvatu nisuna infurmazione nantu à cumu fà un bot unicu, cusì aghju decisu di sparte a mo sperienza nantu à cumu fà un simplice Telegram bot è a cumpetenza Yandex.Alice per u situ chì hà a listessa funziunalità.

Dunque, ùn vi dicu micca cumu fà crià un servitore web è uttene un certificatu ssl, abbastanza hè statu scrittu annantu à questu.

Crià un bot di Telegram

Prima, creemu un bot di Telegram, per questu andemu à Telegram è truvamu u bot BotFather quì.

Yandex.Alisa è Telegram bot in PHP cù a listessa funziunalità

Yandex.Alisa è Telegram bot in PHP cù a listessa funziunalità

Sceglite /newbot

Yandex.Alisa è Telegram bot in PHP cù a listessa funziunalità

Insememu u nome di u bot da quale risponde, dopu entremu u nome di u bot, in risposta avemu un token per cuntrullà u bot, scrivemu sta chjave, serà utile per noi in u futuru.

Yandex.Alisa è Telegram bot in PHP cù a listessa funziunalità

U prossimu passu hè di dì à i servitori di Telegram à quale servitore invià e dati da u bot. Per fà questu, facemu un ligame di a forma:

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

___TOKEN___ rimpiazzamu cù u nostru token da u bot, ricevutu prima

____PATH_TO_SCRIPT____ rimpiazzamu cù l'indirizzu di u script in u nostru servitore induve i dati seranu trattati (per esempiu, www.my_server.ru/webhook_telegram.php).

Ci hè un prublema quì, u servitore api.telegram.org hè in bluccatu, ma pudete fà questu: affittu u servitore più prezzu induve ùn ci hè micca restrizioni è dà u cumandimu da a cunsola di stu servitore.

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

Hè cusì, u bot Telegram hè creatu è cunnessu à u vostru servitore.

Crià una cumpetenza per Yandex.Alisa

Passemu à creà una cumpetenza per Yandex.Alice.

Per creà una cumpetenza, avete bisognu à andà à a pagina di sviluppatori Yandex.Dialogues Pagina di sviluppatore Yandex.Dialogs, cliccate quì "Crea dialogu" è selezziunate "Skill in Alice".

Yandex.Alisa è Telegram bot in PHP cù a listessa funziunalità

U dialogu di paràmetri di cumpetenze si apre.

Yandex.Alisa è Telegram bot in PHP cù a listessa funziunalità

Cuminciamu à entre in i paràmetri di cumpetenze.

Inserite u nome di a vostra abilità.

Yandex.Alisa è Telegram bot in PHP cù a listessa funziunalità

U nome di attivazione deve esse sceltu assai cun cura per chì Alice capisce bè, da i sfumature - una applicazione mobile cù Alice è culonni cum'è Yandex.Station o Irbis A ponu percive e parolle in modu diversu.

Entremu in u percorsu à u script in u nostru servitore in u listessu modu per Telegram, ma serà un script specificamente per Alice, per esempiu. www.my_server.ru/webhook_alice.php.

Yandex.Alisa è Telegram bot in PHP cù a listessa funziunalità

Scegliemu a voce cù quale l'abilità di parlà, mi piace più a voce d'Alice.

Yandex.Alisa è Telegram bot in PHP cù a listessa funziunalità

Se pensa à travaglià solu in i dispositi mobili o in un navigatore, selezziunate "Avete bisognu di un dispositivu cù una pantalla".

Dopu, entre in i paràmetri per u catalogu di cumpetenze di Alice. Se pensa à utilizà a parolla "marca" per l'attivazione, avete bisognu di verificà u situ web di a marca in u serviziu webmaster.yandex.ru.

Yandex.Alisa è Telegram bot in PHP cù a listessa funziunalità

Hè tuttu cù i paràmetri, andemu à i scripts.

Scrittura di telegram bot

Cuminciamu cù un script per Telegram.

Cunnetteremu a biblioteca induve i missaghji da u bot è Alice seranu processati:

include_once 'webhook_parse.php';

Avemu stabilitu u token di u nostru bot:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Ricevemu dati:

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

Analisi di i dati in variabili:

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

Avà pudete travaglià cù variàbili:

$tokens - quì sò avà tutte e parolle chì l'utilizatore hà intrutu

$user_id - ID d'utilizatore quì

$msg_chat_id - chat in quale u bot hà ricevutu u cumandamentu

$msg_user_name - nome d'utilizatore

Dopu, chjamemu a funzione Parse_Tokens per u processu:

$Out_Str = Parse_Tokens($tokens);

È mandate una risposta:

Send_Out($user_id, $Out_Str);

a funzione Send_Out hè simplice è pare cusì:

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

Avà andemu à u script per Alice, hè guasi listessa per Telegram.

Cunnetteremu ancu a biblioteca induve i missaghji da u bot è Alice seranu processati, più una biblioteca cù classi per Alice:

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

Ricevemu dati:

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

Analisi di i dati in variabili:

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

Ci sò uni pochi di variabili quì:

$tokens - quì sò avà tutte e parolle chì l'utilizatore hà intrutu

$user_id - ID d'utilizatore quì

Yandex ping constantemente e cumpetenze publicate, è aghju aghjustatu una linea per esce immediatamente da u script senza avè principiatu u prucessu tutale di u missaghju:

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

Chjamemu a funzione Parse_Tokens per u processu, hè listessa per Telegram:

$Out_Str = Parse_Tokens($tokens);

È mandate una risposta:

Send_Out($user_id, $Out_Str);

A funzione Send_Out hè più cumplicata quì:

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

Finitu u script per Alice.

U script di trasfurmazioni Parse_Tokens stessu hè statu fattu solu per un esempiu, pudete fà qualsiasi cuntrolli è trasfurmazioni quì.

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

Sè avete bisognu di cumunicà cù un utilizatore di una forma più cumplessa di una quistione-risposta, allora avete bisognu di salvà $user_id di l'utilizatore è e dati digià ricevutu da l'utilizatore in a basa di dati (per esempiu, mysql) è analizà in a funzione Parse_Tokens.

In realtà, questu hè quasi tuttu, se tuttu hè fattu bè, allora u bot Telegram hè digià dispunibule, l'abilità di Alice pò esse verificata. dialogs.yandex.ru/developerandendu à a vostra nova cumpetenza nantu à a tabulazione di prova.

Yandex.Alisa è Telegram bot in PHP cù a listessa funziunalità

Se tuttu funziona bè, pudete mandà l'abilità per a moderazione clicchendu u buttone "Per a moderazione".

Avà avete dui bots per diverse plataforme à una volta, chì travaglianu in u listessu modu.

Documentazione per u serviziu Yandex.Dialogues ccà

Scripts cumpleti publicati nantu à github скачать.

Source: www.habr.com

Add a comment