„Yandex.Alisa“ ir „Telegram“ robotas PHP su ta pačia funkcija

Laba diena.

Yra daug straipsnių Telegram botų tema, tačiau mažai kas rašo apie Alice įgūdžius, o aš neradau jokios informacijos, kaip sukurti vieną botą, todėl nusprendžiau pasidalinti savo patirtimi, kaip sukurti paprastas „Telegram“ robotas ir „Yandex.Alice“ įgūdis, skirtas svetainei, turinčiai tas pačias funkcijas.

Taigi, nepasakosiu, kaip pakelti žiniatinklio serverį ir gauti ssl sertifikatą, apie tai jau pakankamai parašyta.

„Telegram“ roboto kūrimas

Pirmiausia sukurkime „Telegram“ robotą, tam einame į „Telegram“ ir ten randame „BotFather“ robotą.

„Yandex.Alisa“ ir „Telegram“ robotas PHP su ta pačia funkcija

„Yandex.Alisa“ ir „Telegram“ robotas PHP su ta pačia funkcija

Pasirinkite /newbot

„Yandex.Alisa“ ir „Telegram“ robotas PHP su ta pačia funkcija

Įvedame boto pavadinimą, kuriuo jis atsakys, tada įvedame boto pavadinimą, atsakydami gauname žetoną botui valdyti, užsirašome šį raktą, jis mums pravers ateityje.

„Yandex.Alisa“ ir „Telegram“ robotas PHP su ta pačia funkcija

Kitas žingsnis yra nurodyti Telegram serveriams, į kurį serverį siųsti duomenis iš roboto. Norėdami tai padaryti, sukuriame formos nuorodą:

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

___TOKEN___ pakeičiame savo žetonu iš roboto, gautu anksčiau

____PATH_TO_SCRIPT____ pakeičiame scenarijaus adresu mūsų serveryje, kuriame bus tvarkomi duomenys (pvz., www.my_server.ru/webhook_telegram.php).

Čia yra problema, api.telegram.org serveris blokuojamas, bet jūs galite tai padaryti: išsinuomokite pigiausią serverį, kuriame nėra jokių apribojimų, ir duokite komandą iš šio serverio konsolės

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

Tai viskas, „Telegram“ robotas yra sukurtas ir prijungtas prie jūsų serverio.

Yandex.Alisa įgūdžių kūrimas

Pereikime prie „Yandex.Alice“ įgūdžių kūrimo.

Norėdami sukurti įgūdžius, turite eiti į „Yandex.Dialogues“ kūrėjų puslapį „Yandex.Dialogs“ kūrėjo puslapis, spustelėkite „Sukurti dialogą“ ir pasirinkite „Įgūdžiai Alisoje“.

„Yandex.Alisa“ ir „Telegram“ robotas PHP su ta pačia funkcija

Atsidarys įgūdžių nustatymų dialogo langas.

„Yandex.Alisa“ ir „Telegram“ robotas PHP su ta pačia funkcija

Pradedame įvesti įgūdžių nustatymus.

Įveskite savo įgūdžių pavadinimą.

„Yandex.Alisa“ ir „Telegram“ robotas PHP su ta pačia funkcija

Aktyvinimo pavadinimą reikėtų rinktis labai atsargiai, kad Alisa jį suprastų teisingai, iš niuansų – mobilioji aplikacija su Alisa ir tokiais stulpeliais kaip „Yandex.Station“ ar „Irbis A“ žodžius gali suvokti skirtingai.

Mes įvedame kelią į scenarijų savo serveryje taip pat kaip ir Telegram, bet tai bus specialiai Alice skirtas scenarijus, pvz. www.my_server.ru/webhook_alice.php.

„Yandex.Alisa“ ir „Telegram“ robotas PHP su ta pačia funkcija

Mes pasirenkame balsą, kuriuo kalbės įgūdis, man labiau patinka Alisos balsas.

