Навык для алисы php

Яндекс.Алиса и бот Telegram на PHP с единым функционалом

На тему Telegram-ботов статей очень много, а вот про навыки для Алисы мало кто пишет, а информации как сделать единого бота я вообще не нашел, поэтому решил поделиться своим опытом о том, как сделать простого бота Telegram и навык Яндекс.Алиса для сайта, имеющих единый функционал.

Итак, как поднимать веб-сервер и получить ssl-сертификат я рассказывать не буду, про это написано достаточно.

Создание Telegram-бота

Сначала создадим Telegram-бота, для этого идем в Telegram и находим там бота BotFather.

Вводим название бота, по которому он будет отзываться, потом вводим имя бота, в ответ получаем токен для управления ботом, записываем этот ключ, он нам пригодится в дальнейшем.

Следующий шаг — это сообщить серверам Telegram, на какой сервер отправлять данные от бота. Для этого делаем ссылку вида:

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

___ТОКЕН___ заменяем на наш токен от бота, полученный ранее

____ПУТЬ_ДО_СКРПИТА___ заменяем на адрес скрипта на нашем сервере, где будет происходить обработка данных (например, www.my_server.ru/webhook_telegram.php).

Тут есть проблема, сервер api.telegram.org находится под блокировкой, но можно сделать так: арендовать самый дешевый сервер там, где нет ограничений и дать из консоли этого сервера команду

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

Все, Telegram-бот создан и связан с вашим сервером.

Создание навыка для Яндекс.Алиса

Перейдем к созданию навыка для Яндекс.Алиса.

Для создания навыка нужно перейти на страницу разработчиков Яндекс.Диалоги страницу разработчиков Яндекс.Диалоги, нажать там «Создать диалог» и выбрать «Навык в Алисе».

Откроется диалог настроек навыка.

Начинаем вводить настройки навыка.

Активационное имя следует подбирать очень внимательно, чтобы Алиса правильно его понимала, из нюансов – мобильное приложение с Алисой и колонки типа Яндекс.Станция или Irbis A могут воспринимать слова по-разному.

Вводим путь до скрипта на нашем сервере так же, как и для Telegram, но это будет скрипт именно для Алисы, например www.my_server.ru/webhook_alice.php.

Выбираем голос, которым будет говорить навык, мне больше нравится именно голос Алисы.

Если планируется работа только на мобильных устройствах или в браузере, то выбираем «Нужно устройство с экраном».

Далее вводим настройки для каталога навыков Алисы. Если вы планируете использовать для активации слово — бренд, нужно пройти верификацию сайта бренда в сервисе webmaster.yandex.ru.

С настройками все, переходим к скриптам.

Скрипт Telegram-бота

Начнем со скрипта для 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

Теперь можно работать с переменными:

$tokens — тут теперь все слова, которые пользователь ввел

$user_id — тут id пользователя

$msg_chat_id — чат, в котором бот получил команду

$msg_user_name — имя пользователя

Далее, вызываем для обработки функцию Parse_Tokens:

$Out_Str = Parse_Tokens($tokens); 

функция Send_Out проста и выглядит так:

function Send_Out($user_id, $text, $is_end = true) < global $tg_bot_token; if (strlen($user_id) < 1 || strlen($text) < 1) $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'])) > 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'])) if (isset($data_req['nlu'])) < $data_nlu = $data_req['nlu']; if (isset($data_nlu['tokens'])) // $data_token_count = count($data_tokens); > > if (isset($data['session'])) < $data_session = $data['session']; if (isset($data_session['new'])) if (isset($data_session['message_id'])) if (isset($data_session['session_id'])) if (isset($data_session['skill_id'])) if (isset($data_session['user_id'])) > > 

Тут нужных переменных чуть меньше:

$tokens — тут теперь все слова, которые пользователь ввел

$user_id — тут id пользователя

Яндекс постоянно пингует опубликованные навыки, и я добавил строчку, чтобы сразу выходить из скрипта, не запуская полную обработку сообщения:

Вызываем для обработки функцию Parse_Tokens, он тот же самый, что и для Telegram:

$Out_Str = Parse_Tokens($tokens); 

Функция 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) 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-бот уже доступен, навык Алисы можно проверить dialogs.yandex.ru/developer, перейдя в свой новый навык на закладку тестирование.

Если все корректно работает, можно отправить навык на модерацию, нажав кнопку «На модерацию».

Теперь у вас есть сразу два бота для разных платформ, которые работают одинаково.

Документация по сервису Яндекс.Диалоги тут

Полные скрипты выложены на github скачать.

Обновление: завернул все в классы и обновил репозитарий на github

Источник

Яндекс.Алиса и бот Telegram на PHP с единым функционалом

