Добар ден.
Има многу статии на тема Телеграм ботови, но малкумина пишуваат за вештини за Алис, а јас не најдов никакви информации како да направам еден бот, па решив да го споделам моето искуство за тоа како да направам едноставен бот на 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, но тоа ќе биде скрипта специјално за Алис, на пример
Го избираме гласот со кој ќе зборува вештината, повеќе ми се допаѓа гласот на Алиса.
Ако планирате да работите само на мобилни уреди или во прелистувач, тогаш изберете „Ви треба уред со екран“.
Следно, внесете ги поставките за каталогот на вештини на Алис. Ако планирате да го користите зборот „бренд“ за активирање, треба да ја потврдите веб-страницата на брендот во услугата webmaster.yandex.ru.
Тоа е се со поставките, ајде да преминеме на скриптите.
Телеграма бот скрипта
Да почнеме со скрипта за 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 е веќе достапен, вештината на Алис може да се провери
Ако сè работи правилно, можете да ја испратите вештината за умереност со кликнување на копчето „За умереност“.
Сега имате два бота за различни платформи одеднаш, кои работат на ист начин.
Документација за услугата Yandex.Dialogues
Целосните скрипти објавени на github
Извор: www.habr.com