Google助手验证Dialogflow Webhook中的用户输入

时间:2018-09-27 18:48:10

标签: javascript dialogflow google-assistant-sdk

首先提供一些信息:我的Google Assistant聊天机器人当前具有2个功能(意图),即注册一个用户(输入:用户的姓名和姓氏,出生日期和ID)并向另一位用户付款(输入:收件人的姓名和ID以及要支付的金额)。我已经完成了所有设置,并通过index.js webhook链接到了Firebase。

以下是我目前用于这两种意图的代码:

<textarea class="input" name="adresse" cols=50 rows=10 readonly="readonly" id="street" value=""></textarea>
<input style="width:130px;text-align: left" class="input" type="text" name="kundennr" id="kundennr" value="">

<!-- <?php
$sql = "SELECT * FROM `kunde` ORDER BY `kundennummer` ASC";

foreach ($dbh->query($sql) as $nav) {

$address = $nav['adresse']; 
$name = $nav['kundennummer'];

echo " 
<input type='text' name='textfield' id='textfield$name' value='$address'>
<a> |  Kundennr: </a><a href='#' id='text' onclick='updateTxt(this);' >$name</a><br>
";

    }

?> -->

<input type="text" name="textfield" id="textfieldstreet1" value="Add1..">
<a> |  Kundennr: </a><a href="#" id="text" onclick="updateTxt(this);">street1</a><br>

<input type="text" name="textfield" id="textfieldstreet2" value="Add2...">
<a> |  Kundennr: </a><a href="#" id="text" onclick="updateTxt(this);">street2</a><br>

<input type="text" name="textfield" id="textfieldstreet3" value="Add3...">
<a> |  Kundennr: </a><a href="#" id="text" onclick="updateTxt(this);">street3</a><br>

<input type="text" name="textfield" id="textfieldstreet4" value="Add4...">
<a> |  Kundennr: </a><a href="#" id="text" onclick="updateTxt(this);">street4</a><br>

我要实现一些非常简单的要求,即验证指定的ID大于6位,并且最好使出生日期在合理范围内(可能在1910年至2010年之间)。

问题是我无法找到有关如何执行此操作的清晰指南。我最初遵循的是有关Google Assistant和Dialogflow的Google教程以及其他一些在线指南。但是我感觉那并没有使我对助手的基本开发知识有所了解。

我查看了后续意图,但是如果我的要求没有得到满足,我特别想打电话给他们。简单来说:

app.intent('onboard user', (conv, {name, surname, birthdate, ID}) => {
  var user = db.collection("Users").doc(ID);

  var setUser = user.set({
    "FirstName": name,
    "Surname": surname,
    "DateofBirth": new Date(birthdate),
    "ID": ID,
    "AccountCreated": new Date(),
  });
    conv.close('Is this correct? Your full name is ' + name + ' ' + surname + '. You were born on ' + birthdate + ' and your ID is ' + ID);
});

app.intent('payment', (conv, {recipient, amount, ID}) => {
  var transactionRef = db.collection("Transactions").doc(ID);

  var setTransaction = transactionRef.set({
  "Recipient": recipient,
  "Amount": amount,
  "ID": ID,
  "Date": new Date(),
});
  conv.close('Is this correct? You wish to pay ' + recipient + ' with ID ' + ID + ' ' + amount.amount + ' ' + amount.currency);
});

因此,如果我能在此方面寻求帮助,以及寻求任何有用的指南/教程作为扩展对助手开发的理解的良好资源,那将不胜感激。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

首先:您不应该使用conv.close(your answer),因为这样会结束对话。如果您使用该助手,助理将简单地回答,然后您会听到耳塞的声音,以进行关闭操作。

代替使用conv.ask("your question")来回答用户的问题,然后要求更多输入。您可以为每个意图使用多个conv.ask()语句。因此,第一个可用于实际向用户提供信息。

对于您使用的第一个示例,我将其转换为:

conv.ask('Thanks. I understood, that your full name is ' + name + ' ' + surname + '. You were born on ' + birthdate + ' and your ID is ' + ID);
conv.ask('Is this correct?')

首先重要的是,向用户提供有关用户输入内容的信息(使用语音,这非常重要,因为他们没有其他反馈)。然后问一个问题,使用户知道她可以(实际上应该)再次说话。

第二:关于验证输入:这是正常的Javascript。因此,如上所示,您可以再次执行以下操作:

if (ID.length < 6){
    conv.ask(`I understood your ID to be ${ID}. But it should be at least six digits long. Can you repeat the ID please?`);
} else {
    // the code from above
}

此示例使用JS模板字符串。我更喜欢它们而不是字符串连接。但是您必须使用反引号才能使它们工作!但这取决于您选择哪种样式。

最后:考虑使用SSML。尤其是在ID使用字符的情况下,使用元素会很有帮助,因为您可以使它单独拼写每个字符,而不是尝试从中拼出一个单词(对于ID来说,这听起来很奇怪)。但是,当然,前两件事是重要的部分。您可以随后完善响应:-)