问题: Google Actions是否总是通过在每个用户输入上触发webhook帖子来工作,我只需要处理逻辑以便每次都解析json并且仅在找到我感兴趣的参数时做出反应?或者有没有办法控制由Google Actions API制作的webhook帖子,以便只有在通过包含感兴趣的参数值完全填充操作时才能生成它?
#细节: 我在Heroku上部署了这个nodejs应用程序: https://github.com/quique123/myjsonparser/blob/master/app.js
我将其用作Google Actions API(Number Genie)示例的webhook。在Number Genie中,用户以"与数字精灵对话开始游戏"。 Genie回应我想着一个数字......猜猜看。用户使用数字进行响应然后(并且仅在此时)运行逻辑以将猜测与答案进行比较。
但是我在google home的每个帖子请求上都进行了api调用。换句话说,每次用户与对话api交互时都会发布webhook帖子。在这里可以看到身体不包含用户输入参数,而Heroku响应"与数字精灵交谈":
2017-04-30T18:59:19.480900+00:00 heroku[router]: at=info method=POST path="/API/switches/sw1?password=123456" host=myjsonparser.herokuapp.com request_id=64d51b1c-3253-4a64-b7f5-a29a7750945b fwd="54.224.155.160" dyno=web.1 connect=1ms service=35ms status=200 bytes=254 protocol=https
2017-04-30T18:59:19.473973+00:00 app[web.1]: headers: {"host":"myjsonparser.herokuapp.com","connection":"close","accept":"*/*","content-type":"application/json; charset=UTF-8","cache-control":"no-cache","pragma":"no-cache","user-agent":"Java/1.8.0_112","x-request-id":"64d51b1c-3253-4a64-b7f5-a29a7750945b","x-forwarded-for":"54.224.155.160","x-forwarded-proto":"https","x-forwarded-port":"443","via":"1.1 vegur","connect-time":"1","x-request-start":"1493578759443","total-route-time":"0","content-length":"575"}
2017-04-30T18:59:19.474002+00:00 app[web.1]: body: {"id":"14797289-b0b8-492a-b030-bf9f05c7ea17","timestamp":"2017-04-30T18:59:19.413Z","lang":"en","result":{"source":"agent","resolvedQuery":"talk to number genie","speech":"","action":"generate_answer","actionIncomplete":false,"parameters":{},"contexts":[],"metadata":{"intentId":"688b0da5-547e-4c7a-8adc-189844834bcc","webhookUsed":"true","webhookForSlotFillingUsed":"false","intentName":"start_game"},"fulfillment":{"speech":"","messages":[{"type":0,"speech":""}]},"score":0.61},"status":{"code":200,"errorType":"success"},"sessionId":"ff2e0c97-552b-40d3-8f06-32e612476897"}
2017-04-30T18:59:19.477116+00:00 app[web.1]: postSwitch {"id":"sw1","state":"off","name":"Koko's Lamp"}
当我使用Google Actions API上的数字对其进行测试时,您可以在Heroku中看到" 44"包括check_guess:
2017-04-30T19:00:31.901297+00:00 app[web.1]: headers: {"host":"myjsonparser.herokuapp.com","connection":"close","accept":"*/*","content-type":"application/json; charset=UTF-8","cache-control":"no-cache","pragma":"no-cache","user-agent":"Java/1.8.0_112","x-request-id":"5a7a2c31-9ce5-4b02-9bac-bcef55ad6818","x-forwarded-for":"54.224.155.160","x-forwarded-proto":"https","x-forwarded-port":"443","via":"1.1 vegur","connect-time":"1","x-request-start":"1493578831899","total-route-time":"0","content-length":"573"}
2017-04-30T19:00:31.901347+00:00 app[web.1]: body: {"id":"5478dfb5-54f3-451d-b975-4f984d1ce3cb","timestamp":"2017-04-30T19:00:31.858Z","lang":"en","result":{"source":"agent","resolvedQuery":"44","speech":"","action":"check_guess","actionIncomplete":false,"parameters":{"check_guess":"44"},"contexts":[],"metadata":{"intentId":"c863e1e2-c850-45d8-9b96-b57e0b1ee77e","webhookUsed":"true","webhookForSlotFillingUsed":"false","intentName":"provide_guess"},"fulfillment":{"speech":"","messages":[{"type":0,"speech":""}]},"score":1},"status":{"code":200,"errorType":"success"},"sessionId":"ff2e0c97-552b-40d3-8f06-32e612476897"}
2017-04-30T19:00:31.903553+00:00 app[web.1]: postSwitch {"id":"sw1","state":"on","name":"Koko's Lamp"}
2017-04-30T19:00:31.907017+00:00 heroku[router]: at=info method=POST path="/API/switches/sw1?password=123456" host=myjsonparser.herokuapp.com request_id=5a7a2c31-9ce5-4b02-9bac-bcef55ad6818 fwd="54.224.155.160" dyno=web.1 connect=1ms service=5ms status=200 bytes=253 protocol=https
问题是postSwitch {}发生在两个ocassions中。
这是否就像Google操作一直有效,我只需要处理逻辑以便每次都解析json并且只有在找到check_guess时才会做出反应?或者有没有办法控制Google Actions API制作的webhook帖子,只有在通过包含参数check_guess的值完全填充操作时才能生成它?
答案 0 :(得分:3)
您只能为API.AI触发的所有操作设置一个webhook(一个静态URL)。虽然您需要解析JSON(您使用的是node.js,但JSON.parse()并不困难),您应该使用result.action
字段而不是试图找出设置的参数。这将对应于您在API.AI中设置的Action字段。
这假设您已经检查了您的行动的webhook框,当然。如果没有,你根本不会接到网络电话。
因此,例如,使用如下配置的起始意图:
它会将此JSON发送到您的webhook。
{
"originalRequest": {
"source": "google",
"data": {
"surface": {
"capabilities": [
{
"name": "actions.capability.AUDIO_OUTPUT"
}
]
},
"inputs": [
{
"arguments": [],
"intent": "assistant.intent.action.MAIN",
"raw_inputs": [
{
"query": "talk to number genie",
"input_type": 2,
"annotation_sets": []
}
]
}
],
"user": {
"user_id": "kQmX8nX9ovcS9jfb3WKmwLk9YFlHGZH05YGbc8muNI8=",
"permissions": []
},
"device": {
"locale": "en-US"
},
"is_in_sandbox": true,
"conversation": {
"conversation_id": "1493637016599",
"type": 1
}
}
},
"id": "9444bfe4-3c23-487a-84e7-fcbf1708d9e3",
"timestamp": "2017-05-01T11:10:16.694Z",
"lang": "en",
"result": {
"source": "agent",
"resolvedQuery": "GOOGLE_ASSISTANT_WELCOME",
"speech": "",
"action": "generate_answer",
"actionIncomplete": false,
"parameters": {},
"contexts": [
{
"name": "game",
"parameters": {},
"lifespan": 5
},
{
"name": "google_assistant_welcome",
"parameters": {},
"lifespan": 0
},
{
"name": "actions_capability_audio_output",
"parameters": {},
"lifespan": 0
}
],
"metadata": {
"intentId": "56da4637-0419-46b2-b851-d7bf726b1b1b",
"webhookUsed": "true",
"webhookForSlotFillingUsed": "false",
"intentName": "start_game"
},
"fulfillment": {
"speech": "",
"messages": [
{
"type": 0,
"speech": ""
}
]
},
"score": 1
},
"status": {
"code": 200,
"errorType": "success"
},
"sessionId": "1493637016599"
}
虽然可以像这样配置provide_guess意图
并将此JSON提供给webhook:
{
"originalRequest": {
"source": "google",
"data": {
"surface": {
"capabilities": [
{
"name": "actions.capability.AUDIO_OUTPUT"
}
]
},
"inputs": [
{
"arguments": [
{
"raw_text": "42",
"text_value": "42",
"name": "text"
}
],
"intent": "assistant.intent.action.TEXT",
"raw_inputs": [
{
"query": "42",
"input_type": 2,
"annotation_sets": []
}
]
}
],
"user": {
"user_id": "kQmX8nX9ovcS9jfb3WKmwLk9YFlHGZH05YGbc8muNI8=",
"permissions": []
},
"device": {
"locale": "en-US"
},
"is_in_sandbox": true,
"conversation": {
"conversation_token": "[\"_actions_on_google_\",\"game\"]",
"conversation_id": "1493637749915",
"type": 2
}
}
},
"id": "09997ef5-5c0f-4c60-a69f-af06d6e4e3f5",
"timestamp": "2017-05-01T11:22:34.377Z",
"lang": "en",
"result": {
"source": "agent",
"resolvedQuery": "42",
"speech": "",
"action": "check_guess",
"actionIncomplete": false,
"parameters": {
"guess": "42"
},
"contexts": [
{
"name": "game",
"parameters": {
"guess.original": "42",
"guess": "42"
},
"lifespan": 5
},
{
"name": "_actions_on_google_",
"parameters": {
"guessCount": 0,
"printed": "Welcome back to Number Genie. I'm thinking of a number from %s to %s. What's your first guess?",
"guess.original": "42",
"answer": 74,
"guess": "42",
"lastPrompt": "Welcome back to Number Genie. I'm thinking of a number from %s to %s. What's your first guess?",
"steamSoundCount": 0,
"fallbackCount": 0
},
"lifespan": 99
},
{
"name": "actions_capability_audio_output",
"parameters": {
"guess.original": "42",
"guess": "42"
},
"lifespan": 0
}
],
"metadata": {
"intentId": "1e46ffc2-651f-4ac0-a54e-9698feb88880",
"webhookUsed": "true",
"webhookForSlotFillingUsed": "false",
"intentName": "provide_guess"
},
"fulfillment": {
"speech": "",
"messages": [
{
"type": 0,
"speech": ""
}
]
},
"score": 1
},
"status": {
"code": 200,
"errorType": "success"
},
"sessionId": "1493637749915"
}
在您的代码中,您将在result.action
方法中检查postSwitch()
的值,然后根据此操作选择您的确切操作(generateAnswer()
或{ {1}}基于您注释掉的代码)。