Edited at
gloopsDay 12

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

More than 1 year has passed since last update.


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を初めて使ってみて、育成させたいという愛着がわきました。

今後教育を継続して行い、私の体調管理を管理してくれる子に育てて行きたいと思います。