如何在 google 上的操作上从内联编辑器过渡

eHow to transition away from inline editor on actions on google

previous Stack Overflow question 中,我避免在 Google 上的操作上使用外部 webhook 所以我需要回到内联编辑器。我解决了这个问题,但现在我又感到勇敢了。

我已经无法使用内联编辑器了,我希望能够在我的笔记本电脑上开发我的代码,在 Firebase 中对其进行测试,并发布到我的 webhook 的网站,大概是内联代码编辑器发布到的网站。事实上,我已经编写了 require 函数并从 Firebase 部署了它们。所以完整的功能已经准备就绪,我只需要将它正确地连接到 Google.

上的操作

我现在在 Actions on Google 内联编辑器中拥有的更像是一个存根。我想将该存根合并到我在 Firebase 中拥有的更成熟的逻辑中。这是内联编辑器中的内容:

const { conversation } = require('@assistant/conversation');
const functions = require('firebase-functions');

const app = conversation(); 

app.handle('intent_a_handler', conv => {
    // Implement your code here
    conv.add("Here I am in intent A");
});

app.handle('intent_b_handler', conv => {
    // Implement your code here
    conv.add("Here I am in intent B");
});

exports.ActionsOnGoogleFulfillment = functions.https.onRequest(app);

当我在 Internet 上搜索时,我看到的是从 Dialogflow 的角度进行的讨论,但正如我所说,我在“Google 上的操作”中。我想从内联编辑器过渡,使用我已有的东西,作为 basis.Can 有人解释我是如何设置它的?我很高兴在 Google 生态系统的背景下这样做。

要在您自己的系统上本地测试您自己的 webhook,我建议合并一个 Web 应用程序框架,例如 express。使用 express,您可以在本地计算机上托管代码并使其响应来自 Google 上的 Actions 的请求。在您的情况下,您将替换与 Firebase 函数包相关的所有代码。以下是 Google 上 Actions 的简单网络钩子示例:

const express = require('express');
const bodyParser = require('body-parser')
const { conversation } = require('@assistant/conversation');

const exprs = express();
exprs.use(bodyParser.json()) // allows Express to work with JSON requests

const app = conversation();

app.handle('example intent', () => {
  // Do something
})

// More app.handle() setups

exprs.post('/', app);
exprs.listen(3000);

通过此设置,您应该能够在本地 运行 您自己的应用程序。您唯一需要做的就是安装所需的依赖项并为您的操作添加您自己的意图处理程序。此时你在自己的机器上有一个 webhook 运行ning,但这不足以将它用作 Google 上的 Actions 中的 webhook,因为它 运行 在本地并且不是' t public只能通过互联网获得。

因此,我们将使用一个名为 ngrok 的工具。使用 ngrok,您可以创建一个 public https 地址,该地址 运行 将所有消息发送到您的本地计算机。这样你就可以使用 ngrok 地址作为你的 webhook URL。现在您可以根据需要进行任意数量的代码更改,Google 上的操作将在您开发时自动使用最新的更改。无需上传并等待 Firebase 执行此操作。

明确一点:Ngrok 应该只用于开发。完成动作开发后,您应该将所有代码上传到云服务或将其托管在您自己的服务器上(如果有的话)。 (免费计划)ngrok URL 通常每 6 小时过期一次。所以它不是开发以外的任何合适的解决方案。