Yandex.Alisa an Telegram Bot an PHP mat der selwechter Funktionalitéit

Gudden Nomëtteg.

Et gi vill Artikelen iwwer d'Thema Telegram Bots, awer wéineg Leit schreiwen iwwer Fäegkeeten fir Alice, an ech hunn keng Informatioun iwwer wéi een een eenzegen Bot mécht, also hunn ech beschloss meng Erfahrung ze deelen wéi ech e maachen. einfach Telegram Bot an der Yandex.Alice Fäegkeet fir de Site déi selwecht Funktionalitéit huet.

Also, ech wäert Iech net soen wéi Dir e Webserver erhéicht an en ssl Zertifika kritt, genuch ass doriwwer geschriwwe ginn.

Erstellt en Telegram Bot

Als éischt, loosst eis en Telegram Bot erstellen, dofir gi mir op Telegram a fanne de BotFather Bot do.

Yandex.Alisa an Telegram Bot an PHP mat der selwechter Funktionalitéit

Yandex.Alisa an Telegram Bot an PHP mat der selwechter Funktionalitéit

Wielt /newbot

Yandex.Alisa an Telegram Bot an PHP mat der selwechter Funktionalitéit

Mir gitt den Numm vum Bot, duerch deen et reagéiert, da gitt mir den Numm vum Bot, als Äntwert kréien mir en Token fir de Bot ze kontrolléieren, mir schreiwen dëse Schlëssel, et wäert eis an Zukunft nëtzlech sinn.

Yandex.Alisa an Telegram Bot an PHP mat der selwechter Funktionalitéit

De nächste Schrëtt ass den Telegram Server ze soen op wéi enge Server Daten vum Bot schécken. Fir dëst ze maachen, maache mir e Link vum Formulaire:

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

___TOKEN___ ersetzen mir mat eisem Token vum Bot, dee virdru krut

____PATH_TO_SCRIPT____ mir ersetzen duerch d'Adress vum Skript op eisem Server wou d'Donnéeën veraarbecht ginn (zum Beispill, www.my_server.ru/webhook_telegram.php).

Et gëtt e Problem hei, den api.telegram.org Server ass ënner Blockéierung, awer Dir kënnt dëst maachen: Loyer de bëllegste Server wou et keng Restriktiounen gëtt a gitt de Kommando vun der Konsole vun dësem Server

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

Dat ass et, den Telegram Bot ass erstallt a verbonne mat Ärem Server.

Schafen eng Fäegkeet fir Yandex.Alisa

Loosst eis weidergoen fir eng Fäegkeet fir Yandex.Alice ze kreéieren.

Fir eng Fäegkeet ze kreéieren, musst Dir op d'Yandex.Dialogues Entwéckler Säit goen Yandex.Dialogs Entwéckler Säit, klickt do "Erstellt Dialog" a wielt "Fäegkeet an Alice".

Yandex.Alisa an Telegram Bot an PHP mat der selwechter Funktionalitéit

De Fäegkeet Astellungsdialog gëtt op.

Yandex.Alisa an Telegram Bot an PHP mat der selwechter Funktionalitéit

Mir fänken un d'Fäegkeet Astellungen anzeginn.

Gitt den Numm vun Ärer Fäegkeet.

Yandex.Alisa an Telegram Bot an PHP mat der selwechter Funktionalitéit

Den Aktivéierungsnumm soll ganz suergfälteg gewielt ginn, sou datt d'Alice et richteg versteet, vun den Nuancen - eng mobil Applikatioun mat Alice a Spalten wéi Yandex.Station oder Irbis A kënnen Wierder anescht gesinn.

Mir gitt de Wee zum Skript op eisem Server op déiselwecht Manéier wéi fir Telegram, awer et wäert e Skript speziell fir Alice sinn, zum Beispill www.my_server.ru/webhook_alice.php.

Yandex.Alisa an Telegram Bot an PHP mat der selwechter Funktionalitéit

Mir wielen d'Stëmm mat där d'Fäegkeet schwätzt, ech hunn dem Alice seng Stëmm méi gär.

Yandex.Alisa an Telegram Bot an PHP mat der selwechter Funktionalitéit