„Yandex.Alisa“ ir „Telegram“ robotas PHP su ta pačia funkcija

Jei planuojate dirbti tik mobiliuosiuose įrenginiuose arba naršyklėje, pasirinkite „Jums reikia įrenginio su ekranu“.

Tada įveskite Alisos įgūdžių katalogo nustatymus. Jei ketinate naudoti žodį „prekės ženklas“ aktyvindami, turite patikrinti prekės ženklo svetainę svetainėje webmaster.yandex.ru.

„Yandex.Alisa“ ir „Telegram“ robotas PHP su ta pačia funkcija

Tai viskas su nustatymais, pereikime prie scenarijų.

Telegramos roboto scenarijus

Pradėkime nuo „Telegram“ scenarijaus.

Sujungiame biblioteką, kurioje bus apdorojami boto ir Alisos pranešimai:

include_once 'webhook_parse.php';

Nustatėme savo boto žetoną:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Duomenis gauname:

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

Duomenų analizavimas į kintamuosius:

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

Dabar galite dirbti su kintamaisiais:

$tokens – čia yra visi vartotojo įvesti žodžiai

$user_id – vartotojo ID čia

$msg_chat_id – pokalbis, kuriame robotas gavo komandą

$msg_user_name – vartotojo vardas

Tada iškviečiame funkciją Parse_Tokens apdorojimui:

$Out_Str = Parse_Tokens($tokens);

Ir atsiųskite atsakymą:

Send_Out($user_id, $Out_Str);

Send_Out funkcija yra paprasta ir atrodo taip:

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

„Yandex.Alisa“ įgūdžių scenarijus

Dabar pereikime prie Alice scenarijaus, jis beveik toks pat kaip ir Telegram.

Taip pat sujungiame biblioteką, kurioje bus apdorojami boto ir Alisos pranešimai, taip pat biblioteką su Alisos klasėmis:

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

Duomenis gauname:

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

Duomenų analizavimas į kintamuosius:

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

Čia yra keletas kintamųjų:

$tokens – čia yra visi vartotojo įvesti žodžiai

$user_id – vartotojo ID čia

„Yandex“ nuolat tikrina paskelbtus įgūdžius, o aš pridėjau eilutę, kad iš karto išeičiau iš scenarijaus nepradėjęs viso pranešimo apdorojimo:

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

Apdorojimui vadiname funkciją Parse_Tokens, ji yra tokia pati kaip ir Telegram:

$Out_Str = Parse_Tokens($tokens);

Ir atsiųskite atsakymą:

Send_Out($user_id, $Out_Str);

Funkcija Send_Out čia yra sudėtingesnė:

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

Baigė Alisos scenarijų.

Pats Parse_Tokens apdorojimo scenarijus buvo sukurtas tik kaip pavyzdys, ten galite atlikti bet kokius patikrinimus ir apdorojimą.

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

Jei jums reikia bendrauti su vartotoju sudėtingesnės formos nei klausimas-atsakymas, tuomet turėsite išsaugoti vartotojo $user_id ir iš vartotojo jau gautus duomenis duomenų bazėje (pavyzdžiui, mysql) ir juos išanalizuoti funkcija Parse_Tokens.

Tiesą sakant, tai yra beveik viskas, jei viskas padaryta teisingai, tada „Telegram“ robotas jau yra, Alisos įgūdžius galima patikrinti dialogs.yandex.ru/developerpereidami prie naujų įgūdžių testavimo skirtuke.

„Yandex.Alisa“ ir „Telegram“ robotas PHP su ta pačia funkcija

Jei viskas veikia teisingai, įgūdį galite siųsti moderuoti paspausdami mygtuką „Moderuoti“.

Dabar vienu metu turite du robotus skirtingoms platformoms, kurie veikia vienodai.

„Yandex.Dialogues“ paslaugos dokumentacija čia

Visi scenarijai paskelbti github atsisiųsti.

Šaltinis: www.habr.com

Добавить комментарий