Yandex.Alisa и Telegram бот во PHP со иста функционалност

Добар ден.

Има многу статии на тема Телеграм ботови, но малкумина пишуваат за вештини за Алис, а јас не најдов никакви информации како да направам еден бот, па решив да го споделам моето искуство за тоа како да направам едноставен бот на Telegram и вештината Yandex.Alice за страницата што ја има истата функционалност.

Значи, нема да ви кажам како да подигнете веб-сервер и да добиете ssl сертификат, доволно е напишано за тоа.

Креирање на бот на Telegram

Прво, ајде да создадеме бот Telegram, за ова одиме во Telegram и таму го наоѓаме ботот BotFather.

Yandex.Alisa и Telegram бот во PHP со иста функционалност

Yandex.Alisa и Telegram бот во PHP со иста функционалност

Изберете /newbot

Yandex.Alisa и Telegram бот во PHP со иста функционалност

Го внесуваме името на ботот со кој ќе одговори, потоа го внесуваме името на ботот, како одговор добиваме токен за контрола на ботот, го запишуваме овој клуч, ќе ни биде корисен во иднина.

Yandex.Alisa и Telegram бот во PHP со иста функционалност

Следниот чекор е да им кажете на серверите на Telegram на кој сервер да испраќаат податоци од ботот. За да го направите ова, правиме врска од формата:

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

___TOKEN___ го заменуваме со нашиот токен од ботот, добиен порано

____PATH_TO_SCRIPT____ ја заменуваме со адресата на скриптата на нашиот сервер каде што ќе се обработуваат податоците (на пример, www.my_server.ru/webhook_telegram.php).

Има проблем овде, серверот api.telegram.org е блокиран, но можете да го направите ова: изнајмете го најевтиниот сервер каде што нема ограничувања и дајте ја командата од конзолата на овој сервер

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

Тоа е сè, ботот Telegram е креиран и поврзан со вашиот сервер.

Создавање вештина за Yandex.Alisa

Ајде да продолжиме да создаваме вештина за Yandex.Alice.

За да креирате вештина, треба да отидете на страницата за програмери Yandex.Dialogues Страница за програмери Yandex.Dialogs, кликнете таму „Креирај дијалог“ и изберете „Вештина во Алис“.

Yandex.Alisa и Telegram бот во PHP со иста функционалност

Ќе се отвори дијалогот за поставки за вештини.

Yandex.Alisa и Telegram бот во PHP со иста функционалност

Почнуваме да ги внесуваме поставките за вештини.

Внесете го името на вашата вештина.

Yandex.Alisa и Telegram бот во PHP со иста функционалност

Името за активација треба да биде избрано многу внимателно за Алис да го разбере правилно, од нијансите - мобилна апликација со Алис и колони како Yandex.Station или Irbis A може да ги перцепира зборовите поинаку.

Ја внесуваме патеката до скриптата на нашиот сервер на ист начин како и за Telegram, но тоа ќе биде скрипта специјално за Алис, на пример www.my_server.ru/webhook_alice.php.

Yandex.Alisa и Telegram бот во PHP со иста функционалност

Го избираме гласот со кој ќе зборува вештината, повеќе ми се допаѓа гласот на Алиса.

Yandex.Alisa и Telegram бот во PHP со иста функционалност

Ако планирате да работите само на мобилни уреди или во прелистувач, тогаш изберете „Ви треба уред со екран“.

Следно, внесете ги поставките за каталогот на вештини на Алис. Ако планирате да го користите зборот „бренд“ за активирање, треба да ја потврдите веб-страницата на брендот во услугата webmaster.yandex.ru.

Yandex.Alisa и Telegram бот во PHP со иста функционалност

Тоа е се со поставките, ајде да преминеме на скриптите.

Телеграма бот скрипта

Да почнеме со скрипта за Telegram.

Ја поврзуваме библиотеката каде што ќе се обработуваат пораките од ботот и Алис:

include_once 'webhook_parse.php';

Го поставивме знакот на нашиот бот:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Добиваме податоци:

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

Парсирање на податоците во променливи:

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

Сега можете да работите со променливи:

$tokens - тука се сега сите зборови што корисникот ги внесе

$user_id - кориснички id овде

$msg_chat_id - разговор во кој ботот ја примил командата

$msg_user_name - корисничко име

Следно, ја нарекуваме функцијата Parse_Tokens за обработка:

$Out_Str = Parse_Tokens($tokens);

И испратете одговор:

Send_Out($user_id, $Out_Str);

функцијата Send_Out е едноставна и изгледа вака:

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

Скрипта за вештина за Yandex.Alisa

Сега да преминеме на сценариото за Алис, тоа е речиси исто како и за Телеграм.

Ја поврзуваме и библиотеката каде што ќе се обработуваат пораките од ботот и Алис, плус библиотека со класи за Алис:

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

Добиваме податоци:

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

Парсирање на податоците во променливи:

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

Овде има неколку променливи помалку:

$tokens - тука се сега сите зборови што корисникот ги внесе

$user_id - кориснички id овде

Yandex постојано ги пингува објавените вештини и додадов линија за веднаш да излезам од скриптата без да ја започнам целосната обработка на пораката:

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

Ја нарекуваме функцијата Parse_Tokens за обработка, таа е иста како и за Telegram:

$Out_Str = Parse_Tokens($tokens);

И испратете одговор:

Send_Out($user_id, $Out_Str);

Функцијата Send_Out е покомплицирана овде:

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

Го завршив сценариото за Алис.

Самата скрипта за обработка на Parse_Tokens е направена чисто за пример, таму можете да направите какви било проверки и обработка.

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

Ако треба да комуницирате со корисник во покомплексна форма од прашање-одговор, тогаш ќе треба да ги зачувате $user_id на корисникот и податоците кои веќе ги добиле од корисникот во базата на податоци (на пример, mysql) и да ги анализирате во функцијата Parse_Tokens.

Всушност, ова е речиси сè, ако сè е направено правилно, тогаш ботот Telegram е веќе достапен, вештината на Алис може да се провери dialogs.yandex.ru/developerсо одење до вашата нова вештина на картичката за тестирање.

Yandex.Alisa и Telegram бот во PHP со иста функционалност

Ако сè работи правилно, можете да ја испратите вештината за умереност со кликнување на копчето „За умереност“.

Сега имате два бота за различни платформи одеднаш, кои работат на ист начин.

Документација за услугата Yandex.Dialogues тука

Целосните скрипти објавени на github преземете.

Извор: www.habr.com

Додадете коментар