Dzień dobry.
Istnieje wiele artykułów na temat botów Telegrama, ale niewiele osób pisze o umiejętnościach dla Alice, a ja nie znalazłem żadnych informacji, jak zrobić jednego bota, więc postanowiłem podzielić się moimi doświadczeniami, jak zrobić prosty bot Telegram i umiejętność Yandex.Alice dla witryny o tej samej funkcjonalności.
Więc nie powiem ci, jak postawić serwer WWW i uzyskać certyfikat ssl, na ten temat napisano już wystarczająco dużo.
Tworzenie bota Telegrama
Najpierw stwórzmy bota Telegram, w tym celu przechodzimy do Telegrama i znajdujemy tam bota BotFather.
Wybierz /nowybot
Wpisujemy nazwę bota, którym będzie odpowiadał, następnie wpisujemy nazwę bota, w odpowiedzi dostajemy token do sterowania botem, zapisujemy ten klucz, przyda nam się w przyszłości.
Następnym krokiem jest poinformowanie serwerów Telegrama, do którego serwera wysłać dane z bota. W tym celu tworzymy link do formularza:
https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___
___TOKEN___ zastępujemy naszym tokenem od bota, otrzymanym wcześniej
____PATH_TO_SCRIPT____ zastępujemy adresem skryptu na naszym serwerze, na którym dane będą przetwarzane (np.
Tu jest problem, serwer api.telegram.org jest w trakcie blokowania, ale można to zrobić: wynająć najtańszy serwer gdzie nie ma ograniczeń i wydać komendę z konsoli tego serwera
wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___
To wszystko, bot Telegram został utworzony i podłączony do twojego serwera.
Tworzenie umiejętności dla Yandex.Alisa
Przejdźmy do tworzenia umiejętności dla Yandex.Alice.
Aby utworzyć umiejętność, musisz przejść do strony programistów Yandex.Dialogues
Otworzy się okno dialogowe ustawień umiejętności.
Zaczynamy wchodzić w ustawienia umiejętności.
Wpisz nazwę swojej umiejętności.
Nazwę aktywacji należy wybrać bardzo ostrożnie, aby Alice zrozumiała ją poprawnie, z niuansów - aplikacja mobilna z Alice i kolumnami takimi jak Yandex.Station lub Irbis A może inaczej postrzegać słowa.
Ścieżkę do skryptu na naszym serwerze wpisujemy tak samo jak do Telegrama, ale będzie to skrypt specjalnie dla Alicji np.
Wybieramy głos, którym będzie przemawiać umiejętność, bardziej podoba mi się głos Alicji.
Jeśli planujesz pracować tylko na urządzeniach mobilnych lub w przeglądarce, wybierz „Potrzebujesz urządzenia z ekranem”.
Następnie wprowadź ustawienia katalogu umiejętności Alicji. Jeśli planujesz używać słowa „marka” do aktywacji, musisz zweryfikować stronę internetową marki w serwisie webmaster.yandex.ru.
To wszystko z ustawieniami, przejdźmy do skryptów.
Skrypt bota telegramu
Zacznijmy od skryptu dla Telegrama.
Łączymy bibliotekę, w której będą przetwarzane wiadomości od bota i Alicji:
include_once 'webhook_parse.php';
Ustawiamy token naszego bota:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Otrzymujemy dane:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Parsowanie danych do zmiennych:
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);
}
Teraz możesz pracować ze zmiennymi:
$tokeny - tutaj są teraz wszystkie słowa, które wprowadził użytkownik
$user_id - identyfikator użytkownika tutaj
$msg_chat_id - czat, w którym bot otrzymał polecenie
$msg_user_name - nazwa użytkownika
Następnie wywołujemy funkcję Parse_Tokens do przetwarzania:
$Out_Str = Parse_Tokens($tokens);
I wyślij odpowiedź:
Send_Out($user_id, $Out_Str);
funkcja Send_Out jest prosta i wygląda tak:
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);
}
Skrypt umiejętności dla Yandex.Alisa
Przejdźmy teraz do skryptu dla Alice, jest prawie taki sam jak dla Telegrama.
Łączymy też bibliotekę, w której będą przetwarzane wiadomości od bota i Alicji, plus bibliotekę z klasami dla Alicji:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Otrzymujemy dane:
$data = json_decode(trim(file_get_contents('php://input')), true);
Parsowanie danych do zmiennych:
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'];}
}
}
Tutaj jest kilka mniej zmiennych:
$tokeny - tutaj są teraz wszystkie słowa, które wprowadził użytkownik
$user_id - identyfikator użytkownika tutaj
Yandex stale pinguje opublikowane umiejętności, a ja dodałem linię, aby natychmiast wyjść ze skryptu bez rozpoczynania pełnego przetwarzania wiadomości:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
Do przetwarzania wywołujemy funkcję Parse_Tokens, jest ona taka sama jak dla Telegrama:
$Out_Str = Parse_Tokens($tokens);
I wyślij odpowiedź:
Send_Out($user_id, $Out_Str);
Funkcja Send_Out jest tutaj bardziej skomplikowana:
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();
}
Skończyłem scenariusz dla Alice.
Sam skrypt przetwarzania Parse_Tokens został stworzony wyłącznie dla przykładu, można tam wykonać dowolne kontrole i przetwarzanie.
function Parse_Tokens($tokens)
{
$out = "";
// do something with tokens //
$out = "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
return $out;
}
Jeśli potrzebujesz komunikować się z użytkownikiem w bardziej złożonej formie niż pytanie-odpowiedź, będziesz musiał zapisać $user_id użytkownika oraz dane już otrzymane od użytkownika w bazie danych (na przykład mysql) i przeanalizować je w funkcja Parse_Tokens.
Właściwie to prawie wszystko, jeśli wszystko jest zrobione poprawnie, to bot Telegram jest już dostępny, umiejętności Alicji można sprawdzić
Jeśli wszystko działa poprawnie, możesz wysłać umiejętność do moderacji, klikając przycisk „Do moderacji”.
Teraz masz dwa boty na różne platformy jednocześnie, które działają w ten sam sposób.
Dokumentacja usługi Yandex.Dialogues
Pełne skrypty opublikowane na github
Źródło: www.habr.com