Альтернативное решение по интеграции с Яндекс.диалоги (Алиса)

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Аватара пользователя
vitt76
Сообщения: 372
Зарегистрирован: Вс апр 09, 2017 2:36 pm
Благодарил (а): 101 раз
Поблагодарили: 51 раз

Альтернативное решение по интеграции с Яндекс.диалоги (Алиса)

Сообщение vitt76 » Чт окт 25, 2018 2:52 pm

Разобравшись с Гугл, попробуем пойти дальше и покомандовать системой через Алису :)
Нам по-прежнему понадобится внешний адрес сервера и SSL-сертификат, можно бесплатный или через vpnki.
Создаем файл, например, webhook_yandex.php и кладем его в корень сайта
Содержимое файла:

Код: Выделить всё

<?php

//получаем данные
$requestBody = file_get_contents('php://input');

//декодим данные
$json = json_decode($requestBody);
$text = $json->request->command;
$sessionnew = $json->session->new;
$message_id = $json->session->message_id;
$session_id = $json->session->session_id;
$user_id = $json->session->user_id;

//передаем команду в систему
$_SERVER['PHP_AUTH_USER'] = 'login';
$_SERVER['PHP_AUTH_PW'] = 'pass';
include_once("./config.php");
include_once("./lib/loader.php");
$session = new session("prj");
$db = new mysql(DB_HOST, '', DB_USER, DB_PASSWORD, DB_NAME);
include_once(DIR_MODULES . "application.class.php");
include_once("./load_settings.php");
say(htmlspecialchars($text), 0, 1);

// читаем ответ
$sqlQuery = "SELECT MESSAGE
               FROM shouts
              WHERE MEMBER_ID = 0
              ORDER BY ID DESC
              LIMIT 1";

//$speech = current(SQLSelectOne($sqlQuery));
$speech = 'Команда принята';

//отвечаем яндексу
if ($sessionnew == true) $speech = "Привет, чем могу помочь?";
$response = new \stdClass();
$response->response->text = $speech;
$response->response->tts = $speech;
$response->response->end_session = false;
$response->session->message_id = $message_id;
$response->session->session_id = $session_id;
$response->session->user_id = $user_id;
$response->version = '1.0';
echo json_encode($response);
?>
Заполняем поля

Код: Выделить всё

$_SERVER['PHP_AUTH_USER'] = 'login';
$_SERVER['PHP_AUTH_PW'] = 'pass';
своим внешним логином и паролем, иначе яндекс работать пока не может.

Регистрируемся на https://dialogs.yandex.ru/
Создаем свой диалог, в поле Webhook URL ставим свой адрес
https://адрес_сервера/webhook_yandex.php
Всё, можно переходить в закладку тестирования и пробовать подавать команды ))

Текущие проблемы:
1. Сервис яндекса требует ответа от нашего сервера в течение 1,5 секунд, тогда как у меня время ответа доходит до 8 секунд.
Поэтому нам приходится отвечать

Код: Выделить всё

$speech = 'Команда принята';
вместо закомментированного

Код: Выделить всё

//$speech = current(SQLSelectOne($sqlQuery));
2. И всё бы ничего, но проблема из п.1 не позволяет мне пройти модерацию в Яндексе, так как модератор на все вопросы получает Команда принята и совершенно справедливо считает, что мой сервис фигня какая-то :) А без модерации я не могу его проверить на живой Алисе.
Такие дела, если есть предложения как решить проблемы сервиса, пишите!
За это сообщение автора vitt76 поблагодарили (всего 6):
skysilver (Ср окт 31, 2018 10:43 am) • chimik (Пн янв 07, 2019 8:23 pm) • directman66 (Ср янв 09, 2019 1:08 pm) • C_3AXAPOB (Сб янв 19, 2019 8:19 pm) • Dicont (Пн фев 18, 2019 10:49 pm) • bullet55 (Пт сен 27, 2019 11:14 am)
Рейтинг: 6.98%
Broadlink + Orange Pi PC ARMBIAN 5.31
o.a.ryzhov
Сообщения: 5
Зарегистрирован: Сб окт 27, 2018 2:07 am
Благодарил (а): 1 раз
Поблагодарили: 0

Re: Альтернативное решение по интеграции с Яндекс.диалоги (Алиса)

Сообщение o.a.ryzhov » Пн ноя 05, 2018 1:47 am

Делаю по вашей инсрукци, но при регистрации ругается на вебхук ссылку, пишет "1. Невалидный JSON", как такое обойти, что я делаю не так? причем на сервер мажордома приходит команда "test"
Последний раз редактировалось o.a.ryzhov Пн ноя 05, 2018 4:17 pm, всего редактировалось 1 раз.
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: Альтернативное решение по интеграции с Яндекс.диалоги (Алиса)

Сообщение skysilver » Пн ноя 05, 2018 2:01 pm

