Я создал чат-бота в Dialogflow, который информирует пользователя о членах моей (расширенной) семьи и о том, где они живут. Я создал небольшую базу данных с MySQL, в которой хранятся эти данные, и извлекаю их с помощью скрипта PHP (размещенного на Heroku) всякий раз, когда это уместно, в зависимости от взаимодействия пользователя с чатботом.
Мой PHP-скрипт, который получает запрос POST (webhook) от Dialogflow, выглядит следующим образом:
<?php
$dbServername = '******************';
$dbUsername = '******************';
$dbPassword = '******************';
$dbName = '******************';
$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName);
header('Content-Type: application/json');
$method = $_SERVER['REQUEST_METHOD'];
if($method == 'POST'){
$requestBody = file_get_contents('php://input');
$json = json_decode($requestBody);
$action = $json->result->action;
$first_name = $json->result->contexts[0]->parameters->{'given-name'};
$last_name = $json->result->contexts[0]->parameters->{'last-name'};
$lifespan = $json->result->contexts[0]->lifespan;
$sql = "SELECT * FROM family WHERE name LIKE '%$first_name%$last_name%';";
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);
if ($resultCheck > 0) {
while ($row = mysqli_fetch_assoc($result)) {
$person = $row;
}
switch ($action) {
case 'Name':
$speech= "$first_name is my" . $person["name"] . ".";
break;
case 'Location':
$speech = "$first_name is living in {$person["location"]}.";
break;
default:
$speech = "Please ask me something more relevant to my family";
break;
}
}
else {
$speech = "Sorry, $first_name $last_name is not a member of my family.";
}
$response = new \stdClass();
$response->speech = $speech;
$response->displayText = $speech;
$response->source = "agent";
echo json_encode($response);
}
else
{
echo "Method not allowed";
}
?>
Я могу сразу увидеть в Dialogflow ответ json, который я получаю от него, в моем PHP-скрипте. Однако Google Assistant не предоставляет эту опцию. Проблема также заключается в том, что ответ json при использовании Google Assistant значительно отличается от ответа при использовании только Dialogflow.
Мой вопрос: как я могу «увидеть», что JSON отправляется в мой PHP-скрипт при использовании Google Assistant? Другими словами, как я могу «увидеть» все $requestBody
переменная сразу?
Например, я пытался использовать https://webhook.site/ и я заполнил следующую информацию, чтобы создать новый URL / конечную точку:
Default status code -> 200
Content Type -> application/json
Timeout before response -> 0
Response body -> {
"speech": "WEBHOOK",
"displayText": "WEBHOOK",
"source": "agent"}
Тело ответа имеет ту же структуру, что и в моем PHP-скрипте. Однако по какой-то причине Google Assistant не получает ответ json от этой пользовательской конечной точки (в то время как Dialogflow действительно получает его отлично). Поэтому я не могу точно идти дальше и посмотреть, что он посылает Dialogflow & Google Assistant в случае намерений, которые в дальнейшем вызываются контекстом …
Простое решение: добавить протоколирование
Добавьте в ваш код сообщение об ошибке, которое печатает отформатированный JSON. Примерно так сразу после создания $json
будет записывать его в ваш обычный файл журнала HTTP:
error_log( json_encode( $json, JSON_PRETTY_PRINT ) );
После каждого запроса вы можете просматривать журнал ошибок HTTP, чтобы увидеть, что было отправлено. (Как вы отметили в комментариях, вы можете сделать это с heroku logs
на героку в терминале в каталоге вашего проекта.)
Если вы хотите, чтобы он был отправлен в другое место, вы можете изучить документацию для журнал ошибок() для получения подробной информации о том, как отправить его на адрес электронной почты (если ваша конфигурация поддерживает это) или в другой файл. Например, это будет записывать вещи в файл с именем /tmp/json.txt
:
error_log( json_encode( $json, JSON_PRETTY_PRINT ), 3, "/tmp/json.txt" );
Более сложное решение: используйте прокси
Вы также можете использовать прокси, такой как ngrok это позволяет проверить запрос. Это даст вам публичное имя хоста, которое вы будете устанавливать для перенаправления на имя хоста, на котором работает ваша служба. Затем вы можете использовать это общедоступное имя хоста для URL выполнения в Dialogflow с путем к webhook. Когда Dialogflow отправит запрос, он перейдет на этот прокси-сервер, который перенаправит его на ваш сервис. Ваша служба отвечает на прокси-сервер, который перенаправляет его обратно в Dialogflow. Вы можете проверить как запрос, так и ответ. (ngrok работает на той же машине, что и служба, и позволяет проверять наличие другого URL-адреса, который вы можете использовать для просмотра запроса и ответа. Другие прокси-серверы могут работать по-разному. Похоже, webhook.site делает что-то похожее, но я не проверял, как его проксирование работает.)
Других решений пока нет …