LoginSignup
25
4

More than 5 years have passed since last update.

Microsoft Bot FrameworkとLuisとGoogleCalendar使って、LUISに自分のご飯を決めさせたい

Last updated at Posted at 2016-12-12

gloops AdventCalendar 12日目

gloops advent calendar 12日目です:relaxed:
誕生日です:birthday:
家に早く帰ってケーキを食べる予定がこんな時間になってしました

11日目は @m_nabeta さんの「これまでに世に送り出してしまって後から猛省したPythonのパターン」でした。
いいねがたくさんつきましたね。

私はWebアプリケーションエンジニアのMgrをやっていて普段コードを触る機会が少ないのと、
ダイエットをしているので、両方を満たしてくれる趣味アプリケーションつくっています。
まだ未完成なので、それぞれのAPI連携コードを載せさせていただきます。
※まだ作成中です。アップデート次第更新させていただきます

Google Calendar API

C#にて、特定ユーザーのGoogleCalendar情報を取得してみました

GetGoogleAsync

public  async Task<List<Calendar>> GetGoogleAsync(DateTime Today)
{
  var CalendarList = new List<Calendar>();
  try
  {
    const string calendarId = "取得したいカレンダーのID";
    const string apiKey = "GoogleCalendarAPIで発行したAPIKey";
    const string apiUrl = "https://www.googleapis.com/calendar/v3/calendars/" + calendarId + "/events?key=" + apiKey + "&singleEvents=true";

    //スケジュールstartTime順 上限15件
    var paramList = "orderBy=startTime&maxResults=15";
    //日付のスタート設定
    paramList += "&timeMin=" + Today.ToString("yyyy-MM-dd") + "T00:00:00%2b0900";
    //日付のエンド設定
    paramList += "&timeMax=" + Today.AddDays(1).ToString("yyyy-MM-dd") + "T00:00:00%2b0900";
    var url = apiUrl + "&" + paramList;

    var httpClient = new HttpClient();
    var clientResponse = await httpClient.GetAsync(url);
    //APIのデータを成形
    CalendarList.AddRange(JsonConvert.DeserializeObject<GoogleCalendarList>(await clientResponse.Content.ReadAsStringAsync())
                    .items.Select(item => new Calendar
                {
                    summary = item.summary,
                    start = item.start.dateTime == null ? new DateTime(1901, 1, 1) : DateTime.Parse(item.start.dateTime),
                    end = item.end.dateTime == null ? new DateTime(1901, 1, 1) : DateTime.Parse(item.end.dateTime)
                }));
    }
    catch (AggregateException ex)
    {
    
    }
            return CalendarList;

}

public class GoogleCalendarList
{
        public GoogleCalendar[] items { get; set; }
}

public class GoogleCalendar
{
        public string summary { get; set; }
        public start start { get; set; }
        public end end { get; set; }
}

public class start
{
        public string dateTime { get; set; }
}

public class end
{
        public string dateTime { get; set; }
}

public class Calendar
{
        public string summary { get; set; }
        public DateTime start { get; set; }

        public DateTime end { get; set; }
}

参考サイト)http://blog.howdylikes.jp/entry/20120806/1344265078

BotFramework と LUISの連携

夜のカレンダーのデータを取得して飲み会かどうか判定

Post

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
  if (activity.Type == ActivityTypes.Message || activity.Text.Contains("夜"))
     var text = activity.Text;
     var calendarList = await GetGoogleAsync();
     var nightSchedule = "なし";
     // 19時半以降の予定取得
     var night = calendarList.FirstOrDefault(
                    x => x.start >= new DateTime(Today.Year, Today.Month, Today.Day, 19, 30, 0));
     if (night?.summary != null)
        nightSchedule = night.summary;
     var baseurl = $"https://api.projectoxford.ai/luis/v2.0/apps/AppのId?subscription-key=AppのKey&q=";
     var url = $"{baseurl + text}&verbose=true";
     var httpClient = new HttpClient();
     var clientResponse = await httpClient.GetAsync(url);
     var content = await clientResponse.Content.ReadAsStringAsync();

     // メッセージを返答
     ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
     Activity reply = activity.CreateReply(content);
     await connector.Conversations.ReplyToActivityAsync(reply);
  }
   var response = Request.CreateResponse(HttpStatusCode.OK);
   return response;
}

参考サイト)https://bita.jp/dml/luis_1

LUIS側のデータ状況

luis.PNG

LUIS側にGoogleカレンダーのデータを送ったレスポンスデータ

なかなか正確なレスポンスを返してくれます。
忘年会が飲み会になったり、ジムがなぜか飲み会に判定されるので、
これからもLUISに学習させていきたいと思います。

飲み会の判定.PNG
jikokensan.PNG

今後の実装予定

・昼のgoogleカレンダーデータと夜の飲み会状況を加味して、お昼・夜ごはんを決定してくれるようにする

まとめ

LUISを初めて使ってみて、育成させたいという愛着がわきました。
今後教育を継続して行い、私の体調管理を管理してくれる子に育てて行きたいと思います。

25
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
4