Страница 1 из 4

[Настройка] Альтернативное решение по интеграции с google assistant: настройка собственного webhook для dialogflow

Добавлено: Ср окт 10, 2018 3:31 pm
vitt76
Здесь описано как получить интеграцию с google assistant через connect
https://kb.smartliving.ru/google-assist ... majordomo/
В этой же статье читаем:
*Почему обязательна работа через сервис CONNECT? Это особенность работы навыков ассистента -- они могут работать только через интернет-сервер, доступный по доменному имени и (важно) имеющий действующий и удостоверенный SSL-сертификат. Вы можете сделать собственный частный навык и работать с ним в тестовом режиме без публикации в каталоге, но вам всё равно понадобится, чтобы ваш сервер удовлетворял вышеописанным условиям.*
Вот и будем делать свой частный навык, который будем использовать сами.
Готовый результат выглядит на смарте так:
СпойлерПоказать
photo_2018-10-08_14-29-27.jpg
photo_2018-10-08_14-29-27.jpg (44.39 КБ) 8890 просмотров
Итак, поехали.
1. Нам нужен ssl-сертификат для нашего сервера. Я пользуюсь бесплатным ddns-сервером для того, чтобы иметь внешнее доменное имя, для нас этого вполне достаточно. Система у меня установлена на orange pi, сервер apache, так что пользуемся https://certbot.eff.org/docs/using.html#apache и через 10 минут будет всё готово.
Также подходит сертификат, который выдает нам сервис vpnki!

2. Модуль API.AI нам не поможет и не нужен, он для других целей.
При создании actions можно опираться на это видео: https://www.youtube.com/watch?v=r9EKAbrOUS8
Я оставил default action нетронутым, только включил в нем Fulfillments
СпойлерПоказать
1.png
1.png (51.15 КБ) 8760 просмотров
Welcome-action я удалил, чтобы он не мешал.
Свой action называем как угодно и заполняем как на картинках
СпойлерПоказать
2.png
2.png (36.37 КБ) 8760 просмотров
3.png
3.png (60.43 КБ) 8760 просмотров
В общих настройках обязательно проверяем, чтобы стояло API v.1
СпойлерПоказать
4.png
4.png (68.2 КБ) 8760 просмотров
3. Создаем свою ответную часть webhook, например, файл webhook.php, который обязательно должен лежать в корне сайта.

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

<?php

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

//декодим данные
$json = json_decode($requestBody);
$text = $json->result->resolvedQuery;

//передаем команду в систему
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));

if ($text == 'GOOGLE_ASSISTANT_WELCOME') {$speech ='Привет, чем могу помочь?';}
//отвечаем гуглу
$response = new \stdClass();
$response->speech = $speech;
$response->displayText = $speech;
$response->source = "webhook";
echo json_encode($response);

?>
В настройки Fulfillment Dialogflow вписал путь до файла и данные внешней авторизации
СпойлерПоказать
412_image.png
412_image.png (230.5 КБ) 8890 просмотров
Все, можно через телефон, можно через тест на Dialogflow попробовать вызвать и проверить свой action.

Решение уже лишено детских болезней, спасибо sorochan.ilya и ovcher за помощь!

Re: Альтернативное решение по интеграции с google assistant: настройка собственного webhook для dialogflow

Добавлено: Ср окт 10, 2018 5:13 pm
Chainik
Немного не по вопросу, но по делу.
А если в сценарии заменить getURL на file_get_contents не ускорится его выполнение?

Re: Альтернативное решение по интеграции с google assistant: настройка собственного webhook для dialogflow

Добавлено: Ср окт 10, 2018 5:26 pm
vitt76
Chainik, спасибо, попробуем :)

Re: Альтернативное решение по интеграции с google assistant: настройка собственного webhook для dialogflow

Добавлено: Чт окт 11, 2018 12:54 pm
vitt76
Выше немного подробнее расписал создание actons.
С удовольствием сообщаю, что всё прекрасно работает через SSL-сертификат VPNKI :)

