かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

タイプセーフな Clova Extension の開発環境を求めて on Azure Functions その2

1 つ前の記事ではタイプセーフにしたいと思って頑張った結果 TypeScript にトライしてみました。

blog.okazuki.jp

今回は C# でいってみようと思います。

開発環境

とりあえず Windows, macOS, Linux あたりで行けるはずですが私の環境は以下のような感じです。

  • Windows 10
  • .NET Core 2.1
  • Azure Functions Core Tools v2(preview)
  • Visual Studio Code + Azure Functions 拡張 + Azure 拡張

やってみよう

.NET Core の開発環境を整えてたら dotnet コマンドが使えるのと Azure Functions Core Tools v2 を入れてたら func コマンドが使えるようになってるので、この 2 つを基本的に使います。

プロジェクトを作成

以下のコマンドを適当なフォルダで打って土台を作成します。

func init                       # Select a worker runtime で dotnet を選択
func new                     # HttpTrigger を選択して Select a template: Function name: で Clova と入力

オプションですが Visual Studio 2017 で開くときはソリューションファイルがあるといいのでついでに作っておきます。

dotnet new sln
dotnet sln add 作成されたcsprojファイルの名前

作業開始

では、Visual Studio Code でフォルダを開きましょう。コマンドプロンプトなり PowerShell を開いているなら code . で Visual Studio Code が立ち上がってきます。

Clova の Extension の C# 用の公式 SDK は無いので OSS のものを利用します。

github.com

作者の kennakamu さん自身による解説記事も Qiita に上がってます。

qiita.com

では、追加していきましょう。以下のコマンドを叩きます。

 dotnet add package CEK.CSharp

dotnet build でビルドしておくか Visual Studio Code で Ctrl + Shift + B をしてタスクの build を実行しておきましょう。

Clova.cs というファイルが func new で作られているのでコードを書いていきます。 コードを書くときの Tips としてはクラスとかを使おうとしたときに、こんなクラスなんて知らないよ!みたいなエラーが出るのですが、それは using (JavaScript でいうところの import とか) を追加しないとなのですが、エラーのでてるところで Ctrl + . を押すとクイックフィックスが出てきて提案してくれるので、選択すれば勝手に using が追加されます。

f:id:okazuki:20180912104435p:plain

存在しないメソッドを呼び出すようなことをしても Ctrl + . でメソッドを生成してくれます。そこら辺を駆使しながら書いていきます。

using System.IO;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs.Host;
using Newtonsoft.Json;
using Microsoft.Extensions.Logging;
using CEK.CSharp;
using System.Threading.Tasks;
using CEK.CSharp.Models;
using System;

namespace LINEDotnet
{
    public static class Clova
    {
        [FunctionName("Clova")]
        public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, ILogger log)
        {
            var client = new ClovaClient();
            var request = await client.GetRequest(req.Headers["SignatureCEK"], req.Body);
            switch (request.Request.Type)
            {
                case RequestType.LaunchRequest:
                    return ProcessLanuchRequest(request);
                case RequestType.IntentRequest:
                    return ProcessIntentRequest(request);
                default:
                    return new OkObjectResult(new CEKResponse());
            }
        }

        private static IActionResult ProcessIntentRequest(CEKRequest request)
        {
            var response = new CEKResponse();
            switch (request.Request.Intent.Name)
            {
                case "ThrowDiceIntent":
                    response.AddText("サイコロをふりたいんだね");
                    break;
                default:
                    response.AddText("ごめんね!よくわかんない!");
                    break;
            }
            return new OkObjectResult(response);
        }

        private static IActionResult ProcessLanuchRequest(CEKRequest request)
        {
            var response = new CEKResponse();
            response.AddText("こんにちは!");
            return new OkObjectResult(response);
        }
    }
}

F5 キーを押すと Visual Studio Code 上で動き始めます。関数を呼び出すための URL がログに出てくると思います。それに対して ngrok あたりで適当にインターネットからアクセスできるようにして LINE Developer Center のスキルのテスト画面からつついてみると…

f:id:okazuki:20180912110206p:plain

動いた!!もちろんローカルデバッグも出来ます。

f:id:okazuki:20180912110318p:plain

あとは、Azure Functions を Azure 上に作ってデプロイすれば完璧ですね!

まとめ

とりあえずこれで自分が今現在も書くことがちゃんとできる言語の JavaScript, TypeScript, C# on Azure Functions で LINE Clova のスキルを開発出来そうです。

大体できることがわかると満足するタイプなので何か作るかは未定(多分作らない?)