Yandex.Alice és PHP Telegram bot közös funkcióval

Jó napot.

A Telegram-botokról sok cikk található, de az Aliás képességeiről keveset írnak. Az egységes bot létrehozása pedig egyáltalán nem található, ezért megosztom tapasztalataimat arról, hogyan készíthetünk egy egyszerű Telegram-botot és egy Yandex.Aliás képességet a weboldal számára, amelyek egy közös funkcionalitással bírnak.

Tehát, hogyan állítsunk be egy webszervert és kapjunk ssl-tanúsítványt erről nem fogok mesélni, erről már bőven írtak.

Telegram-bot létrehozása

Első lépésként hozzuk létre a Telegram-botot, ehhez menjünk a Telegramra, és keressük meg a BotFather-t.

Yandex.Alice és PHP Telegram bot közös funkcióval

Yandex.Alice és PHP Telegram bot közös funkcióval

Válasszuk a /newbot lehetőséget.

Yandex.Alice és PHP Telegram bot közös funkcióval

Beírjuk a bot nevét, amely alapján válaszolni fog, majd beírjuk a bot felhasználónevét. Válaszként kapunk egy tokent a bot kezeléséhez, ezt a kulcsot jegyezzük le, mert később szükségünk lesz rá.

Yandex.Alice és PHP Telegram bot közös funkcióval

A következő lépés az, hogy értesítsük a Telegram szervereit, hogy melyik szerverre küldjék a bot adatait. Ehhez egy ilyen formátumú hivatkozást készítünk:

https://api.telegram.org/bot___TOKÉN___/setWebhook?url=https://____ÚTVONAL_A_SZKRIPTHEZ___

___TOKÉN___ cseréljük le a korábban kapott bot tokenünkre.

____ÚTVONAL_A_SZKRIPTHEZ___ cseréljük le a szerverünkön lévő szkript címére, ahol az adatok feldolgozása történik (például www.my_server.ru/webhook_telegram.php).

Itt van egy probléma, az api.telegram.org szerver blokkolva van, de meg lehet oldani: béreljünk egy legolcsóbb szerver ott, ahol nincsenek korlátozások, és adjuk ki a szerver konzoljából a következő parancsot

wget ___MEGKERESOTT_CÍM___

Minden, létrehoztuk a Telegram-botot, és összekapcsoltuk a saját szerverrel.

Képesség létrehozása Yandex.Aliás számára

Térjünk át a Yandex.Aliás képességének létrehozására.

A képesség létrehozásához lépjünk a Yandex.Dialogs fejlesztői oldalára. a Yandex.Dialogs fejlesztői oldalára,, kattintsunk a „Párbeszéd létrehozása” gombra, és válasszuk az „Aliás képesség” opciót.

Yandex.Alice és PHP Telegram bot közös funkcióval

Megnyílik a képesség beállító párbeszédablak.

Yandex.Alice és PHP Telegram bot közös funkcióval

Kezdjük el megadni a képesség beállításait.

Adjuk meg a képesség nevét.

Yandex.Alice és PHP Telegram bot közös funkcióval

A aktiváló nevet nagyon gondosan kell választani, hogy Aliás helyesen érthesse. Az apróságok közé tartozik, hogy a mobil alkalmazás Aliással és az Yandex.Station vagy Irbis A típusú hangszórók különbözőképpen értelmezhetik a szavakat.

Adjuk meg a szerverünkön lévő szkript címét ugyanúgy, ahogyan a Telegram esetében, csak ez a szkript kifejezetten Aliás számára készült, például www.my_server.ru/webhook_alice.php.

Yandex.Alice és PHP Telegram bot közös funkcióval

Válasszuk ki azt a hangot, amellyel a képesség fog beszélni, nekem jobban tetszik Aliás hangja.

Yandex.Alice és PHP Telegram bot közös funkcióval

Ha csak mobil eszközökön vagy böngészőben tervezett használat, akkor válasszuk a „Kell egy képernyővel rendelkező eszköz” lehetőséget.

Ezután megadjuk az Alice készségkönyvtár beállításait. Ha aktiváláshoz márkanevet tervez használni, akkor a márka weboldalának hitelesítésén kell átmennie a webmaster.yandex.ru szolgáltatásban.

