Добры дзень.
На тэму Telegram-ботаў артыкулаў вельмі шмат, а вось пра навыкі для Алісы мала хто піша, а інфармацыі як зрабіць адзінага бота я ўвогуле не знайшоў, таму вырашыў падзяліцца сваім вопытам аб тым, як зрабіць простага бота Telegram і навык Яндэкс.Аліса для сайта , якія маюць адзіны функцыянал.
Такім чынам, як паднімаць вэб-сервер і атрымаць ssl-сертыфікат я расказваць не буду, пра гэта напісана дастаткова.
Стварэнне Telegram-бота
Спачатку створым Telegram-бота, для гэтага ідзем у Telegram і знаходзім там робата BotFather.
Выбіраемы /newbot
Уводны назоў робата, па якім ён будзе адклікацца, потым уводны імя робата, у адказ атрымліваем токен для кіравання робатам, запісваем гэты ключ, ён нам спатрэбіцца ў далейшым.
Наступны крок – гэта паведаміць серверам Telegram, на які сервер адпраўляць дадзеныя ад робата. Для гэтага які робіцца спасылку выгляду:
https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___
___ТОКЕН___ заменны на наш токен ад бота, атрыманы раней
____ШЛЯХ_ДА_СКРПІТА___ заменны на адрас скрыпту на нашым серверы, дзе будзе адбывацца апрацоўка дадзеных (напрыклад,
Тут ёсць праблема, сервер api.telegram.org знаходзіцца пад блакіроўкай, але можна зрабіць так: арандаваць самы танны сервер тамака, дзе няма абмежаванняў і даць з кансолі гэтага сервера каманду
wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___
Усё, Telegram-бот створаны і звязаны з вашым серверам.
Стварэнне навыку для Яндэкс.Аліса
Пяройдзем да стварэння навыку для Яндэкс.Аліса.
Для стварэння навыку трэба перайсці на старонку распрацоўшчыкаў Яндекс.Дыялогі
Адкрыецца дыялог настроек навыку.
Пачынаем уводзіць налады навыку.
Уводзім імя вашага навыку.
Актывацыйнае імя варта падбіраць вельмі ўважліва, каб Аліса правільна яго разумела, з нюансаў - мабільнае прыкладанне з Алісай і калонкі тыпу Яндэкс.Станцыя або Irbis A могуць успрымаць словы па-рознаму.
Уводзім шлях да скрыпту на нашым серверы гэтак жа, як і для Telegram, але гэта будзе скрыпт менавіта для Алісы, напрыклад
Выбіраемы голас, якім будзе казаць навык, мне больш падабаецца менавіта голас Алісы.
Калі плануецца праца толькі на мабільных прыладах або ў браўзэры, то выбіраемы "Трэба прылада з экранам".
Далей уводзім наладкі для каталога навыкаў Алісы. Калі вы плануеце выкарыстоўваць для актывацыі слова - брэнд, трэба прайсці верыфікацыю сайта брэнда ў сэрвісе webmaster.yandex.ru.
З наладамі ўсё, пераходзім да скрыптоў.
Скрыпт Telegram-бота
Пачнём са скрыпту для Telegram.
Падлучаем бібліятэку, дзе будуць апрацоўвацца паведамленні ад бота і Алісы:
include_once 'webhook_parse.php';
Задаем token нашага робата:
$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);
}
Скрыпт навыку для Яндэкс.Аліса
Цяпер пяройдзем да скрыпту для Алісы, ён амаль такі ж, як і для Telegram.
Таксама падключаем бібліятэку, дзе будуць апрацоўвацца паведамленні ад бота і Алісы, плюс бібліятэку з класамі для Алісы:
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 карыстальніка
Яндэкс увесь час пінгуе апублікаваныя навыкі, і я дадаў радок, каб адразу выходзіць са скрыпту, не запускаючы поўную апрацоўку паведамлення:
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;
}
Калі вам трэба зносіны з карыстачом больш складанага выгляду, чым пытанне-адказ, то трэба будзе захоўваць у базе (напрыклад mysql) $user_id карыстача і ўжо атрыманыя ад карыстача дадзеныя і аналізаваць іх у функцыі Parse_Tokens.
Уласна гэта амаль усё, калі ўсё зроблена правільна, то Telegram-бот ужо даступны, навык Алісы можна праверыць
Калі ўсё карэктна працуе, можна адправіць навык на мадэрацыю, націснуўшы кнопку "На мадэрацыю".
Цяпер у вас ёсць адразу два боты для розных платформаў, якія працуюць аднолькава.
Дакументацыя па сэрвісе Яндекс.Дыялогі
Поўныя скрыпты выкладзены на github
Крыніца: habr.com