Не могу заставить моего бота-мессенджера Facebook ответить моей службой

Я создал бота Api.Ai и интегрировал его со Slack и Facebook Messenger. Когда я пишу ему, он отвечает ответами, настроенными в Api.Ai как для Slack, так и для Facebook Messenger, но в части выполнения, когда Api.Ai обращается к моему сервису, он отлично работает в Slack, но я получаю нет ответа от Facebook Messenger.

Формат сообщения, которое я возвращаю со своей службы:

{
"contextOut": [
    {
        "lifespan": 2,
        "name": "weather",
        "parameters": {
            "city": "Rome"
        }
    }
],
"data": {
    "facebook": {
        "message": {
            "text": "Great success!"
        },
        "recipient": {
            "id": "1454102654663349"
        }
    },
    "slack": {
        "attachments": [
            {
                "color": "#00A399",
                "title": "Hello world!",
                "title_link": "https://www.mywebsite.se"
            }
        ],
        "text": "Horray! Great success! :)"
    }
},
"displayText": "Whatever!!",
"followupEvent": {
    "followupEvent": {
        "data": {
            "parameter": "<parameter_value>"
        },
        "name": "<event_name>"
    }
},
"source": "mywebsite.se",
"speech": "Whatever!?"
}

Идентификатор получателя Facebook берется из запроса, отправленного в мою службу.

request.result.contexts[0].parameters.Facebook_sender_id

Я проверил свой веб-перехватчик на вкладке настроек продукта в приложении Facebook.
Я подписал свое приложение на страницу, используя свой токен доступа к странице.
Я проверил следующие события в веб-перехватчиках: messages, messaging_postbacks
Я вошел в систему как администратор приложения, когда пробую использовать бота в Facebook.

У меня нет идей, должно быть что-то я пропустил?

РЕДАКТИРОВАТЬ: Я установил функцию Azure в качестве своего веб-перехватчика для целей тестирования.

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    var request = await req.Content.ReadAsAsync<ApiAiMessage>();

    log.Info($"Incoming: {JsonConvert.SerializeObject(request)}");

    var slack_message = new {
        text = $"Horray! Great success! :)",
        attachments = new[] {
            new {
                    title = "Hello world!",
                    title_link = "https://www.mywebsite.se",
                    color = "#00A399"
                 }
            }
        };

    var facebook_message = new {
            recipient = new {
                id = $"{request.result.contexts[0].parameters.Facebook_sender_id}"
                },
            message = new {
                    text = "Great success!"
                }
            };

    var response = new
    {
        data = new
            {
                facebook = facebook_message,
                slack = slack_message
            },
        speech = "Whatever!?",
        displayText = "Whatever!!",
        contextOut = new[] {
            new {
                    name = "weather",
                    lifespan = 2,
                    parameters = new {
                        city = "Rome"
                    }
                }
            },
        source = "mywebsite.se",
        followupEvent = new {
            followupEvent = new {
                name = "<event_name>",
                data = new {
                    parameter = "<parameter_value>"
                }
            }
        }
    };

    log.Info($"Outgoing: {JsonConvert.SerializeObject(response)}");

    return req.CreateResponse(HttpStatusCode.OK, response, new MediaTypeHeaderValue("application/json"));
}

person mrapan    schedule 25.04.2017    source источник
comment
Как вы на самом деле отправляете запрос в Facebook с ответом API.ai? Приведенный выше код не очень полезен для диагностики проблемы, если проблема заключается в том, что вы используете какой-то не вставленный код для отправки ответа в FB, и именно здесь происходит сбой. Кроме того, вы тестировали в Postman? Вы уверены, что отправляете запрос с правильным токеном страницы FB и параметрами?   -  person Matt R O'Connor    schedule 25.04.2017
comment
Отправка запроса с помощью Postman работает нормально, и то же самое со Slack. Бот дает ответ, вставленный в мой вопрос. Я регистрирую исходящее сообщение в своей службе и вижу, что ответ такой же при отправке запроса из Facebook Messenger. Единственная разница в том, что идентификатор получателя facebook, очевидно, отсутствует при выполнении запроса из других источников, кроме Facebook. Я отредактировал свой вопрос с помощью функции Azure, которую использую.   -  person mrapan    schedule 25.04.2017
comment
Куда вы отправляете токен FB обратно в мессенджер?   -  person Matt R O'Connor    schedule 26.04.2017


Ответы (1)


Где вы на самом деле отправляете ответ API.ai обратно в Facebook Messenger? Для этого требуются некоторые особенности FB, такие как «токен страницы», и тот факт, что он работает для Slack, но не для FB, заставляет меня думать, что это просто что-то простое, как это. Вот пример в javascript того, как будет выглядеть звонок

function callSendAPI(messageData) {
	request({
		uri: 'https://graph.facebook.com/v2.6/me/messages',
		qs: {
			access_token: config.FB_PAGE_TOKEN
		},
		method: 'POST',
		json: messageData

	}, function (error, response, body) {
		if (!error && response.statusCode == 200) {
			var recipientId = body.recipient_id;
			var messageId = body.message_id;

			if (messageId) {
				console.log("Successfully sent message with id %s to recipient %s",
					messageId, recipientId);
			} else {
				console.log("Successfully called Send API for recipient %s",
					recipientId);
			}
		} else {
			console.error("Failed calling Send API", response.statusCode, response.statusMessage, body.error);
		}
	});
}

person Matt R O'Connor    schedule 26.04.2017
comment
Это формат для отправки POST в API Facebook. Моя проблема заключалась в получении сообщения из API Facebook через API.AI в мою службу и формировании правильного ответа. Извините, если я не совсем понял это. - person mrapan; 26.04.2017