Yandex.Alice dhe Telegram bot në PHP me funksionalitet të përbashkët

Mirëdita.

Ka shumë artikuj mbi temën e robotëve të Telegramit, por pak njerëz shkruajnë për aftësitë për Alice, dhe unë nuk gjeta asnjë informacion se si të bëj një bot të vetëm, kështu që vendosa të ndaj përvojën time se si të bëj një bot i thjeshtë Telegram dhe një aftësi Yandex.Alice për sajtin që ka të njëjtin funksionalitet.

Pra, nuk do t'ju tregoj se si të konfiguroni një server në internet dhe të merrni një certifikatë SSL; është shkruar mjaft për të.

Krijimi i një roboti Telegram

Së pari, le të krijojmë një bot Telegram. Për ta bërë këtë, shkoni te Telegram dhe gjeni bot BotFather atje.

Yandex.Alice dhe Telegram bot në PHP me funksionalitet të përbashkët

Yandex.Alice dhe Telegram bot në PHP me funksionalitet të përbashkët

Zgjidhni /newbot

Yandex.Alice dhe Telegram bot në PHP me funksionalitet të përbashkët

Ne fusim emrin e botit me të cilin do të përgjigjet, më pas futni emrin e botit, si përgjigje marrim një shenjë për kontrollin e botit, shkruajeni këtë çelës, do të jetë i dobishëm për ne në të ardhmen.

Yandex.Alice dhe Telegram bot në PHP me funksionalitet të përbashkët

Hapi tjetër është t'u tregoni serverëve të Telegram se cilit server t'i dërgojnë të dhënat nga roboti. Për ta bërë këtë, ne krijojmë një lidhje si:

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

___TOKEN___ zëvendësohet me tokenin tonë nga roboti i marrë më parë

____PATH_TO_SCRPIT___ zëvendësohet me adresën e skriptit në serverin tonë ku do të përpunohen të dhënat (për shembull, www.my_server.ru/webhook_telegram.php).

Këtu ka një problem, serveri api.telegram.org është i bllokuar, por mund ta bëni këtë: merrni me qira serverin më të lirë ku nuk ka kufizime dhe lëshoni një komandë nga tastiera e këtij serveri

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

Kjo është e gjitha, roboti Telegram është krijuar dhe është lidhur me serverin tuaj.

Krijimi i një aftësie për Yandex.Alice

Le të kalojmë në krijimin e një aftësie për Yandex.Alice.

Për të krijuar një aftësi, duhet të shkoni në faqen e zhvilluesve Yandex.Dialogs Faqja e zhvilluesve Yandex.Dialogues, klikoni "Krijo dialog" atje dhe zgjidhni "Shkathtësi në Alice".

Yandex.Alice dhe Telegram bot në PHP me funksionalitet të përbashkët

Do të hapet dialogu i cilësimeve të aftësive.

Yandex.Alice dhe Telegram bot në PHP me funksionalitet të përbashkët

Ne fillojmë të futemi në cilësimet e aftësive.

Shkruani emrin e aftësisë suaj.

Yandex.Alice dhe Telegram bot në PHP me funksionalitet të përbashkët

Emri i aktivizimit duhet të zgjidhet me shumë kujdes në mënyrë që Alice ta kuptojë saktë, nga nuancat - një aplikacion celular me Alice dhe folës si Yandex.Station ose Irbis A mund t'i perceptojë fjalët ndryshe.

Ne futim shtegun e skriptit në serverin tonë në të njëjtën mënyrë si për Telegram, por ky do të jetë një skenar posaçërisht për Alice, për shembull www.my_server.ru/webhook_alice.php.

Yandex.Alice dhe Telegram bot në PHP me funksionalitet të përbashkët

Ne zgjedhim zërin me të cilin do të flasë aftësia; më pëlqen më shumë zëri i Alice.

Yandex.Alice dhe Telegram bot në PHP me funksionalitet të përbashkët

