Bot Yandex.Alisa a Telegram v PHP se stejnou funkčností

Dobré odpoledne.

Na téma telegramových botů je spousta článků, ale málokdo píše o dovednostech pro Alici a já jsem nenašel žádné informace o tom, jak vyrobit jediného bota, tak jsem se rozhodl podělit se o své zkušenosti, jak vyrobit jednoduchý telegramový bot a dovednost Yandex.Alice pro web se stejnou funkčností.

Neřeknu vám tedy, jak získat webový server a získat ssl certifikát, o tom bylo napsáno dost.

Vytvoření telegramového robota

Nejprve si vytvořte telegramového bota, za tímto účelem přejdeme do Telegramu a najdeme tam bota BotFather.

Bot Yandex.Alisa a Telegram v PHP se stejnou funkčností

Bot Yandex.Alisa a Telegram v PHP se stejnou funkčností

Vyberte /newbot

Bot Yandex.Alisa a Telegram v PHP se stejnou funkčností

Zadáme jméno robota, kterým bude reagovat, poté zadáme jméno robota, jako odpověď získáme token pro ovládání robota, tento klíč si zapíšeme, bude se nám hodit v budoucnu.

Bot Yandex.Alisa a Telegram v PHP se stejnou funkčností

Dalším krokem je sdělit telegramovým serverům, na který server mají odeslat data z robota. Za tímto účelem vytvoříme odkaz na formulář:

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

___TOKEN___ nahrazujeme naším tokenem od robota, který jsme obdrželi dříve

____PATH_TO_SCRIPT____ nahradíme adresou skriptu na našem serveru, kde budou data zpracována (např. www.my_server.ru/webhook_telegram.php).

Zde je problém, server api.telegram.org je blokován, ale můžete to udělat: pronajměte si nejlevnější server, kde neexistují žádná omezení, a zadejte příkaz z konzoly tohoto serveru

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

To je vše, robot Telegram je vytvořen a připojen k vašemu serveru.

Vytvoření dovednosti pro Yandex.Alisa

Pojďme k vytvoření dovednosti pro Yandex.Alice.

Chcete-li vytvořit dovednost, musíte přejít na stránku vývojáře Yandex.Dialogues Stránka vývojáře Yandex.Dialogs, klikněte tam na "Vytvořit dialog" a vyberte "Skill in Alice".

Bot Yandex.Alisa a Telegram v PHP se stejnou funkčností

Otevře se dialog nastavení dovedností.

Bot Yandex.Alisa a Telegram v PHP se stejnou funkčností

Začneme vstupovat do nastavení dovedností.

Zadejte název své dovednosti.

Bot Yandex.Alisa a Telegram v PHP se stejnou funkčností

Aktivační jméno by mělo být vybráno velmi pečlivě, aby mu Alice správně rozuměla, z nuancí - mobilní aplikace s Alicí a sloupce jako Yandex.Station nebo Irbis A mohou slova vnímat jinak.

Cestu ke skriptu na našem serveru zadáváme stejně jako u Telegramu, ale bude to skript speciálně pro Alici, např. www.my_server.ru/webhook_alice.php.

Bot Yandex.Alisa a Telegram v PHP se stejnou funkčností

Volíme hlas, kterým bude dovednost hovořit, mně se více líbí hlas Alice.

Bot Yandex.Alisa a Telegram v PHP se stejnou funkčností

Pokud plánujete pracovat pouze na mobilních zařízeních nebo v prohlížeči, vyberte možnost „Potřebujete zařízení s obrazovkou“.

Dále zadejte nastavení pro katalog dovedností Alice. Pokud plánujete pro aktivaci použít slovo „značka“, musíte ověřit web značky ve službě webmaster.yandex.ru.

Bot Yandex.Alisa a Telegram v PHP se stejnou funkčností

To je s nastavením vše, přejděme ke skriptům.

Skript telegramového bota

Začněme skriptem pro Telegram.

Připojujeme knihovnu, kde se budou zpracovávat zprávy od robota a Alice:

include_once 'webhook_parse.php';

Nastavili jsme token našeho robota:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Přijímáme údaje:

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

Analýza dat do proměnných:

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

Nyní můžete pracovat s proměnnými:

$tokens - zde jsou nyní všechna slova, která uživatel zadal

$user_id – zde ID uživatele

$msg_chat_id - chat, ve kterém bot obdržel příkaz

$msg_user_name – uživatelské jméno

Dále zavoláme funkci Parse_Tokens pro zpracování:

$Out_Str = Parse_Tokens($tokens);

A pošlete odpověď:

Send_Out($user_id, $Out_Str);

funkce Send_Out je jednoduchá a vypadá takto:

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

Dovednostní skript pro Yandex.Alisa

Nyní přejděme ke scénáři pro Alici, je téměř stejný jako u Telegramu.

Připojujeme také knihovnu, kde se budou zpracovávat zprávy od robota a Alice, plus knihovnu s třídami pro Alice:

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

Přijímáme údaje:

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

Analýza dat do proměnných:

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

Zde je o něco méně proměnných:

$tokens - zde jsou nyní všechna slova, která uživatel zadal

$user_id – zde ID uživatele

Yandex neustále pinguje publikované dovednosti a přidal jsem řádek pro okamžité ukončení skriptu bez zahájení úplného zpracování zprávy:

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

Pro zpracování voláme funkci Parse_Tokens, je to stejné jako u telegramu:

$Out_Str = Parse_Tokens($tokens);

A pošlete odpověď:

Send_Out($user_id, $Out_Str);

Funkce Send_Out je zde složitější:

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

Dokončili jsme scénář pro Alici.

Samotný zpracovatelský skript Parse_Tokens byl vytvořen čistě pro příklad, můžete tam provádět libovolné kontroly a zpracování.

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

Pokud potřebujete komunikovat s uživatelem složitějšího tvaru, než je otázka-odpověď, budete muset uložit $user_id uživatele a data již přijatá od uživatele do databáze (například mysql) a analyzovat je v funkce Parse_Tokens.

Ve skutečnosti je to téměř vše, pokud je vše provedeno správně, pak je robot Telegram již k dispozici, lze zkontrolovat Alicinu dovednost dialogs.yandex.ru/developerpřejdete na svou novou dovednost na kartě testování.

Bot Yandex.Alisa a Telegram v PHP se stejnou funkčností

Pokud vše funguje správně, můžete dovednost odeslat k moderování kliknutím na tlačítko „Pro moderování“.

Nyní máte dva roboty pro různé platformy najednou, kteří fungují stejným způsobem.

Dokumentace pro službu Yandex.Dialogues zde

Úplné skripty zveřejněné na githubu ke stažení.

Zdroj: www.habr.com

Přidat komentář