Yandex.Alice és PHP Telegram bot közös funkcióval

A beállításokkal kész, most térjünk át a szkriptekre.

Telegram-bot szkript

Kezdjük a Telegram szkripttel.

Csatlakoztatjuk azt a könyvtárat, ahol a bot és Alice által küldött üzeneteket kezeljük:

include_once 'webhook_parse.php';

Megadjuk a botunk tokenjét:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Adatok lekérése:

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

Az adatok változókra bontása:

if (!$request)
{
  die();
    // Néhány hibakimenet (a kérés nem érvényes JSON)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
  die();
    // Néhány hibakimenet (a kérés nem tartalmaz üzenetet)
}
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);
}

Most már dolgozhatunk a változókkal:

$tokens — itt vannak most az összes szó, amit a felhasználó beírt

$user_id — itt a felhasználó azonosítója

$msg_chat_id — a csevegés, ahol a bot parancsot kapott

$msg_user_name — a felhasználó neve

Ezután hívjuk meg a Parse_Tokens feldolgozó függvényt:

$Out_Str = Parse_Tokens($tokens);

És elküldjük a választ:

Send_Out($user_id, $Out_Str);

A Send_Out függvény egyszerű, és így néz ki:

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

 

A készség szkriptje Yandex.Alice számára

Most térjünk át a szkriptre Alice számára, ez majdnem ugyanolyan, mint a Telegram esetében.

Csatlakoztatjuk a könyvtárat, ahol a bot és Alice által küldött üzeneteket kezeljük, valamint az Alice osztályait tartalmazó könyvtárat:

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

Adatok lekérése:

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

Az adatok változókra bontása:

if (isset($data['request']))
{

//eredeti_kifejezés


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

Itt kevesebb szükséges változó van:

$tokens — itt vannak most az összes szó, amit a felhasználó beírt

$user_id — itt a felhasználó azonosítója

A Yandex folyamatosan pingeli a közzétett készségeket, és hozzátettem egy sort, hogy azonnal kilépjek a szkriptből, anélkül, hogy teljesen feldolgoznám az üzenetet:

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

A Parse_Tokens funkciót hívva kezeljük, ez ugyanaz, mint a Telegram esetében:

$Out_Str = Parse_Tokens($tokens);

És elküldjük a választ:

Send_Out($user_id, $Out_Str);

A Send_Out funkció itt összetettebb:

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

  //////////// KIMENET BÁZIS GENERÁLÁS ////////////
    $Data_Out = new Alice_Data_Out();
    $Data_Out->response = new Alice_Response();
    $Data_Out->session = new Alice_Session();
  //////////// KIMENET BÁZIS GENERÁLÁS VÉGE ////////////

  //////////// ÜZENET KIMENET GENERÁLÁS ////////////
  $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();
}

Befejeztük a szkriptet Aliszához.

A Parse_Tokens kezelő szkriptjét pusztán példának készítettem, itt bármilyen ellenőrzést és feldolgozást megvalósíthatsz.

function Parse_Tokens($tokens)
{
  $out = "";
  // végezz valamit a tokenelemekkel //
  $out =  "Ön beírt " . count($tokens) . " szót: " . implode($tokens, " ");
  return $out;
}

Ha a felhasználóval folytatott kommunikációd bonyolultabb, mint a kérdés-válasz, akkor mentened kell az adatbázisba (például mysql) a $user_id-t és a felhasználótól már kapott adatokat, majd ezeket elemezni a Parse_Tokens funkcióban.

Ez gyakorlatilag mindent lefed, ha minden rendben működik, akkor a Telegram-bot már elérhető, az Alisz készséget pedig ellenőrizheted. dialogs.yandex.ru/developer, át lehet menni az új készséged tesztelési fülére.

Yandex.Alice és PHP Telegram bot közös funkcióval

Ha minden megfelelően működik, a készséget moderációra lehet küldeni a „Moderálásra” gomb megnyomásával.

Most már két különböző platformra készült botja van, amelyek egyaránt ugyanúgy működnek.

Dokumentáció a Yandex.Dialogs szolgáltatásról itt

A teljes szkriptek elérhetőek a githubon letölteni.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster