Yandex.Alisa ak Telegram bot nan PHP ak menm fonksyonalite a

Добрый день.

Gen anpil atik sou sijè Telegram bots la, men gen anpil moun ki ekri sou konpetans pou Alice, e mwen pa jwenn okenn enfòmasyon sou fason pou fè yon sèl bot, kidonk mwen deside pataje eksperyans mwen sou fason pou fè yon. senp Telegram bot ak ladrès Yandex.Alice pou sit la ki gen menm fonksyonalite a.

Se konsa, mwen pa pral di w ki jan yo ogmante yon sèvè entènèt epi jwenn yon sètifika ssl, ase yo te ekri sou li.

Kreye yon bot Telegram

Premyèman, ann kreye yon bot Telegram, pou sa nou ale nan Telegram epi jwenn bot BotFather la.

Yandex.Alisa ak Telegram bot nan PHP ak menm fonksyonalite a

Yandex.Alisa ak Telegram bot nan PHP ak menm fonksyonalite a

Chwazi /newbot

Yandex.Alisa ak Telegram bot nan PHP ak menm fonksyonalite a

Nou antre nan non bot la pa ki li pral reponn, Lè sa a, nou antre nan non an nan bot la, an repons nou jwenn yon siy kontwole bot la, nou ekri kle sa a, li pral itil nou nan lavni.

Yandex.Alisa ak Telegram bot nan PHP ak menm fonksyonalite a

Pwochen etap la se di sèvè Telegram yo ki sèvè pou voye done nan bot la. Pou fè sa, nou fè yon lyen nan fòm sa a:

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

___TOKEN___ nou ranplase ak siy nou ki soti nan bot la, nou te resevwa pi bonè

____PATH_TO_SCRIPT____ nou ranplase ak adrès script la sou sèvè nou an kote done yo pral trete (pa egzanp, www.my_server.ru/webhook_telegram.php).

Gen yon pwoblèm isit la, sèvè api.telegram.org an bloke, men ou ka fè sa: lwe sèvè ki pi bon mache a kote pa gen okenn restriksyon epi bay lòd la nan konsole sèvè sa a.

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

Se li, bot Telegram la kreye epi konekte ak sèvè w la.

Kreye yon konpetans pou Yandex.Alisa

Ann ale nan kreye yon konpetans pou Yandex.Alice.

Pou kreye yon konpetans, ou bezwen ale nan paj devlopè Yandex.Dialogues Yandex.Dialogs paj pwomotè, klike la "Kreye dyalòg" epi chwazi "Konpetans nan Alice".

Yandex.Alisa ak Telegram bot nan PHP ak menm fonksyonalite a

Dyalòg paramèt konpetans yo ap louvri.

Yandex.Alisa ak Telegram bot nan PHP ak menm fonksyonalite a

Nou kòmanse antre nan anviwònman konpetans yo.

Antre non konpetans ou.

Yandex.Alisa ak Telegram bot nan PHP ak menm fonksyonalite a

Yo ta dwe chwazi non aktivasyon an ak anpil atansyon pou Alice konprann li kòrèkteman, soti nan nuans yo - yon aplikasyon mobil ak Alice ak kolòn tankou Yandex.Station oswa Irbis A ka wè mo yo yon fason diferan.

Nou antre nan chemen an nan script la sou sèvè nou an menm jan ak pou Telegram, men li pral yon script espesyalman pou Alice, pou egzanp. www.my_server.ru/webhook_alice.php.

Yandex.Alisa ak Telegram bot nan PHP ak menm fonksyonalite a

Nou chwazi vwa ak ki konpetans nan pral pale, mwen renmen vwa Alice plis.

Yandex.Alisa ak Telegram bot nan PHP ak menm fonksyonalite a

Si w gen plan pou travay sèlman sou aparèy mobil oswa nan yon navigatè, Lè sa a, chwazi "Ou bezwen yon aparèy ki gen yon ekran."

Apre sa, antre nan anviwònman yo pou katalòg konpetans Alice a. Si w gen plan pou itilize mo "mak" pou aktivasyon, ou bezwen verifye sit entènèt mak la nan sèvis webmaster.yandex.ru.

Yandex.Alisa ak Telegram bot nan PHP ak menm fonksyonalite a

Sa a tout ak anviwònman yo, se pou yo deplase sou scripts yo.

Telegram bot script

Ann kòmanse ak yon script pou Telegram.

Nou konekte bibliyotèk la kote mesaj ki soti nan bot la ak Alice yo pral trete:

include_once 'webhook_parse.php';

Nou mete siy bot nou an:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Nou resevwa done:

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

Analiz done yo nan varyab:

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

Koulye a, ou ka travay ak varyab:

$tokens - men kounye a tout mo itilizatè a te antre

$user_id - id itilizatè isit la

$msg_chat_id - chat kote bot la te resevwa kòmandman an

$msg_user_name - non itilizatè

Apre sa, nou rele fonksyon Parse_Tokens pou trete:

$Out_Str = Parse_Tokens($tokens);

Epi voye yon repons:

Send_Out($user_id, $Out_Str);

Fonksyon Send_Out la senp epi li sanble sa a:

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

Script konpetans pou Yandex.Alisa

Koulye a, ann ale nan script la pou Alice, li se prèske menm jan ak pou Telegram.

Nou konekte tou bibliyotèk la kote mesaj ki soti nan bot la ak Alice yo pral trete, plis yon bibliyotèk ak klas pou Alice:

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

Nou resevwa done:

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

Analiz done yo nan varyab:

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

Gen kèk mwens varyab isit la:

$tokens - men kounye a tout mo itilizatè a te antre

$user_id - id itilizatè isit la

Yandex toujou ap ping ladrès pibliye, epi mwen te ajoute yon liy imedyatman sòti script la san yo pa kòmanse pwosesis la plen nan mesaj la:

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

Nou rele fonksyon Parse_Tokens pou trete, li se menm jan ak Telegram:

$Out_Str = Parse_Tokens($tokens);

Epi voye yon repons:

Send_Out($user_id, $Out_Str);

Fonksyon Send_Out la pi konplike isit la:

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

Fini script pou Alice.

Script pwosesis Parse_Tokens tèt li te fèt piman pou yon egzanp, ou ka fè nenpòt chèk ak pwosesis la.

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

Si ou bezwen kominike ak yon itilizatè ki gen yon fòm ki pi konplèks pase yon kesyon-repons, Lè sa a, w ap bezwen sove $ user_id itilizatè a ak done yo deja resevwa nan men itilizatè a nan baz done a (pa egzanp, mysql) epi analize yo nan fonksyon Parse_Tokens.

Aktyèlman, sa a se prèske tout bagay, si tout bagay fèt kòrèkteman, Lè sa a, bot Telegram la deja disponib, konpetans Alice a ka tcheke. dialogs.yandex.ru/developerpa ale nan nouvo konpetans ou sou tab tès la.

Yandex.Alisa ak Telegram bot nan PHP ak menm fonksyonalite a

Si tout bagay mache kòrèkteman, ou ka voye konpetans nan pou modération lè w klike sou bouton "Pou modération".

Koulye a, ou gen de bots pou platfòm diferan nan yon fwa, ki travay nan menm fason an.

Dokimantasyon pou sèvis Yandex.Dialogues isit la

Scripts konplè afiche sou github telechaje.

Sous: www.habr.com

Add nouvo kòmantè