На тему Telegram-ботов статей очень много, а вот про навыки для Алисы мало кто пишет, а информации как сделать единого бота я вообще не нашел, поэтому решил поделиться своим опытом о том, как сделать простого бота Telegram и навык Яндекс.Алиса для сайта, имеющих единый функционал.

Итак, как поднимать веб-сервер и получить ssl-сертификат я рассказывать не буду, про это написано достаточно.

Создание Telegram-бота

Сначала создадим Telegram-бота, для этого идем в Telegram и находим там бота BotFather.

Вводим название бота, по которому он будет отзываться, потом вводим имя бота, в ответ получаем токен для управления ботом, записываем этот ключ, он нам пригодится в дальнейшем.

Следующий шаг — это сообщить серверам Telegram, на какой сервер отправлять данные от бота. Для этого делаем ссылку вида:

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

___ТОКЕН___ заменяем на наш токен от бота, полученный ранее

____ПУТЬ_ДО_СКРПИТА___ заменяем на адрес скрипта на нашем сервере, где будет происходить обработка данных (например, www.my_server.ru/webhook_telegram.php).

Тут есть проблема, сервер api.telegram.org находится под блокировкой, но можно сделать так: арендовать самый дешевый сервер там, где нет ограничений и дать из консоли этого сервера команду

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

Все, Telegram-бот создан и связан с вашим сервером.

Создание навыка для Яндекс.Алиса

Перейдем к созданию навыка для Яндекс.Алиса.

Для создания навыка нужно перейти на страницу разработчиков Яндекс.Диалоги страницу разработчиков Яндекс.Диалоги, нажать там «Создать диалог» и выбрать «Навык в Алисе».

Откроется диалог настроек навыка.

Начинаем вводить настройки навыка.

Активационное имя следует подбирать очень внимательно, чтобы Алиса правильно его понимала, из нюансов – мобильное приложение с Алисой и колонки типа Яндекс.Станция или Irbis A могут воспринимать слова по-разному.

Вводим путь до скрипта на нашем сервере так же, как и для Telegram, но это будет скрипт именно для Алисы, например www.my_server.ru/webhook_alice.php.

Выбираем голос, которым будет говорить навык, мне больше нравится именно голос Алисы.

Если планируется работа только на мобильных устройствах или в браузере, то выбираем «Нужно устройство с экраном».

Далее вводим настройки для каталога навыков Алисы. Если вы планируете использовать для активации слово — бренд, нужно пройти верификацию сайта бренда в сервисе webmaster.yandex.ru.

С настройками все, переходим к скриптам.

Скрипт Telegram-бота

Начнем со скрипта для 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

Теперь можно работать с переменными:

$tokens — тут теперь все слова, которые пользователь ввел

$user_id — тут id пользователя

$msg_chat_id — чат, в котором бот получил команду

$msg_user_name — имя пользователя

Далее, вызываем для обработки функцию Parse_Tokens:

$Out_Str = Parse_Tokens($tokens); 

функция Send_Out проста и выглядит так:

function Send_Out($user_id, $text, $is_end = true) < global $tg_bot_token; if (strlen($user_id) < 1 || strlen($text) < 1) $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'])) > 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'])) if (isset($data_req['nlu'])) < $data_nlu = $data_req['nlu']; if (isset($data_nlu['tokens'])) // $data_token_count = count($data_tokens); > > if (isset($data['session'])) < $data_session = $data['session']; if (isset($data_session['new'])) if (isset($data_session['message_id'])) if (isset($data_session['session_id'])) if (isset($data_session['skill_id'])) if (isset($data_session['user_id'])) > > 

Тут нужных переменных чуть меньше:

$tokens — тут теперь все слова, которые пользователь ввел

$user_id — тут id пользователя

Яндекс постоянно пингует опубликованные навыки, и я добавил строчку, чтобы сразу выходить из скрипта, не запуская полную обработку сообщения:

Вызываем для обработки функцию Parse_Tokens, он тот же самый, что и для Telegram:

$Out_Str = Parse_Tokens($tokens); 

Функция 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) 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-бот уже доступен, навык Алисы можно проверить dialogs.yandex.ru/developer, перейдя в свой новый навык на закладку тестирование.

Если все корректно работает, можно отправить навык на модерацию, нажав кнопку «На модерацию».

Теперь у вас есть сразу два бота для разных платформ, которые работают одинаково.

Документация по сервису Яндекс.Диалоги тут

Полные скрипты выложены на github скачать.

Обновление: завернул все в классы и обновил репозитарий на github

Источник

Читайте также:  Автоматическое обновление страницы браузера на HTML (bloggood.ru)
Оцените статью