Ужас. Зачем цитировать весь пост?! Убирай давай овер квоттинг.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Аватара пользователя
vitt76
Сообщения: 372
Зарегистрирован: Вс апр 09, 2017 2:36 pm
Благодарил (а): 101 раз
Поблагодарили: 51 раз

Re: Альтернативное решение по интеграции с Яндекс.диалоги (Алиса)

Сообщение vitt76 » Пн ноя 05, 2018 3:15 pm

o.a.ryzhov писал(а):
Пн ноя 05, 2018 1:47 am
Делаю по вашей инсрукци, но при регистрации ругается на вебхук ссылку, пишет "1. Невалидный JSON", как такое обойти, что я делаю не так? причем на сервер мажордома приходит команда "test"
Попробуйте запустить напрямую свой webhook
https://адрес_сервера/webhook_yandex.php
в браузере и посмотрите что он выдаст.
Broadlink + Orange Pi PC ARMBIAN 5.31
o.a.ryzhov
Сообщения: 5
Зарегистрирован: Сб окт 27, 2018 2:07 am
Благодарил (а): 1 раз
Поблагодарили: 0

Re: Альтернативное решение по интеграции с Яндекс.диалоги (Алиса)

Сообщение o.a.ryzhov » Пн ноя 05, 2018 4:37 pm

vitt76 писал(а):
Пн ноя 05, 2018 3:15 pm
Попробуйте запустить напрямую свой webhook
https://адрес_сервера/webhook_yandex.php
в браузере и посмотрите что он выдаст.
Warning: Creating default object from empty value in C:\_majordomo\htdocs\webhook_yandex.php on line 38 Warning: Creating default object from empty value in C:\_majordomo\htdocs\webhook_yandex.php on line 41 {"response":{"text":"\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430...","tts":"\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430...","end_session":false},"session":{"message_id":null,"session_id":null,"user_id":null},"version":"1.0"}
Аватара пользователя
vitt76
Сообщения: 372
Зарегистрирован: Вс апр 09, 2017 2:36 pm
Благодарил (а): 101 раз
Поблагодарили: 51 раз

Re: Альтернативное решение по интеграции с Яндекс.диалоги (Алиса)

Сообщение vitt76 » Ср ноя 07, 2018 9:43 am

Надо скрыть эти глупые варнинги и будет json валидный. Для этого используйте что-то типа
error_reporting(0);
Broadlink + Orange Pi PC ARMBIAN 5.31
o.a.ryzhov
Сообщения: 5
Зарегистрирован: Сб окт 27, 2018 2:07 am
Благодарил (а): 1 раз
Поблагодарили: 0

Re: Альтернативное решение по интеграции с Яндекс.диалоги (Алиса)

Сообщение o.a.ryzhov » Чт ноя 08, 2018 1:20 am

vitt76 писал(а):
Ср ноя 07, 2018 9:43 am
Надо скрыть эти глупые варнинги и будет json валидный. Для этого используйте что-то типа
error_reporting(0);
поставил error_reporting(0); сразу после <?php во вторую строчку, результат тот же
Sinigamiruyk
Сообщения: 1
Зарегистрирован: Чт ноя 01, 2018 3:10 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Альтернативное решение по интеграции с Яндекс.диалоги (Алиса)

Сообщение Sinigamiruyk » Ср ноя 14, 2018 12:23 pm

Если у кого возникнет проблема с ошибкой диалогов "Невалидный JSON" то обратите внимание на кодировку. Например я изначально создал файл в кодировке Windows-1251 и получал ошибку пока не установил кодировку UTF-8 (если у кого-то выбор UTF-8 с BOM и Без BOM то надо выбирать без BOM)

Так же наверное будет правильным добавить заголовок указывающий что данный документ отдает JSON. Добавить эту строчку
header('Content-Type: application/json');
например после <?php
Аватара пользователя
Ron
Сообщения: 480
Зарегистрирован: Пт окт 27, 2017 6:44 pm
Благодарил (а): 144 раза
Поблагодарили: 70 раз

Re: Альтернативное решение по интеграции с Яндекс.диалоги (Алиса)

Сообщение Ron » Ср ноя 14, 2018 2:39 pm

Sinigamiruyk писал(а):
Ср ноя 14, 2018 12:23 pm
пока не установил кодировку UTF-8 (если у кого-то выбор UTF-8 с BOM и Без BOM то надо выбирать без BOM)
Классику никто не отменял. Иначе головная боль и потраченное время с нервами )
chimik
Сообщения: 77
Зарегистрирован: Пн янв 09, 2017 1:39 pm
Благодарил (а): 87 раз
Поблагодарили: 11 раз

Re: Альтернативное решение по интеграции с Яндекс.диалоги (Алиса)

Сообщение chimik » Пн янв 07, 2019 8:31 pm

Здорово.!!!!! У меня заработала на Irbis. Пока тестирую. Вопросы;
"Не показывать в каталоге"- отмечать?
Возможно ли тестирование голосом?
Ответить