Quantcast
Channel: かずきのBlog@hatena
Viewing all articles
Browse latest Browse all 1387

Google アシスタントのエージェントを Azure Functions + C# で作る

$
0
0

Dialogflow v2 に対応した C# の SDK が実はこっそりあります。 1.0.0-beta2 (2018/1104 現在) なので正式版ではないですが、きっと近いうちに出ると思う!!

以下のパッケージを入れましょう。

www.nuget.org

Visual Studio で追加するときはプレリリースパッケージのチェックを入れてから検索しましょう。

入れたらあとは JSON をパースしたりするだけです。ただ、JSON.NET ではなく Google の提供している JSON のパーサーを使います。Google.Protobuf の名前空間にあります。

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Google.Cloud.Dialogflow.V2;
using Google.Protobuf;
usingstatic Google.Cloud.Dialogflow.V2.Intent.Types.Message.Types;
usingstatic Google.Cloud.Dialogflow.V2.Intent.Types;
using Microsoft.Azure.WebJobs.Hosting;

namespace HogeHoge
{
    publicstaticclass Function1
    {
        [FunctionName("Function1")]
        publicstatic async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequest req,
            ILogger log)
        {
            var parser = new JsonParser(JsonParser.Settings.Default.WithIgnoreUnknownFields(true)); // パーサーを作る
            var webhookRequest = parser.Parse<WebhookRequest>(await req.ReadAsStringAsync()); // パースする// 例えば Webhook がすべてのパラメータがそろった状態で呼び出されたかを確認したりif (!webhookRequest.QueryResult.AllRequiredParamsPresent)
            {
                log.LogInformation("This request does not have all required parameters");
                returnnew OkResult();
            }
            // パラメーターをとって色々したり
            var requestedParameters = webhookRequest.QueryResult.Parameters;

            // 戻りは、WebhookResponse を返せば OK
            var webhookResponse = new WebhookResponse();
            webhookResponse.FulfillmentText = $"応答内容";
            // 結果の JSON も Google.Protobuf を使ってシリアライズreturnnew ProtcolBufJsonResult(webhookResponse, JsonFormatter.Default);
        }
    }

    // Google.Protobuf を使ってシリアライズする IActionResult の実装publicclass ProtcolBufJsonResult : IActionResult
    {
        privatereadonlyobject _obj;
        privatereadonly JsonFormatter _formatter;

        public ProtcolBufJsonResult(object obj, JsonFormatter formatter)
        {
            _obj = obj;
            _formatter = formatter;
        }

        public async Task ExecuteResultAsync(ActionContext context)
        {
            context.HttpContext.Response.Headers.Add("Content-Type", new Microsoft.Extensions.Primitives.StringValues("application/json"));
            var stringWriter = new StringWriter();
            _formatter.WriteValue(stringWriter, _obj);
            await context.HttpContext.Response.WriteAsync(stringWriter.ToString());
        }
    }
}

あとはデプロイして関数のエンドポイントを Dialogflow のフルフィルメントに設定して完了。

早く正式版でないかなぁ。


Viewing all articles
Browse latest Browse all 1387

Trending Articles