public IActionResult POST() { var AdminUserId = "U3642fd7bd605b4781e64effed44ec97e"; try { //設定ChannelAccessToken this.ChannelAccessToken = "dt0W9B9ztQWfHmg1e3ifpp+xEvHTarYhi4SnIvrxuODgAVq5qgi19pWLPIAKqJ4VQnfPt9BTg5EkLshGWLbVM5u/C0RAzHXWs2EMdwxMLJNdJ0uHazOIDgI9NDHTdxZNy0NGNUwvzJpy6k1s467+dwdB04t89/1O/w1cDnyilFU="; //取得Line Event var LineEvent = this.ReceivedMessage.events.FirstOrDefault(); var profile = GetUserInfo(LineEvent.source.userId); //配合Line verify if (LineEvent.replyToken == "00000000000000000000000000000000") { return(Ok()); } var responseMsg = ""; //準備回覆訊息 if (LineEvent.type.ToLower() == "follow") { isRock.LineBot.TextMessage m = new isRock.LineBot.TextMessage($"{profile.displayName},使用Smart AI Sports幫助你一起健身吧!"); //在TextMessage物件的quickreply屬性中加入items m.quickReply.items.Add( new isRock.LineBot.QuickReplyMessageAction( $"想健身", "我想健身" )); m.quickReply.items.Add( new isRock.LineBot.QuickReplyMessageAction( $"身體資訊", "想知道身體資訊" )); m.quickReply.items.Add( new isRock.LineBot.QuickReplyMessageAction( $"聯絡我們", "聯絡我們" )); m.quickReply.items.Add( new isRock.LineBot.QuickReplyLocationAction( "搜尋附近的健身房")); this.ReplyMessage(LineEvent.replyToken, m); //response OK return(Ok()); } //設定用戶回傳訊息類型為image時的回覆 else if (LineEvent.type.ToLower() == "message" && LineEvent.message.type == "image") { Uri imgUri = new Uri("https://i.imgur.com/o9uT3Aa.png"); var msgs = new List <isRock.LineBot.MessageBase>(); var msgadd = new isRock.LineBot.TextMessage($"這照片真讚\n{profile.displayName}要運動了嗎"); msgadd.quickReply.items.Add( new isRock.LineBot.QuickReplyLocationAction( "找附近的健身房")); //add messages to msgs.Add(new isRock.LineBot.ImageMessage(imgUri, imgUri)); msgs.Add(msgadd); this.ReplyMessage(LineEvent.replyToken, msgs); //response OK return(Ok()); } //設定用戶回傳訊息類型為text時的回覆 else if (LineEvent.type.ToLower() == "message" && LineEvent.message.type == "text") { var ret = MakeRequest(LineEvent.message.text); //用戶回傳訊息為BMI時 此段為判斷intent="身體" 後 接續quickreply為BMI/TDEE的計算 if (LineEvent.message.text.ToUpper() == "BMI") { isRock.LineBot.Bot bot = new isRock.LineBot.Bot(this.ChannelAccessToken); var msgs = new List <isRock.LineBot.MessageBase>(); var msgadd1 = new isRock.LineBot.TextMessage("感謝您!"); var msgadd2 = new isRock.LineBot.TextMessage("-BMI\n身高:\n體重:"); //add messages to msgs.Add(new isRock.LineBot.TextMessage("請複製下面表格並填入資料後回覆~")); msgs.Add(msgadd1); msgs.Add(msgadd2); this.ReplyMessage(LineEvent.replyToken, msgs); //response OK return(Ok()); } else if (LineEvent.message.text.ToUpper() == "TDEE") { isRock.LineBot.Bot bot = new isRock.LineBot.Bot(this.ChannelAccessToken); var msgs = new List <isRock.LineBot.MessageBase>(); var msgadd = new isRock.LineBot.TextMessage("-TDEE\n身高:\n體重:\n年齡:\n性別:男/女"); //add messages to msgs.Add(new isRock.LineBot.TextMessage("請複製下面表格並填入資料後回覆~")); msgs.Add(msgadd); this.ReplyMessage(LineEvent.replyToken, msgs); //response OK return(Ok()); } else if (LineEvent.message.text.Contains("-BMI")) // 算BMI { float height = float.Parse(LineEvent.message.text.Split("\n")[1].Split(":")[1]) / 100; float weight = float.Parse(LineEvent.message.text.Split("\n")[2].Split(":")[1]); float userbmi = weight / (height * height); var bmiResult = String.Format($"Your BMI : {userbmi:0.00} "); isRock.LineBot.Bot bot = new isRock.LineBot.Bot(this.ChannelAccessToken); var msgs = new List <isRock.LineBot.MessageBase>(); msgs.Add(new isRock.LineBot.TextMessage("經過我快速精密的計算過後....")); var msgadd2 = new isRock.LineBot.TextMessage($"{bmiResult}"); msgs.Add(msgadd2); this.ReplyMessage(LineEvent.replyToken, msgs); return(Ok()); } else if (LineEvent.message.text.Contains("-TDEE")) // 算TDEE { double height = double.Parse(LineEvent.message.text.Split("\n")[1].Split(":")[1]); double weight = double.Parse(LineEvent.message.text.Split("\n")[2].Split(":")[1]); double age = double.Parse(LineEvent.message.text.Split("\n")[3].Split(":")[1]); string sex = LineEvent.message.text.Split("\n")[4].Split(":")[1]; int light, medi, high; double BMR; if (sex == "男") { BMR = (13.7 * weight) + (5 * height) - (6.8 * age) + 66; light = Convert.ToInt32(BMR * 1.2); medi = Convert.ToInt32(BMR * 1.375); high = Convert.ToInt32(BMR * 1.55); } else if (sex == "女") { BMR = (9.6 * weight) + (1.8 * height) - (4.7 * age) + 655; light = Convert.ToInt32(BMR * 1.2); medi = Convert.ToInt32(BMR * 1.375); high = Convert.ToInt32(BMR * 1.55); } else { responseMsg = "請輸入正確資料。"; this.ReplyMessage(LineEvent.replyToken, responseMsg); //response OK return(Ok()); } string userbmi = (weight / (height * height)).ToString(); var tdeeResult = String.Format($"Your 基礎代謝: {BMR:0.00}\n每日總消耗熱量\n久坐:{light}\n輕量活動:{medi}\n中量活動:{high}"); //一次回復訊息及計算結果 isRock.LineBot.Bot bot = new isRock.LineBot.Bot(this.ChannelAccessToken); var msgs = new List <isRock.LineBot.MessageBase>(); msgs.Add(new isRock.LineBot.TextMessage("經過我快速精密的計算過後....")); var msgadd2 = new isRock.LineBot.TextMessage($"{tdeeResult}"); msgs.Add(msgadd2); this.ReplyMessage(LineEvent.replyToken, msgs); //response OK return(Ok()); } //若intent為打招呼 回傳default功能的Quickreply else if (ret.topScoringIntent.intent.Contains("打招呼")) { isRock.LineBot.TextMessage m = new isRock.LineBot.TextMessage($"你好!{profile.displayName}!\n歡迎使用Smart AI Sports\n我能為你做下列的事情喔"); //在TextMessage物件的quickreply屬性中加入items m.quickReply.items.Add( new isRock.LineBot.QuickReplyMessageAction( $"想健身", "我想健身", new Uri("https://image.flaticon.com/295/png/512/1616/1616456.png?size=1200x630f") )); m.quickReply.items.Add( new isRock.LineBot.QuickReplyMessageAction( $"身體資訊", "想知道身體資訊", new Uri("https://image.flaticon.com/219/png/512/1754/1754237.png?size=1200x630f") )); m.quickReply.items.Add( new isRock.LineBot.QuickReplyMessageAction( $"聯絡我們", "聯絡我們", new Uri("https://i.imgur.com/rwwI5XW.png") )); m.quickReply.items.Add( new isRock.LineBot.QuickReplyLocationAction( "搜尋附近的健身房", new Uri("https://image.flaticon.com/179/png/512/458/458369.png?size=1200x630f"))); this.ReplyMessage(LineEvent.replyToken, m); //response OK return(Ok()); } else if (ret.topScoringIntent.intent.Contains("訓練")) { isRock.LineBot.Bot bot = new isRock.LineBot.Bot(this.ChannelAccessToken); //建立buttonsTemplate var button = new isRock.LineBot.ButtonsTemplate() { altText = "altText", text = "提供姿勢偵測", title = "Smart AI Sports", thumbnailImageUrl = new Uri("https://i.imgur.com/qOmWNyi.jpg") }; //actions button.actions.Add(new isRock.LineBot.UriAction() { label = "棒式動作示範", uri = new Uri("https://www.youtube.com/watch?v=UiklJLUh6qU") }); button.actions.Add(new isRock.LineBot.UriAction() { label = "二頭彎舉示範", uri = new Uri("https://www.youtube.com/watch?v=d71MiVhUBlw&t=395s") }); button.actions.Add(new isRock.LineBot.UriAction() { label = "臀推動作示範", uri = new Uri("https://www.youtube.com/watch?v=7i8iqg3s5sY") }); // button.actions.Add(new isRock.LineBot.CamerarollAction() { label = "上傳你的照片" }); // var msgs = new List <isRock.LineBot.MessageBase>(); // msgs.Add(new isRock.LineBot.TextMessage("請複製下面表格並填入資料後回覆O_o")); foreach (var showlist in ret.entities) { Console.WriteLine(showlist.type); Console.WriteLine(showlist.entity); var trainlist = ""; if (showlist.type == "訓練名稱") { trainlist += showlist.entity; msgs.Add(new isRock.LineBot.TextMessage($"看來你今天想練{trainlist}\n目前提供以下訓練選擇")); } else { msgs.Add(new isRock.LineBot.TextMessage($"請問你今天想練甚麼?\n目前提供以下訓練選擇")); } var ButtonsTmp = new isRock.LineBot.TemplateMessage(button); msgs.Add(ButtonsTmp); var msgadd2 = new isRock.LineBot.TextMessage("請用電腦開啟以下網站進行姿勢偵測"); msgs.Add(msgadd2); var msgadd3 = new isRock.LineBot.TextMessage("http://192.168.36.30:3000/fitness"); msgs.Add(msgadd3); this.ReplyMessage(LineEvent.replyToken, msgs); //response OK return(Ok()); } } else if (ret.topScoringIntent.intent.Contains("身體")) { isRock.LineBot.TextMessage m = new isRock.LineBot.TextMessage($"請問你想知道哪種資訊"); m.quickReply.items.Add( new isRock.LineBot.QuickReplyMessageAction( $"BMI(身體質量指數)", "BMI" )); m.quickReply.items.Add( new isRock.LineBot.QuickReplyMessageAction( $"TDEE(基礎代謝率)", "TDEE" )); this.ReplyMessage(LineEvent.replyToken, m); //response OK return(Ok()); } else if (ret.topScoringIntent.intent.Contains("客服")) { isRock.LineBot.Bot bot = new isRock.LineBot.Bot(this.ChannelAccessToken); var msgs = new List <isRock.LineBot.MessageBase>(); var msgadd = new isRock.LineBot.TextMessage($"{profile.displayName},這是我們能提供的服務"); // new isRock.LineBot.TextMessage m = //在TextMessage物件的quickreply屬性中加入items msgadd.quickReply.items.Add( new isRock.LineBot.QuickReplyMessageAction( $"想健身", "我想健身", new Uri("https://image.flaticon.com/295/png/512/1616/1616456.png?size=1200x630f"))); msgadd.quickReply.items.Add( new isRock.LineBot.QuickReplyMessageAction( $"身體資訊", "想知道身體資訊", new Uri("https://image.flaticon.com/219/png/512/1754/1754237.png?size=1200x630f"))); msgadd.quickReply.items.Add( new isRock.LineBot.QuickReplyLocationAction( "搜尋附近的健身房", new Uri("https://image.flaticon.com/179/png/512/458/458369.png?size=1200x630f"))); //add messages to msgs.Add(new isRock.LineBot.TextMessage("連絡電話:0911-222-333\n連絡信箱:[email protected]")); msgs.Add(msgadd); this.ReplyMessage(LineEvent.replyToken, msgs); //response OK return(Ok()); } else if (ret.topScoringIntent.intent.Contains("感謝")) { Uri imgUri = new Uri("https://i.imgur.com/o9uT3Aa.png"); var msgs = new List <isRock.LineBot.MessageBase>(); var msgadd = new isRock.LineBot.ImageMessage(imgUri, imgUri); //add messages to msgs.Add(new isRock.LineBot.TextMessage("很高興能幫助到您!要繼續運動保持健康喔!")); msgs.Add(msgadd); this.ReplyMessage(LineEvent.replyToken, msgs); //response OK return(Ok()); } else if (ret.topScoringIntent.intent.Contains("None")) { isRock.LineBot.TextMessage m = new isRock.LineBot.TextMessage($"Sorry~{profile.displayName},我不太清楚你的意思,不過我能為你做下列的事情喔"); //在TextMessage物件的quickreply屬性中加入items m.quickReply.items.Add( new isRock.LineBot.QuickReplyMessageAction( $"想健身", "我想健身", new Uri("https://image.flaticon.com/295/png/512/1616/1616456.png?size=1200x630f") )); m.quickReply.items.Add( new isRock.LineBot.QuickReplyMessageAction( $"身體資訊", "想知道身體資訊", new Uri("https://image.flaticon.com/219/png/512/1754/1754237.png?size=1200x630f") )); m.quickReply.items.Add( new isRock.LineBot.QuickReplyMessageAction( $"聯絡我們", "聯絡我們", new Uri("https://i.imgur.com/rwwI5XW.png") )); m.quickReply.items.Add( new isRock.LineBot.QuickReplyLocationAction( "搜尋附近的健身房", new Uri("https://image.flaticon.com/179/png/512/458/458369.png?size=1200x630f"))); this.ReplyMessage(LineEvent.replyToken, m); //response OK return(Ok()); } // else if (LineEvent.message.text.Contains("自訂文字")) // { // // ... // } } else if (LineEvent.type.ToLower() == "message" && LineEvent.message.type == "sticker") { responseMsg = $"{profile.displayName}有空傳貼圖,倒不如多做兩個伏地挺身"; this.ReplyMessage(LineEvent.replyToken, responseMsg); //response OK return(Ok()); } else if (LineEvent.type.ToLower() == "message" && LineEvent.message.type == "location") { double locx = LineEvent.message.latitude; double locy = LineEvent.message.longitude; string gymlink = $"打開以下連結查看你附近的健身房\nhttps://www.google.com.tw/maps/search/%E5%81%A5%E8%BA%AB%E6%88%BF/@{locx},{locy},15z/"; isRock.LineBot.Bot bot = new isRock.LineBot.Bot(this.ChannelAccessToken); var msgs = new List <isRock.LineBot.MessageBase>(); var msgadd = new isRock.LineBot.TextMessage(gymlink); //add messages to msgs.Add(new isRock.LineBot.TextMessage($"{profile.displayName}....你是不是在{LineEvent.message.address.Substring(3)}想找健身房")); msgs.Add(msgadd); this.ReplyMessage(LineEvent.replyToken, msgs); //response OK return(Ok()); } else { responseMsg = $"收到 event : {LineEvent.type} "; } //回覆訊息 this.ReplyMessage(LineEvent.replyToken, responseMsg); //response OK return(Ok()); } catch (Exception ex) { //回覆訊息 this.PushMessage(AdminUserId, "發生錯誤:\n" + ex.Message); //response OK return(Ok()); } }
/// <summary> /// 處理照片 /// </summary> /// <param name="LineEvent"></param> /// <param name="token"></param> /// <returns></returns> private List <isRock.LineBot.MessageBase> ProcessImage(isRock.LineBot.Event LineEvent, string token) { //web.config var ComputerVisionServiceKey = System.Configuration.ConfigurationManager.AppSettings["4459878929014d2a8c7021a4e7c42d51"]; var ComputerVisionServiceEndpoint = System.Configuration.ConfigurationManager.AppSettings["https://winson01.cognitiveservices.azure.com/"]; string Msg = ""; //取得照片 //從LineEvent取得用戶上傳的圖檔bytes var byteArray = isRock.LineBot.Utility.GetUserUploadedContent(LineEvent.message.id, token); //取得圖片檔案FileStream, 分別作為繪圖與分析用 Stream MemStream1 = new MemoryStream(byteArray); Stream MemStream2 = new MemoryStream(byteArray); //繪圖用 System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(MemStream1); Graphics g = Graphics.FromImage(bmp); //ComputerVision instance var visionClient = new Microsoft.ProjectOxford.Vision.VisionServiceClient( ComputerVisionServiceKey, ComputerVisionServiceEndpoint); //分析用 using (MemStream2) { //分析圖片 var Results = visionClient.AnalyzeImageAsync( MemStream2, new VisualFeature[] { VisualFeature.Faces, VisualFeature.Description }).Result; //分別保存性別數量 int isM = 0, isF = 0; //如果找到臉,就畫方框標示出來 foreach (var item in Results.Faces) { var faceRect = item.FaceRectangle; //畫框 g.DrawRectangle( new Pen(Brushes.Red, 3), new Rectangle(faceRect.Left, faceRect.Top, faceRect.Width, faceRect.Height)); //在方框旁邊顯示年紀 var age = 0; if (item.Gender.StartsWith("F")) { age = item.Age - 2; } else { age = item.Age; } //劃出數字 g.DrawString(age.ToString(), new Font(SystemFonts.DefaultFont.FontFamily, 24, FontStyle.Bold), new SolidBrush(Color.Black), faceRect.Left + 3, faceRect.Top + 3); //紀錄性別數量 if (item.Gender.StartsWith("M")) { isM += 1; } else { isF += 1; } } //圖片分析結果 Msg += $"\n圖片說明:\n{Results.Description.Captions[0].Text}"; //如果update了照片,則顯示新圖 if (Results.Faces.Count() > 0) { Msg += String.Format("\n找到{0}張臉, \n{1}男 {2}女", Results.Faces.Count(), isM, isF); } } string ImgurURL = ""; using (MemoryStream m = new MemoryStream()) { bmp.Save(m, System.Drawing.Imaging.ImageFormat.Png); ImgurURL = UploadImage2Imgur(m.ToArray()); } //上傳成功之後,image.Link會回傳 url //建立文字訊息 isRock.LineBot.TextMessage TextMsg = new isRock.LineBot.TextMessage(Msg); //建立圖形訊息(用上傳後的網址) isRock.LineBot.ImageMessage imageMsg = new isRock.LineBot.ImageMessage(new Uri(ImgurURL), new Uri(ImgurURL)); //建立集合 var Messages = new List <isRock.LineBot.MessageBase>(); Messages.Add(TextMsg); Messages.Add(imageMsg); //一次把集合中的多則訊息回覆給用戶 return(Messages); }