Nëse planifikoni të punoni vetëm në pajisje celulare ose në një shfletues, atëherë zgjidhni "Kërkoni një pajisje me një ekran".

Më pas, futni cilësimet për katalogun e aftësive të Alice. Nëse planifikoni të përdorni fjalën "markë" për aktivizim, duhet të kaloni përmes verifikimit të faqes së internetit të markës në shërbimin webmaster.yandex.ru.

Yandex.Alice dhe Telegram bot në PHP me funksionalitet të përbashkët

Me përfundimin e cilësimeve, le të kalojmë te skriptet.

Skripti i botit të Telegramit

Le të fillojmë me një skenar për Telegram.

Ne lidhim bibliotekën ku do të përpunohen mesazhet nga bot dhe Alice:

include_once 'webhook_parse.php';

Vendosni shenjën e robotit tonë:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Ne marrim të dhëna:

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

Le t'i analizojmë të dhënat në variabla:

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

Tani mund të punoni me variabla:

$tokens - tani këtu janë të gjitha fjalët që përdoruesi ka futur

$user_id - këtu është id-ja e përdoruesit

$msg_chat_id — bisedë në të cilën roboti mori komandën

$msg_user_name - emri i përdoruesit

Më pas, ne e quajmë funksionin Parse_Tokens për përpunim:

$Out_Str = Parse_Tokens($tokens);

Dhe dërgoni përgjigjen:

Send_Out($user_id, $Out_Str);

Funksioni Send_Out është i thjeshtë dhe duket si ky:

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

Skenari i aftësive për Yandex.Alice

Tani le të kalojmë te skenari për Alice, është pothuajse i njëjtë si për Telegram.

Ne gjithashtu lidhim bibliotekën ku do të përpunohen mesazhet nga roboti dhe Alice, plus një bibliotekë me klasa për Alice:

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

Ne marrim të dhëna:

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

Le t'i analizojmë të dhënat në variabla:

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

Këtu ka pak më pak variabla të nevojshëm:

$tokens - tani këtu janë të gjitha fjalët që përdoruesi ka futur

$user_id - këtu është id-ja e përdoruesit

Yandex vazhdimisht pingon aftësitë e publikuara dhe unë shtova një rresht për të dalë menjëherë nga skenari pa filluar përpunimin e plotë të mesazhit:

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

Ne e quajmë funksionin Parse_Tokens për përpunim, është i njëjtë si për Telegram:

$Out_Str = Parse_Tokens($tokens);

Dhe dërgoni përgjigjen:

Send_Out($user_id, $Out_Str);

Funksioni Send_Out është më i ndërlikuar këtu:

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

Ne përfunduam skenarin për Alice.

Vetë skripti i përpunimit Parse_Tokens është krijuar thjesht për shembull; ju mund të bëni çdo kontroll dhe përpunim atje.

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

Nëse keni nevojë për komunikim me një përdorues të një lloji më kompleks sesa pyetje-përgjigje, atëherë do t'ju duhet të ruani $user_id të përdoruesit dhe të dhënat e marra tashmë nga përdoruesi në një bazë të dhënash (për shembull, mysql) dhe t'i analizoni ato në Parse_Tokens funksionin.

Në fakt, kjo është pothuajse e gjitha, nëse gjithçka është bërë si duhet, atëherë roboti i Telegram është tashmë i disponueshëm, aftësia e Alice mund të kontrollohet dialogs.yandex.ru/developer, duke shkuar te skeda e testimit në aftësinë tuaj të re.

Yandex.Alice dhe Telegram bot në PHP me funksionalitet të përbashkët

Nëse gjithçka funksionon si duhet, mund ta dërgoni aftësinë për moderim duke klikuar butonin "Për moderim".

Tani keni dy robotë për platforma të ndryshme që funksionojnë në të njëjtën mënyrë.

Dokumentacioni për shërbimin Yandex.Dialogs këtu

Skriptet e plota janë postuar në github shkarko.

Burimi: www.habr.com

Shto një koment