Re: Альтернативное решение по интеграции с google assistant: настройка собственного webhook для dialogflow

Добавлено: Чт окт 11, 2018 5:34 pm
vitt76

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

<?php

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

//декодим данные
$json = json_decode($requestBody);
$text = $json->originalRequest->data->inputs[0]->arguments[0]->textValue;

//передаем $text в обертку
@file_put_contents("webhook.dat", $text);
$url = 'http://localhost/command.php?qry='.urlencode($text).'&Submit=Say';
$match = @file_get_contents($url);
$re = '/<\/b>: (.+?)<br/';
$i = preg_match($re, $match, $matches);
if ($matches[1] == '') $speech = "Команда принята"; else $speech = $matches[1];

//отвечаем гуглу
$response = new \stdClass();
$response->speech = $speech;
$response->displayText = $speech;
$response->source = "webhook";
echo json_encode($response);

?>
Новый вебхук работает БЕЗ сценария и получает правильный ответ.

Re: Альтернативное решение по интеграции с google assistant: настройка собственного webhook для dialogflow

Добавлено: Чт окт 11, 2018 8:11 pm
sorochan.ilya
Спасибо Все заработало, только у меня немного другой json прилетал, поэтому заменил:

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

//декодим данные
$json = json_decode($requestBody);
$text = $json->result->resolvedQuery;

Re: Альтернативное решение по интеграции с google assistant: настройка собственного webhook для dialogflow

Добавлено: Чт окт 11, 2018 9:02 pm
ovcher
Илья а не было так чтобы была неактивна Россия и еще целая куча стран в Location targeting. Потому что и у меня и у Витали активно для включения/выключения только 12 стран все остальное серое. Только у Витали под серым все галки включены, а у меня выключены в том числе и Россия, в результате если в симуляторе ставлю штатовскую или немецкую локацию все нормуль, если русскую локацию то Пишет что приложение в этом регионе не поддерживается, отже самое и с мобилой. Может знаете как побороть?

Re: Альтернативное решение по интеграции с google assistant: настройка собственного webhook для dialogflow

Добавлено: Пт окт 12, 2018 9:33 am
sorochan.ilya
ovcher писал(а):
Чт окт 11, 2018 9:02 pm
Илья а не было так чтобы была неактивна Россия и еще целая куча стран в Location targeting. Потому что и у меня и у Витали активно для включения/выключения только 12 стран все остальное серое. Только у Витали под серым все галки включены, а у меня выключены в том числе и Россия, в результате если в симуляторе ставлю штатовскую или немецкую локацию все нормуль, если русскую локацию то Пишет что приложение в этом регионе не поддерживается, отже самое и с мобилой. Может знаете как побороть?
Нет, у меня не было такой проблемы.
PS Чтобы не было сообщения "Неизвестная команда" при запуске добавил:

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

if ($text == 'GOOGLE_ASSISTANT_WELCOME'){$speech ='Привет!';}
//отвечаем гуглу
$response = new \stdClass();
$response->speech = $speech;
$response->displayText = $speech;
$response->source = "webhook";
echo json_encode($response);

Теперь при запуске говорит: "Привет!"

Re: Альтернативное решение по интеграции с google assistant: настройка собственного webhook для dialogflow

Добавлено: Пт окт 12, 2018 1:39 pm
vitt76
sorochan.ilya, спасибо, еще раз поправил шапку!

Re: Альтернативное решение по интеграции с google assistant: настройка собственного webhook для dialogflow

Добавлено: Вс окт 14, 2018 1:51 pm
sorochan.ilya
Для версии 2 нужно изменить:

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

//декодим данные
$json = json_decode($requestBody);
$text = $json->queryResult->queryText;

//отвечаем гуглу
$response = new \stdClass();
$response->fulfillmentText = $speech;
$response->source = "webhook";
echo json_encode($response);