Данные не могут быть получены из элемента HTML <iframe>
, который является только блоком отображения. Данные могут быть получены через вызов API; в Dialogflow вы получаете эти данные с Fulfillments .
Проверьте нижеприведенный поток, чтобы развернуть приложение Node в App Engine, обслуживать чат Dialogflow в конечной точке по умолчанию и публиковать данные выполнения в /fulfillment
конечной точке.
A) Настройка выполнения
Обратите внимание на следующее:
- URL: введите конечную точку HTTPS Express POST (например, https://[PROJECT_ID].appspot.com/fulfillment)
- оставьте все остальные поля пустыми
- Домены: включить webhook для всех доменов
- После создания и сохранения вам по-прежнему необходимо включить выполнение для каждого намерения (и его последующего исполнения, если таковое имеется), которое вы используете
Б) Применение
- Создание Node-приложения в App Engine из консоли
Затем разверните это приложение, заменив <iframe>
на ваше:
app.yaml
runtime: nodejs8
package.json
{
"dependencies": {
"actions-on-google": "^2.5.0",
"dialogflow-fulfillment": "^0.5.0",
"express": "^4.16.4"
},
"scripts": {
"start": "node index.js"
}
}
index.js
'use strict';
const {WebhookClient} = require('dialogflow-fulfillment');
const express = require('express');
const bodyParser = require('body-parser');
var path = require('path');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
function WebhookProcessing(req, res) {
const agent = new WebhookClient({request: req, response: res});
console.log('Dialogflow Request headers: ' + JSON.stringify(req.headers));
console.log('Dialogflow Request body: ' + JSON.stringify(req.body));
console.log(JSON.stringify(req.body.queryResult.queryText));
console.log(JSON.stringify(req.body.queryResult.fulfillmentText));
}
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname + '/index.html'));
});
app.post('/fulfillment', function (req, res) {
WebhookProcessing(req, res);
});
const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}...`);
});
index.html
<!DOCTYPE html>
<html lang=\"en\">
<head><meta name=\"viewport\" content=\"width=device-width, initial- scale=1, user-scalable=no\"/>
<title>Dialog</title>
</head>
<body>
<div align="center">
<iframe
allow="microphone;"
width="350"
height="430"
src="https://console.dialogflow.com/api-client/demo/embedded/xxxxxxxxxxxxxxxxxxxxxxxxxxx">
</iframe>
</div>
</body>
</hmtl>
Когда пользователь начинает разговор в чате, функция WebhookProcessing
выводит журналы тела и заголовка каждого запроса (каждое сообщение, отправленное пользователем), а также извлекает и регистрирует значения обоих полей queryText
(пользователь сообщение) и fulfillmentText
(ответ бота).
Обратите внимание, что это всего лишь пример интеграции в App Engine, вы также можете рассмотреть возможность развертывания облачной функции, и если вы работаете с базой данных Firebase, тогда вы можете использовать встроенный редактор и развернуть функцию из Dialogflow .