Yandex.Alisa kaj Telegram-bot en PHP kun la sama funkcio

Bonan tagon.

Estas multaj artikoloj pri la temo de Telegram-botoj, sed malmultaj homoj skribas pri kapabloj por Alico, kaj mi ne trovis ajnan informon pri kiel fari ununuran roboton, do mi decidis kunhavigi mian sperton pri kiel fari. simpla Telegram-bot kaj la lerteco Yandex.Alice por la retejo havanta la saman funkcion.

Do, mi ne diros al vi kiel levi retservilon kaj akiri ssl-atestilon, sufiĉe estas skribita pri ĝi.

Kreante Telegram-bot

Unue, ni kreu Telegram-bot, por tio ni iras al Telegram kaj trovas la BotFather-bot tie.

Yandex.Alisa kaj Telegram-bot en PHP kun la sama funkcio

Yandex.Alisa kaj Telegram-bot en PHP kun la sama funkcio

Elektu /newbot

Yandex.Alisa kaj Telegram-bot en PHP kun la sama funkcio

Ni enmetas la nomon de la bot, per kiu ĝi respondos, tiam ni enmetas la nomon de la bot, responde ni ricevas ĵetonon por kontroli la bot, ni skribas ĉi tiun ŝlosilon, ĝi estos utila al ni estonte.

Yandex.Alisa kaj Telegram-bot en PHP kun la sama funkcio

La sekva paŝo estas diri al la Telegram-serviloj al kiu servilo sendi datumojn de la bot. Por fari tion, ni faras ligilon de la formo:

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

___TOKEN___ ni anstataŭigas per nia ĵetono de la bot, ricevita pli frue

____PATH_TO_SCRIPT__ ni anstataŭigas per la adreso de la skripto sur nia servilo kie la datumoj estos prilaboritaj (ekzemple, www.my_server.ru/webhook_telegram.php).

Estas problemo ĉi tie, la servilo api.telegram.org estas blokita, sed vi povas fari ĉi tion: luu la plej malmultekostan servilon kie ne estas limigoj kaj donu la komandon de la konzolo de ĉi tiu servilo.

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

Jen ĝi, la Telegram-bot estas kreita kaj konektita al via servilo.

Krei kapablon por Yandex.Alisa

Ni daŭrigu krei kapablon por Yandex.Alice.

Por krei kapablon, vi devas iri al la paĝo de programistoj de Yandex.Dialogues Yandex.Dialogs programisto paĝo, alklaku tie "Krei dialogon" kaj elektu "Skill in Alice".

Yandex.Alisa kaj Telegram-bot en PHP kun la sama funkcio

La dialogo pri lertaj agordoj malfermiĝos.

Yandex.Alisa kaj Telegram-bot en PHP kun la sama funkcio

Ni komencas eniri la lertajn agordojn.

Enigu la nomon de via lerteco.

Yandex.Alisa kaj Telegram-bot en PHP kun la sama funkcio

La aktivignomo devas esti elektita tre zorge, por ke Alice komprenu ĝin ĝuste, el la nuancoj - poŝtelefona aplikaĵo kun Alice kaj kolumnoj kiel Yandex.Station aŭ Irbis A povas percepti vortojn malsame.

Ni eniras la vojon al la skripto en nia servilo same kiel por Telegramo, sed ĝi estos skripto specife por Alice, ekzemple www.my_server.ru/webhook_alice.php.

Yandex.Alisa kaj Telegram-bot en PHP kun la sama funkcio

Ni elektas la voĉon, per kiu la lerteco parolos, mi pli ŝatas la voĉon de Alico.

Yandex.Alisa kaj Telegram-bot en PHP kun la sama funkcio

Se vi planas labori nur sur porteblaj aparatoj aŭ en retumilo, tiam elektu "Vi bezonas aparaton kun ekrano".

Poste, enigu la agordojn por la katalogo pri kapabloj de Alice. Se vi planas uzi la vorton "marko" por aktivigo, vi devas kontroli la retejon de la marko en la servo webmaster.yandex.ru.

Yandex.Alisa kaj Telegram-bot en PHP kun la sama funkcio

Tio estas ĉio kun la agordoj, ni pluiru al la skriptoj.

Telegram-bot-skripto

Ni komencu per skripto por Telegramo.

Ni konektas la bibliotekon, kie mesaĝoj de la bot kaj Alice estos procesitaj:

include_once 'webhook_parse.php';

Ni starigas la ĵetonon de nia bot:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Ni ricevas datumojn:

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

Analizante la datumojn en variablojn:

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

Nun vi povas labori kun variabloj:

$tokens - jen nun ĉiuj vortoj, kiujn la uzanto enigis

$user_id - uzanto-identigilo ĉi tie

$msg_chat_id - babilejo en kiu la bot ricevis la komandon

$msg_user_name - uzantnomo

Poste ni nomas la funkcion Parse_Tokens por prilaborado:

$Out_Str = Parse_Tokens($tokens);

Kaj sendu respondon:

Send_Out($user_id, $Out_Str);

la Send_Out-funkcio estas simpla kaj aspektas jene:

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

Kapabla skripto por Yandex.Alisa

Nun ni transiru al la skripto por Alico, ĝi estas preskaŭ sama kiel por Telegramo.

Ni ankaŭ konektas la bibliotekon, kie mesaĝoj de la roboto kaj Alice estos procesitaj, krom biblioteko kun klasoj por Alice:

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

Ni ricevas datumojn:

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

Analizante la datumojn en variablojn:

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

Estas kelkaj malpli da variabloj ĉi tie:

$tokens - jen nun ĉiuj vortoj, kiujn la uzanto enigis

$user_id - uzanto-identigilo ĉi tie

Yandex konstante pingas publikigitajn kapablojn, kaj mi aldonis linion por tuj eliri la skripton sen komenci la plenan prilaboradon de la mesaĝo:

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

Ni nomas la funkcion Parse_Tokens por prilaborado, ĝi estas la sama kiel por Telegram:

$Out_Str = Parse_Tokens($tokens);

Kaj sendu respondon:

Send_Out($user_id, $Out_Str);

La funkcio Send_Out estas pli komplika ĉi tie:

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

Finis la manuskripton por Alice.

La skripto de prilaborado de Parse_Tokens mem estis farita nur por ekzemplo, vi povas fari ajnajn kontrolojn kaj prilaboradon tie.

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

Se vi bezonas komuniki kun uzanto de pli kompleksa formo ol demando-respondo, tiam vi devos konservi $user_id de la uzanto kaj la datumojn jam ricevitajn de la uzanto en la datumbazo (ekzemple, mysql) kaj analizi ilin en la funkcio Parse_Tokens.

Efektive, ĉi tio estas preskaŭ ĉio, se ĉio estas farita ĝuste, tiam la Telegram-bot jam disponeblas, la lerteco de Alice povas esti kontrolita. dialogs.yandex.ru/developerirante al via nova lerteco sur la testa langeto.

Yandex.Alisa kaj Telegram-bot en PHP kun la sama funkcio

Se ĉio funkcias ĝuste, vi povas sendi la kapablon por moderigo alklakante la butonon "Por moderigo".

Nun vi havas du robotojn por malsamaj platformoj samtempe, kiuj funkcias en la sama maniero.

Dokumentado por la servo Yandex.Dialogues tie

Plenaj skriptoj afiŝitaj sur github скачать.

fonto: www.habr.com

Aldoni komenton