我正在开发一个操作,它需要在用户同意后捕获用户的名称/电子邮件。
我发现了一个有趣的教程(https://medium.com/google-developer-experts/how-to-use-google-sign-in-for-the-assistant-b818f3de9211)。clientID是Google帐户链接中存在的clientID的“复制粘贴”。该意图被成功地调用!
const app = dialogflow({
clientId: 'my_client_id_from_google_action_ACCOUNT_LINKING.apps.googleusercontent.com'
});
app.intent("Hours", conv => {
console.log('--- ok');
const payload = conv.user.profile.payload;
if (payload) {
const name = payload.name;
const email = payload.email;
console.log('--- name: ' + name);
console.log('--- email: ' + email);
} else {
conv.ask("Not signed in yet.");
conv.ask(new Suggestion("want to sign in"));
}
});});
实际上,我无法获得用户的电子邮件/名称。
我想知道姓名和电子邮件地址。
我真的很感激你的帮助!既不填充有效载荷,也不填充conv.user.profile.token。我是这个编程语言和概念的新手,我将把整个代码。非常感谢你的时间和耐心。
完整代码index.js:
'use strict';
const functions = require('firebase-functions');
const {google} = require('googleapis');
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');
const {dialogflow,SignIn} = require("actions-on-google");
process.env.DEBUG = 'dialogflow:*';
const app = dialogflow({
clientId: '------------------sas6.apps.googleusercontent.com',
});
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
const agent = new WebhookClient({ request, response });
console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
function fallback(agent) {
agent.add(`I didn't understand`);
}
function welcome(agent) {
app.intent("Get Sign-In", conv => {
agent.add('--- ok Get Sign-In');
console.log('--- ok Get Sign-In');
const payload = conv.user.profile.payload;
if (payload) {
console.log('--- payload if');
console.log('--- name: ' + payload.name);
console.log('--- email: ' + payload.email);
} else {
console.log('--- payload else');
conv.ask("Not signed in yet.");
conv.ask(new Suggestion("want to sign in"));
}
});
}
let intentMap = new Map();
intentMap.set('Default Welcome Intent', welcome);
intentMap.set('Default Fallback Intent', fallback);
agent.handleRequest(intentMap);
});package.json:
{
"name": "dialogflowFirebaseFulfillment",
"description": "my first agent",
"version": "0.0.1",
"private": true,
"license": "Apache Version 2.0",
"author": "Google Inc.",
"engines": {
"node": "6"
},
"scripts": {
"lint": "semistandard --fix \"**/*.js\"",
"start": "firebase serve --only functions",
"deploy": "firebase deploy --only functions"
},
"dependencies": {
"firebase-functions": "2.0.2",
"firebase-admin": "^5.13.1",
"actions-on-google": "2.2.0",
"googleapis": "^27.0.0",
"dialogflow": "^0.6.0",
"dialogflow-fulfillment": "0.5.0",
"nodemailer": "^4.6.4"
}
}发布于 2019-02-05 02:00:25
您的代码中有几个问题指向了根本问题。让我们看看每一个。
基本问题:您从不要求用户登录
虽然您的代码似乎处理来自登录请求的响应,但似乎没有任何代码要求用户登录。
虽然用户还可以通过其他方式登录(例如,他们可以在您的网站上注册),但典型的方法是在响应您的意图时使用Signin助手提示他们这样做。它可能看起来像这样
app.intent('Start Signin', conv => {
conv.ask(new SignIn('To get your account details'))
})如果你在使用谷歌上的动作库。这实际上导致了另一个问题。
-您正在混合对话框流-实现和在google上的操作库
更糟糕的是,你这样做可能会引起问题。
看起来您主要是在使用对话框流实现库,因为这是Firebase函数处理程序中的设置,以及触发对agent.handleRequest(intentMap);的调用的内容。
尽管您使用调用app.intent()设置了不同的处理程序,但在欢迎意图(从其名称判断)内执行此操作,通常您不希望这样做。也没有任何设置来调用此处理程序。通常,您可以用一行设置这段代码,例如
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);由于这一行非常类似于对话框--实现一条,它使我们明白,您应该使用一个库或另一个库来实现--而不是两者兼而有之。一般来说,如果你在谷歌的东西上做动作,请坚持使用Google上的动作库。
https://stackoverflow.com/questions/54495168
复制相似问题