- Яндекс.Алиса и бот Telegram на PHP с единым функционалом
- Создание Telegram-бота
- Создание навыка для Яндекс.Алиса
- Скрипт Telegram-бота
- Скрипт навыка для Яндекс.Алиса
- Saved searches
- Use saved searches to filter your results more quickly
- AlexSuperStar/Yandex-Alisa-PHP-Example
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- README.md
- About
Яндекс.Алиса и бот 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
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Пример PHP скрипта для навыка Алисы Яндекса.
AlexSuperStar/Yandex-Alisa-PHP-Example
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Пример PHP скрипта для навыка Алисы Яндекса.
Устанавливаем необходимые компоненты
composer init composer require alexsuperstar/jsonmaker composer install
Создание скрипта обрабатывающего запросы от Алисы
header('Content-type:application/json;charset=utf-8'); include 'vendor/autoload.php'; $in = new \alexstar\JsonMaker(file_get_contents('php://input')); if(isset($in->version))< # если есть параметр version то будем считать что входные данные в порядке # формируем ответ $out = new \alexstar\JsonMaker(); # необходимые параметры ответа $out->version = '1.0'; $out->response->end_session = false; $out->session->session_id = $in->session->session_id; $out->session->message_id = $in->session->message_id; $out->session->user_id = $in->session->user_id; # Ответ Алисы $out->response->text='Привет'; # Например ссылка под текстом $out->response->buttons[0]->title = 'Открыть сайт разработчика'; $out->response->buttons[0]->url = 'https://alexstar.ru/'; echo $out; > ?>
About
Пример PHP скрипта для навыка Алисы Яндекса.