gloops AdventCalendar 12日目
gloops advent calendar 12日目です
誕生日です
家に早く帰ってケーキを食べる予定がこんな時間になってしました
11日目は @m_nabeta さんの「これまでに世に送り出してしまって後から猛省したPythonのパターン」でした。
いいねがたくさんつきましたね。
私はWebアプリケーションエンジニアのMgrをやっていて普段コードを触る機会が少ないのと、
ダイエットをしているので、両方を満たしてくれる趣味アプリケーションつくっています。
まだ未完成なので、それぞれのAPI連携コードを載せさせていただきます。
※まだ作成中です。アップデート次第更新させていただきます
Google Calendar API
C#にて、特定ユーザーのGoogleCalendar情報を取得してみました
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の連携
夜のカレンダーのデータを取得して飲み会かどうか判定
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側にGoogleカレンダーのデータを送ったレスポンスデータ
なかなか正確なレスポンスを返してくれます。
忘年会が飲み会になったり、ジムがなぜか飲み会に判定されるので、
これからもLUISに学習させていきたいと思います。
今後の実装予定
・昼のgoogleカレンダーデータと夜の飲み会状況を加味して、お昼・夜ごはんを決定してくれるようにする
まとめ
LUISを初めて使ってみて、育成させたいという愛着がわきました。
今後教育を継続して行い、私の体調管理を管理してくれる子に育てて行きたいと思います。