A Yandex.Alisa és a Telegram bot PHP-ben ugyanazzal a funkcióval

Jó napot kívánok.

Nagyon sok cikk van a távirati botok témájában, de kevesen írnak Alice készségeiről, és nem találtam információt arról, hogyan készítsünk egyetlen botot, ezért úgy döntöttem, megosztom tapasztalataimat egy egyszerű Telegram bot és az azonos funkciójú webhely Yandex.Alice készsége.

Tehát nem árulom el, hogyan kell webszervert emelni és ssl tanúsítványt szerezni, eleget írtak róla.

Telegram bot létrehozása

Először hozzunk létre egy Telegram botot, ehhez megyünk a Telegramba, és ott megkeressük a BotFather botot.

A Yandex.Alisa és a Telegram bot PHP-ben ugyanazzal a funkcióval

A Yandex.Alisa és a Telegram bot PHP-ben ugyanazzal a funkcióval

Válassza a /newbot lehetőséget

A Yandex.Alisa és a Telegram bot PHP-ben ugyanazzal a funkcióval

Beírjuk a bot nevét, amivel válaszol, majd beírjuk a bot nevét, válaszul kapunk egy tokent a bot vezérléséhez, ezt a kulcsot felírjuk, hasznos lesz a jövőben.

A Yandex.Alisa és a Telegram bot PHP-ben ugyanazzal a funkcióval

A következő lépésben meg kell mondani a Telegram szervereknek, hogy melyik szerverre küldjön adatokat a bottól. Ehhez létrehozunk egy linket az űrlaphoz:

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

___TOKEN___ a korábban kapott, a botból származó tokenünkre cseréljük

____PATH_TO_SCRIPT____ lecseréljük a szerverünkön lévő szkript címére, ahol az adatokat feldolgozzuk (például www.my_server.ru/webhook_telegram.php).

Itt van egy probléma, az api.telegram.org szerver blokkolva van, de ezt megteheti: bérelje ki a legolcsóbb szervert, ahol nincs korlátozás, és adja ki a parancsot ennek a szervernek a konzoljáról

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

Ez az, a Telegram bot létrejön és csatlakozik a szerveréhez.

Készség létrehozása a Yandex.Alisa számára

Lépjünk tovább a Yandex.Alice készség létrehozására.

Készség létrehozásához fel kell lépnie a Yandex.Dialogues fejlesztői oldalra Yandex.Dialogs fejlesztői oldal, kattintson ott a "Párbeszéd létrehozása" gombra, és válassza a "Skill in Alice" lehetőséget.

A Yandex.Alisa és a Telegram bot PHP-ben ugyanazzal a funkcióval

Megnyílik a készségbeállítások párbeszédpanel.

A Yandex.Alisa és a Telegram bot PHP-ben ugyanazzal a funkcióval

Elkezdjük megadni a készségbeállításokat.

Írd be a képességed nevét.

A Yandex.Alisa és a Telegram bot PHP-ben ugyanazzal a funkcióval

Az aktiválási nevet nagyon körültekintően kell megválasztani, hogy Alice helyesen értse, az árnyalatokból - az Alice-t tartalmazó mobilalkalmazás és az olyan oszlopok, mint a Yandex.Station vagy az Irbis A, másképp érzékelhetik a szavakat.

A szerverünkön lévő szkript elérési útját ugyanúgy megadjuk, mint a Telegram esetében, de ez például egy kifejezetten Alice-nek szánt szkript lesz. www.my_server.ru/webhook_alice.php.

A Yandex.Alisa és a Telegram bot PHP-ben ugyanazzal a funkcióval

Mi választjuk ki a hangot, amivel a készség megszólal, nekem Alice hangja jobban tetszik.

A Yandex.Alisa és a Telegram bot PHP-ben ugyanazzal a funkcióval

Ha csak mobileszközökön vagy böngészőben kíván dolgozni, válassza a „Képernyős eszközre van szüksége” lehetőséget.

Ezután adja meg Alice képességkatalógusának beállításait. Ha azt tervezi, hogy a „márka” szót használja az aktiváláshoz, ellenőriznie kell a márka webhelyét a webmaster.yandex.ru szolgáltatásban.

A Yandex.Alisa és a Telegram bot PHP-ben ugyanazzal a funkcióval

A beállításokkal ennyi, térjünk át a szkriptekre.

Telegram bot szkript

Kezdjük a Telegram forgatókönyvével.

Összekapcsoljuk a könyvtárat, ahol a bottól és Alice-től érkező üzenetek feldolgozásra kerülnek:

include_once 'webhook_parse.php';

Beállítjuk a botunk tokenjét:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Adatokat kapunk:

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

Az adatok elemzése változókra:

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

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

$tokens – itt van a felhasználó által beírt összes szó

$user_id – felhasználói azonosító itt

$msg_chat_id - csevegés, amelyben a bot megkapta a parancsot

$msg_user_name - felhasználónév

Ezután meghívjuk a Parse_Tokens függvényt feldolgozásra:

$Out_Str = Parse_Tokens($tokens);

És küldj 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);
}

Ügyességi szkript a Yandex.Alisa számára

Most térjünk át az Alice forgatókönyvére, ez majdnem ugyanaz, mint a Telegram esetében.

Összekapcsoljuk a könyvtárat is, ahol a bottól és Alice-től érkező üzenetek feldolgozásra kerülnek, valamint egy könyvtárat Alice osztályokkal:

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

Adatokat kapunk:

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

Az adatok elemzése változókra:

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

Itt van néhány változó:

$tokens – itt van a felhasználó által beírt összes szó

$user_id – felhasználói azonosító itt

A Yandex folyamatosan pingeli a közzétett készségeket, és hozzáadtam egy sort, amely azonnal kilép a szkriptből anélkül, hogy elkezdené az üzenet teljes feldolgozását:

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

Feldolgozásra a Parse_Tokens függvényt hívjuk, ez ugyanaz, mint a Telegram esetében:

$Out_Str = Parse_Tokens($tokens);

És küldj választ:

Send_Out($user_id, $Out_Str);

A Send_Out függvény itt bonyolultabb:

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

Befejezte Alice forgatókönyvét.

Maga a Parse_Tokens feldolgozó szkript pusztán példaként készült, ott bármilyen ellenőrzést és feldolgozást végezhet.

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

Ha a kérdés-válasznál összetettebb formájú felhasználóval kell kommunikálnia, akkor a felhasználó $user_id-jét és a felhasználótól már kapott adatokat el kell mentenie az adatbázisba (például mysql), és elemeznie kell azokat az adatbázisban. a Parse_Tokens függvény.

Tulajdonképpen ez szinte minden, ha minden rendben van, akkor a Telegram bot már elérhető, Alice ügyessége ellenőrizhető dialogs.yandex.ru/developerúgy, hogy a tesztelés lapon az új készségeidhez lép.

A Yandex.Alisa és a Telegram bot PHP-ben ugyanazzal a funkcióval

Ha minden megfelelően működik, a „Moderáláshoz” gombra kattintva moderálásra küldheti a készséget.

Mostantól egyszerre két botja van különböző platformokhoz, amelyek ugyanúgy működnek.

A Yandex.Dialogues szolgáltatás dokumentációja itt

A teljes szkriptek megjelentek a githubon letöltése.

Forrás: will.com

Hozzászólás