Google Dialogflow v2 с использованием c # - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь создать веб-хук, но практически нет документации о том, как это сделать в c #.Цель состоит в том, чтобы ответить на вызов webhook вопросом, требующим от пользователя выбора ответа (было бы неплохо использовать для этого обучающие фразы!).Пока мне удалось дать только базовый ответ, поэтому я пытаюсь остановиться на этом ....

Теперь я прочитал , что ответ должен выглядеть примерно так :

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "We have more to do"
            }
          }
        ]
      }
    }
  }
}

Проблема в том, что я не знаю, как это сделать в c #.В настоящее время у меня есть этот метод:

public async Task<string> ProcessAsync(WebhookRequest request)
{
    var response = new WebhookResponse
    {
        FulfillmentText = "Something went wrong"
    };

    var keyValuePair = request.QueryResult.Parameters.Fields.SingleOrDefault(m => m.Key.Equals("categories"));
    if (keyValuePair.Equals(default(KeyValuePair<string, Value>))) return response.ToString();

    var category = keyValuePair.Value;
    var questions = await ListScenariosAsync(category.StringValue);

    if (questions.Count != 1) return response.ToString();

    var question = questions.First();
    response = new WebhookResponse
    {
        Payload = new Struct()
    };
    return response.ToString();
}

Это мой собственный метод, который вызывается, когда POST отправляется в мой API:

/// <inheritdoc />
/// <summary>
/// Used for an google home api calls
/// </summary>
[RoutePrefix("google")]
public class GoogleController : ApiController
{
    private readonly IGoogleHomeProvider _provider;

    /// <inheritdoc />
    public GoogleController(IGoogleHomeProvider questionProvider) => _provider = questionProvider;

    /// <summary>
    /// Handles a webhook request
    /// </summary>
    /// <param name="model">The request model</param>
    /// <returns></returns>
    [HttpPost]
    [Route("")]
    public async Task<HttpResponseMessage> Post(WebhookRequest model)
    {
        var result = await _provider.ProcessAsync(model);
        var response = Request.CreateResponse(HttpStatusCode.OK);
        response.Content = new StringContent(result, Encoding.UTF8, "application/json");
        return response;
    }
}

строкачто гласит Payload = new Struct() это запутанная часть.Видимо, это типа Google.Protobuf.WellKnownTypes.Struct.Как я могу создать что-то, что будет представлять json выше?

Это все часть приложения, которое я создаю для Actions в Google, но с использованием метода DialogFlow.И это должно быть выполнением.Как вы уже догадались, я новичок в этом процессе и учусь по ходу дела.То, что я хочу сделать, это вернуть вопрос (у которого есть несколько ответов), и я бы хотел, чтобы пользователь мог сказать что-то, что относится к одному из них.Например, в этом случае вопрос звучит так:

Как вы будете использовать это?

И ответы будут примерно такими:

  • Для праздников и выходных
  • Профессионально
  • Для развлечения
  • С семьей

Я упомянул обучающие фразы, потому что я не ожидаю, что пользовательзнать ответы заранее.Я хочу, чтобы они говорили свободно, а затем я попытаюсь найти ответ (и вернусь к моему API для другого выполнения) или перейду к запасному варианту, который затем, вероятно, перечислит ответы.

1 Ответ

0 голосов
/ 03 февраля 2019

Создание ответа в ac # Контроллере WebApi может быть просто:

var dialogflowResponse = new WebhookResponse
{
     FulfillmentText = "Your user response"
};
var response = Request.CreateResponse(
    HttpStatusCode.OK, dialogflowResponse, "application/json"
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...