Wann Dir plangt nëmmen op mobilen Apparater oder an engem Browser ze schaffen, da wielt "Dir braucht en Apparat mat engem Écran."

Als nächst gitt d'Astellunge fir dem Alice säi Kompetenzkatalog. Wann Dir plangt d'Wuert "Mark" fir d'Aktivatioun ze benotzen, musst Dir d'Websäit vun der Mark am Webmaster.yandex.ru Service z'iwwerpréiwen.

Yandex.Alisa an Telegram Bot an PHP mat der selwechter Funktionalitéit

Dat ass alles mat den Astellungen, loosst eis op d'Skripte goen.

Telegram Bot Skript

Loosst eis mat engem Skript fir Telegram ufänken.

Mir verbannen d'Bibliothéik wou Messagen vum Bot an Alice veraarbecht ginn:

include_once 'webhook_parse.php';

Mir setzen den Token vun eisem Bot:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Mir kréien Daten:

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

Parséieren d'Donnéeën a Variabelen:

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

Elo kënnt Dir mat Variablen schaffen:

$Tokens - hei sinn elo all d'Wierder déi de Benotzer aginn huet

$user_id - Benotzer ID hei

$msg_chat_id - Chat an deem de Bot de Kommando krut

$msg_user_name - Benotzernumm

Als nächst ruffe mir d'Parse_Tokens Funktioun fir d'Veraarbechtung:

$Out_Str = Parse_Tokens($tokens);

A schéckt eng Äntwert:

Send_Out($user_id, $Out_Str);

d'Send_Out Funktioun ass einfach a gesäit esou aus:

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

Fäegkeet Schrëft fir Yandex.Alisa

Loosst eis elo op d'Skript fir Alice goen, et ass bal d'selwecht wéi fir Telegram.

Mir verbannen och d'Bibliothéik wou Messagen vum Bot an Alice veraarbecht ginn, plus eng Bibliothéik mat Klassen fir Alice:

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

Mir kréien Daten:

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

Parséieren d'Donnéeën a Variabelen:

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

Et ginn e puer manner Variabelen hei:

$Tokens - hei sinn elo all d'Wierder déi de Benotzer aginn huet

$user_id - Benotzer ID hei

Yandex pings stänneg publizéiert Fäegkeeten, an ech hunn eng Zeil bäigefüügt fir direkt de Skript ze verloossen ouni déi voll Veraarbechtung vum Message unzefänken:

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

Mir nennen d'Parse_Tokens Funktioun fir d'Veraarbechtung, et ass d'selwecht wéi fir Telegram:

$Out_Str = Parse_Tokens($tokens);

A schéckt eng Äntwert:

Send_Out($user_id, $Out_Str);

D'Send_Out Funktioun ass hei méi komplizéiert:

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

Fäerdeg de Skript fir Alice.

De Parse_Tokens Veraarbechtungsskript selwer gouf reng fir e Beispill gemaach, Dir kënnt all Kontrollen a Veraarbechtung do maachen.

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

Wann Dir mat engem Benotzer vun enger méi komplexer Form wéi eng Fro-Äntwert kommunizéieren musst, da musst Dir de Benotzer $user_id an d'Daten déi scho vum Benotzer an der Datebank kritt hunn (zum Beispill mysql) späicheren an analyséieren an d'Parse_Tokens Funktioun.

Eigentlech ass dëst bal alles, wann alles richteg gemaach gëtt, ass den Telegram Bot scho verfügbar, d'Fäegkeet vum Alice kann iwwerpréift ginn dialogs.yandex.ru/entwécklerandeems Dir op Är nei Fäegkeet op der Test Tab gitt.

Yandex.Alisa an Telegram Bot an PHP mat der selwechter Funktionalitéit

Wann alles richteg funktionnéiert, kënnt Dir d'Fäegkeet fir Moderatioun schécken andeems Dir op de "Fir Moderatioun" Knäppchen klickt.

Elo hutt Dir zwee Bots fir verschidde Plattformen gläichzäiteg, déi op déiselwecht Manéier funktionnéieren.

Dokumentatioun fir de Yandex.Dialogues Service hei

Voll Scripte gepost op github скачать.

Source: will.com

Setzt e Commentaire