Добър ден.
Има много статии по темата за ботовете на Telegram, но малко хора пишат за умения за Alice и не намерих информация как да направя нито един бот, затова реших да споделя опита си как да направя прост Telegram бот и умението Yandex.Alice за сайта със същата функционалност.
Така че, няма да ви казвам как да издигнете уеб сървър и да получите ssl сертификат, достатъчно е писано за това.
Създаване на Telegram бот
Първо, нека създадем бот на Telegram, за това отиваме в Telegram и намираме бота BotFather там.
Изберете /newbot
Въвеждаме името на бота, с което ще отговори, след това въвеждаме името на бота, в отговор получаваме токен за управление на бота, записваме този ключ, той ще ни бъде полезен в бъдеще.
Следващата стъпка е да кажете на сървърите на Telegram към кой сървър да изпращат данни от бота. За да направите това, ние правим връзка от формата:
https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___
___TOKEN___ заместваме с нашия токен от бота, получен по-рано
____PATH_TO_SCRIPT____ заместваме с адреса на скрипта на нашия сървър, където ще се обработват данните (напр.
Тук има проблем, сървърът api.telegram.org е блокиран, но можете да направите това: наемете най-евтиния сървър, където няма ограничения и дайте командата от конзолата на този сървър
wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___
Това е всичко, ботът на Telegram е създаден и свързан към вашия сървър.
Създаване на умение за Yandex.Alisa
Нека да преминем към създаването на умение за Yandex.Alice.
За да създадете умение, трябва да отидете на страницата за разработчици на Yandex.Dialogues
Ще се отвори диалоговият прозорец за настройки на уменията.
Започваме да въвеждаме настройките на уменията.
Въведете името на вашето умение.
Името за активиране трябва да бъде избрано много внимателно, така че Алис да го разбере правилно, от нюансите - мобилно приложение с Алис и колони като Yandex.Station или Irbis A може да възприема думите по различен начин.
Въвеждаме пътя до скрипта на нашия сървър по същия начин, както за Telegram, но това ще бъде скрипт специално за Alice, например
Избираме гласа, с който умението ще говори, повече ми харесва гласът на Алис.
Ако планирате да работите само на мобилни устройства или в браузър, изберете „Имате нужда от устройство с екран“.
След това въведете настройките за каталога с умения на Алис. Ако планирате да използвате думата „марка“ за активиране, трябва да потвърдите уебсайта на марката в услугата webmaster.yandex.ru.
Това е всичко с настройките, нека да преминем към скриптовете.
Скрипт за бот на Telegram
Нека започнем със скрипт за Telegram.
Свързваме библиотеката, където ще се обработват съобщения от бота и Alice:
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);
}
Сега можете да работите с променливи:
$токени - тук вече са всички думи, въведени от потребителя
$user_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
Сега да преминем към скрипта за Alice, той е почти същият като за Telegram.
Също така свързваме библиотеката, където ще се обработват съобщения от бота и Alice, плюс библиотека с класове за Alice:
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'];}
}
}
Тук има няколко променливи по-малко:
$токени - тук вече са всички думи, въведени от потребителя
$user_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 вече е наличен, умението на Алис може да бъде проверено
Ако всичко работи правилно, можете да изпратите умението за модериране, като щракнете върху бутона „За модериране“.
Сега имате два бота за различни платформи наведнъж, които работят по един и същи начин.
Документация за услугата Yandex.Dialogues
Пълните скриптове са публикувани в github
Източник: www.habr.com