Azure Functions を使った C# での LINE Clova スキル開発と LINE bot (Messaging API) への接続 #LINEDevDay LINE Developer Day


LINE 社の公式大型技術カンファレンス「LINE DEVELOPER DAY 2018」にて、
『サーバーレスで!Clovaスキル開発入門 (C#)』というタイトルで登壇してきました。Azure Functions を使って、LINE bot (Messaging API) と連携した LINE Clova のスキルの開発についてお話ししました。この記事にはそこで使った資料やデモアプリのコードをすべて公開しています。
当日は超満員(立ち見3列)になり、中には入れなかった人もいるようです。沢山の方々に聴いていただけて大変嬉しく思います。ありがとうございます。

LINE developer day

話したこと

line clova messaging api

  • LINE Clova、Google Home、Amazon Echo の比較
  • Clova スキル (Extension) の具体的な作り方について、デモを交えながら紹介
  • LINE Messaging API との連携 (『Clova に話しかけたら何らかの処理結果を LINE に push する』の実現方法)
  • サーバーレスとは? オンプレミス, IaaS, PaaS, FaaS について
  • Azure Functions を使った、サーバーレスでのサーバサイドの実装 (C#)

LINE Developer Day
https://linedevday.linecorp.com/jp/2018/#C-5

↓ めちゃ嬉しかった!ので勝手に載せる

スライド

スライドは全て SlideShare で公開しています。

35分間のセッションでスライド60枚超え+デモ2つでしたが、時間ぴったりに終わらせることができました。

また、もともと (副業) 漫画家でもあるので、スライドの構成が漫画を読んでいるみたいだ、とはよく言われます!
漫画好きだからちょっと嬉しいです!えへへ

デモアプリ

『私の最新のブログ記事』というスキルです。
ブログの最新記事のタイトルをスマートスピーカーが読み上げてくれる + (Clova の場合) URL を LINE で送ってくれる
という二つの機能を持っています。

↓ 動画。Clova friends が喋った後に、スマホの LINE に通知が来てる

コード

コードはすべて GitHub に載せてあります。
すべて C# で書いています。C# 最高。私は C# が好き過ぎて Microsoft に入社しました。

https://github.com/chomado/SmartSpeakerGetLatestArticle

Clova に喋らせる

intent 設定

CEK (Clova Extensions Kit) で intent の設定をしておく。
要するに「こうユーザーから言われたらこの intent を飛ばす」みたいな。

clova extensions kit

コード側

ああ~~~~~~~~~ C# 美しいなあ~~~~~~~~~~ マジで~~~~美しい言語~~ あああああああああああ~~~~~~

// LINE Clova の基本設定で渡したエンドポイント。
// Clova からのリクエストでこの function が発火する
[FunctionName("Line")]
public static async Task<IActionResult> Line([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequest req, ExecutionContext context, ILogger log)
{
  var client = new ClovaClient();
  var cekRequest = await client.GetRequest(req.Headers["SignatureCEK"], req.Body);
  var cekResponse = new CEKResponse();
  switch (cekRequest.Request.Type)
  {
    // スキル起動時に必ず飛んでくる intent
    case RequestType.LaunchRequest:
      cekResponse.AddText(IntroductionMessage);
      cekResponse.ShouldEndSession = false;
      break;
    // その他ユーザー定義 intent が飛んできたとき
    case RequestType.IntentRequest:
    {
        // ↓intent ごとに処理を分けてる。詳細は下
        var r = await HandleIntentAsync(cekRequest.Request.Intent.Name); 
        // ↓ここで Clova に喋らせるメッセージを渡してる
        cekResponse.AddText(r.ResponseMessage);
        .. (略) // 

intent ごとに処理を分けてる 自作メソッド HandleIntentAsync の処理内容

private static async Task<HandleIntentResult> HandleIntentAsync(string intent)
{
  switch (intent)
  {
    case "HelloIntent":
      return new HandleIntentResult { ResponseMessage = HelloMessage };
    // この、自分で設定した「AskLatestBlogTitleIntent」が来たら、以下のブログの RSS (XML)のパースの処理に入る
    case "AskLatestBlogTitleIntent":
    {
      var chomadoBlogService = new ChomadoBlogService();
      var blog = await chomadoBlogService.GetLatestBlogAsync();

      if (blog != null)
      {
        return new HandleIntentResult
        {
          ResponseMessage = $"ちょまどさんのブログの最新記事は {blog.Title} です。",
          Blog = blog,
        };
      }
      else
      {
        return new HandleIntentResult
        {
          ResponseMessage = "ちょまどさんのブログの最新記事は、わかりませんでした。",
        };
      }
    }
    default:
      return new HandleIntentResult
      {
        ResponseMessage = ErrorMessage,
      };
  }

全文はコチラ(GitHub): SmartSpeakerEndpoints.cs

LINE Clova と LINE Messaging API の連携

LINE Clova と LINE Messaging API の連携について、
設定側とコード側でそれぞれやることがあります。

設定側

Clova の「基本設定」の画面で、接続先の LINE bot (LINE Messaging API チャネル) を選択します。
Clova と連携先の LINE Bot は、同じプロバイダー内に作られている必要があります。(そうじゃないとプルダウンに出てこない)

LINE Clova と LINE Messaging API の連携

コード側

また、コード側はこのようになります。

LINE Clova と LINE Messaging API の連携

CEKRequest request = ...; // Clova から来たリクエスト
var client = new LineMessagingClient("LINE Developers で取得できるシークレット");
await client.PushMessageAsync(
  to: request.Session.User.UserId,
  messages: new List<ISendMessage>
  {
    new TextMessage("送りたいメッセージ"),
  });

実際のファイルはこちら (GitHub): SmartSpeakerEndpoints.cs

サーバレスについて

  • オンプレミス(自前サーバー(物理))
  • IaaS (Infrastructure as a Service)
  • PaaS (Platform as a Service)
  • FaaS (Function as a Service)

の比較について話しました。

この表のグレーのところが「ユーザーはお守りしなくて良いもの」です。マイクロソフトとかグーグルとかAWSとかのクラウドベンダーが面倒見てくれる。
赤いところが「ユーザーが自分でお守りしなくちゃいけないところ」です。

例えば、
REST の Web API を作りたいとき。
一般的な PaaS ですと、HTTPリクエストが来るのを待つ Web アプリを書く必要がありますね。例えば C# だったら ASP.NET で書きます。で、API の口を作って~とかやります。
しかし Serverless (FaaS) でやるなら、その「HTTP リクエストで発火する API」の土台となる Web アプリは書かなくて良いのです。

Microsoft のサーバーレスのサービスの代表格は Azure Functions といいまして、今回使った C# 以外にも node.js が使えます。(Java はプレビュー)

詳しくはこちら (公式ドキュメント)

漫画も描いています!

漫画もよろしくね!漫画家仲間の湊川あいさんと2人で描いてるよ

当日のツイート

超満員!

感想

開演アナウンス

アナウンスも「千代田まどか」じゃなくて「ちょまど様」なのめちゃウケてましたw

まとめ

私は C# が好き!
サーバーレスでサクッと動かせる Azure Functions が好き!
LINE Clova friends などスマートスピーカーのスキル開発が好き!
そして開発者コミュニティの方々は純粋に技術を楽しんでいる人たちで素晴らしい!同じプログラミングオタ友って感じ!
楽しかった!!ありがとうございました!


投稿者:

ちょまど

千代田まどかです。よくちょまどと呼ばれます。Microsoft 社員。文系出身プログラマ兼マンガ家です。私の書いた記事一覧がこちらです

「Azure Functions を使った C# での LINE Clova スキル開発と LINE bot (Messaging API) への接続 #LINEDevDay LINE Developer Day」への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。