private bool ProcessCommand(isRock.LineBot.Event e) { var msg = e.message.text.Trim(); if (msg.ToLower() == "/today") { //今日花費 var n = Utility.GetTodaySpend(e.source.userId); //回覆QuickReply isRock.LineBot.Bot b = new isRock.LineBot.Bot(); isRock.LineBot.TextMessage TextMessage = new isRock.LineBot.TextMessage( $"您今天總花費金額為 ${n}"); b.ReplyMessage(e.replyToken, TextMessage); return(true); } if (msg.ToLower() == "/month") { //本月花費 var n = Utility.GetThisMonthSpend(e.source.userId); //回覆QuickReply isRock.LineBot.Bot b = new isRock.LineBot.Bot(); isRock.LineBot.TextMessage TextMessage = new isRock.LineBot.TextMessage( $"您本月總花費金額為 ${n}"); b.ReplyMessage(e.replyToken, TextMessage); return(true); } return(false); }
private string Learn(string userSay, isRock.LineBot.Event LineEvent) { //預設回覆文字 var respMsg = "我沒法依照你的指令學習...\n"; respMsg += "你必須跟我說:\n"; respMsg += "看到 OO 回覆 XX \n"; respMsg += "這樣以後當我看到 OO 就會回覆 XX 囉..."; respMsg += "(別忘了OO和XX的前後要有空白唷!)"; //全形空白轉半形 userSay = userSay.Replace(" ", " "); //拆解教學語句 var words = userSay.Split(' '); //去除空元素(可能是兩個空白造成的) words = words.Where(c => !string.IsNullOrEmpty(c)).ToArray(); //去除空白 for (int i = 0; i < words.Length; i++) { //去除空白 words[i] = words[i].Trim(); } //判斷指令是否正確 if (words[0] != "看到") { return(respMsg); } if (words[2] != "回覆" && words[2] != "回復") { return(respMsg); } if (words.Length < 4) { respMsg += $"\n\n你的教學指令:\n{userSay}\n格式不正確喔~"; return(respMsg); } //新增教學到資料庫 Models.blah rec = new Models.blah(); rec.LineUserId = LineEvent.source.userId; rec.UserSay = words[1].Trim(); rec.isValid = true; rec.ResponseMsg = words[3]; //db Models.MainDBDataContext db = new Models.MainDBDataContext(); db.blah.InsertOnSubmit(rec); db.SubmitChanges(); respMsg = "懂了...\n"; respMsg += $"以後當我看到包含 '{rec.UserSay}' 的句子,\n就會回覆 '{rec.ResponseMsg}' 囉..."; return(respMsg); }
private string GetNormalResponse(string userSay, isRock.LineBot.Event LineEvent) { var respMsg = ""; //db Models.MainDBDataContext db = new Models.MainDBDataContext(); //尋找答案 var ret = from c in db.blah where c.UserSay.Contains(userSay) select c; //如果有 if (ret.Count() > 0) { //先找是自己教過的 var MyAns = from c in ret where c.LineUserId == LineEvent.source.userId orderby c.Id descending select c; if (MyAns.Count() > 0) { //找自己教過的答案 respMsg = MyAns.FirstOrDefault().ResponseMsg; } else { //如果沒有,就找最後一筆答案(可能是別人教的) var Ans = from c in ret orderby c.Id descending select c; //理論上應該會有符合的 if (Ans.Count() > 0) { respMsg = Ans.FirstOrDefault().ResponseMsg; } } } //如果沒有答案 if (string.IsNullOrEmpty(respMsg)) { //沒有符合條件的答案 respMsg = $"我不知道當我看到 '{userSay}' 的時候,該怎麼回答,\n你可以教我嗎? \n\n"; respMsg += "若你跟我說:\n"; respMsg += "看到 OO 回覆 XX \n\n"; respMsg += "這樣以後當我看到 OO 就會回覆 XX 囉...\n"; respMsg += "(別忘了OO和XX的前後要有空白唷!)"; } return(respMsg); }
public IHttpActionResult POST() { //取得Web.config中的 app settings var token = System.Configuration.ConfigurationManager.AppSettings["ChannelAccessToken"]; isRock.LineBot.Event LineEvent = null; try { //設定ChannelAccessToken(或抓取Web.Config) this.ChannelAccessToken = token; //取得Line Event(本例是範例,因此只取第一個) LineEvent = this.ReceivedMessage.events.FirstOrDefault(); //配合Line verify if (LineEvent.replyToken == "00000000000000000000000000000000") { return(Ok()); } //回覆訊息 if (LineEvent.type == "message") { if (LineEvent.message.type == "image") //收到圖片 { //辨識與繪製圖片 var Messages = ProcessImage(LineEvent, token); //一次把集合中的多則訊息回覆給用戶 this.ReplyMessage(LineEvent.replyToken, Messages); } else { this.ReplyMessage(LineEvent.replyToken, "這是展示人臉辨識的LINE Bot,請拍一張有人的照片給我唷..."); } } //response OK return(Ok()); } catch (Exception ex) { //如果發生錯誤,傳訊息給Admin this.ReplyMessage(LineEvent.replyToken, "發生錯誤:\n" + ex.Message); //response OK return(Ok()); } }
public IHttpActionResult POST() { //取得Web.config中的 app settings var token = System.Configuration.ConfigurationManager.AppSettings["FYc+kenfRVcGiib82+/dJTprR5/kQ3J/0tIzwIdqNjqXncny4m4WGo5ux7LsJ5zk/s/BOEmVICQ6Acgr+cUAox/6ADG9Dt7JCzjSoYffgcT9KXD65gLpPqZCsguraQA6HGn69myslaXcUA5f3/5h91GUYhWQfeY8sLGRXgo3xvw="]; isRock.LineBot.Event LineEvent = null; try { //設定ChannelAccessToken(或抓取Web.Config) this.ChannelAccessToken = token; //取得Line Event(本例是範例,因此只取第一個) LineEvent = this.ReceivedMessage.events.FirstOrDefault(); //配合Line verify if (LineEvent.replyToken == "00000000000000000000000000000000") { return(Ok()); } //回覆訊息 if (LineEvent.type == "message") { if (LineEvent.message.type == "image") //收到圖片 { //辨識與繪製圖片 var Messages = ProcessImage(LineEvent, token); //一次把集合中的多則訊息回覆給用戶 this.ReplyMessage(LineEvent.replyToken, Messages); } else { this.ReplyMessage(LineEvent.replyToken, "這是人臉辨識linebot,請發一張有人的照片給我喔~"); } } //response OK return(Ok()); } catch (Exception ex) { //如果發生錯誤,傳訊息給Admin this.ReplyMessage(LineEvent.replyToken, "發生錯誤:\n" + ex.Message); //response OK return(Ok()); } }
public IHttpActionResult POST() { isRock.LineBot.Event LineEvent = null; //取得Web.config中的 app settings var token = System.Configuration.ConfigurationManager.AppSettings["ChannelAccessToken"]; var CLIENT_ID = System.Configuration.ConfigurationManager.AppSettings["Imgur_CLIENT_ID"]; var CLIENT_SECRET = System.Configuration.ConfigurationManager.AppSettings["Imgur_CLIENT_SECRET"]; try { //抓取Line Event LineEvent = this.ReceivedMessage.events.FirstOrDefault(); //設定抓取Web.Config //this.ChannelAccessToken = channelAccessToken; //取得Line Event(範例,只取第一個) //配合Line verify if (LineEvent.replyToken == "00000000000000000000000000000000") { return(Ok()); } //回覆訊息 if (LineEvent.type == "message") { if (LineEvent.message.type == "text") //收到文字 { this.ReplyMessage(LineEvent.replyToken, "你說了:" + LineEvent.message.text); } if (LineEvent.message.type == "sticker") //收到貼圖 { this.ReplyMessage(LineEvent.replyToken, 1, 2); } //收到用戶傳來的圖片(重點在這一段) if (LineEvent.message.type == "image") { //建立 ImgurClient var client = new ImgurClient(CLIENT_ID, CLIENT_SECRET); var endpoint = new ImageEndpoint(client); IImage image; //從LineEvent取得用戶上傳的圖檔bytes var byteArray = isRock.LineBot.Utility.GetUserUploadedContent(LineEvent.message.id, token); //取得圖片檔案FileStream Stream stream = new MemoryStream(byteArray); using (stream) { image = endpoint.UploadImageStreamAsync(stream).GetAwaiter().GetResult(); } //上傳成功之後,image.Link會回傳 url //建立文字訊息 isRock.LineBot.TextMessage TextMsg = new isRock.LineBot.TextMessage(image.Link); //建立圖形訊息(用上傳後的網址) isRock.LineBot.ImageMessage imageMsg = new isRock.LineBot.ImageMessage(new Uri(image.Link), new Uri(image.Link)); //建立集合 var Messages = new List <isRock.LineBot.MessageBase>(); Messages.Add(TextMsg); Messages.Add(imageMsg); //一次把集合中的多則訊息回覆給用戶 this.ReplyMessage(LineEvent.replyToken, Messages); } } //response OK return(Ok()); } catch (Exception ex) { //如果發生錯誤,傳訊息給Admin this.ReplyMessage(LineEvent.replyToken, "發生錯誤:\n" + ex.Message); //response OK return(Ok()); } }
private string ProcessText(isRock.LineBot.Event e) { const string HelpMsg = "嗨,您好。\n如果希望我幫您記帳,你可以直接輸入金額唷...\n\n例如:\n 180 \n 或\n 180 麥當勞\n然後再選取或輸入分類即可。"; //取得User Id var UserId = e.source.userId; var msg = e.message.text; //如果沒有狀態 if (string.IsNullOrEmpty(Utility.GetState(UserId))) { //預期msg是金額數字 //去除空白和不必要的字 msg = msg.Replace("$", "").Replace("元", "").Trim(); //全形轉半形 //msg = Strings.StrConv(msg, VbStrConv.Narrow, 0); //如果當前沒有狀態,預期的是純數字 //先以 ' ' 分割 var item = msg.Split(' '); if (item.Length <= 0) { return(HelpMsg); } float num = 0; string memo = ""; if (float.TryParse(item[0], out num) == false) { return(HelpMsg); } if (item.Length == 2) { memo = item[1].Trim(); } //如果資料沒問題, 保存起來 Utility.SetState(UserId + "-Amount", num.ToString()); Utility.SetState(UserId + "-Memo", memo); //回覆QuickReply isRock.LineBot.Bot b = new isRock.LineBot.Bot(); isRock.LineBot.TextMessage TextMessage = new isRock.LineBot.TextMessage($"請選擇或直接輸入這筆金額'{num}'的記帳類別"); var Types = Utility.GetTypes(UserId); foreach (var type in Types) { TextMessage.quickReply.items.Add(new isRock.LineBot.QuickReplyMessageAction(type, type)); } b.ReplyMessage(e.replyToken, TextMessage); //設定狀態 Utility.SetState(UserId, "等待分類名稱"); return(""); } //如果有狀態,且為正等待分類名稱 if (Utility.GetState(UserId) == "等待分類名稱") { //取回應該有的數字 if (string.IsNullOrEmpty(Utility.GetState(UserId + "-Amount"))) { Utility.SetState(UserId, ""); return(HelpMsg); } //取回數字 float num = 0; if (float.TryParse(Utility.GetState(UserId + "-Amount"), out num) == false) { return(HelpMsg); } string memo = Utility.GetState(UserId + "-Memo"); //有了數字num以及分類名稱 var AccountType = msg.Trim(); //清空狀態 Utility.SetState(UserId, ""); //紀錄 if (Utility.SaveToDB(UserId, num, AccountType, memo)) { return($"${num} 已記錄為 {AccountType}"); } else { return("記錄失敗"); } } return(""); }
private string ProcessPostback(isRock.LineBot.Event e) { return(""); }
public IHttpActionResult POST() { isRock.LineBot.Event LineEvent = null; //取得Web.config中的 app settings var token = System.Configuration.ConfigurationManager.AppSettings["g2cfcaiQgAc9+Sg9JcAnO4OvXqvvNkrIDeFEy089oG7cmO8yXRshePGa+wgTzAQ2aoDinj9TBGu2471l4BqtZXQJWCraicw5S5V8HgyBdoNtLQos4MMJdanGMaC24jSUvWkHbMj6xt66bvhLl11MbAdB04t89/1O/w1cDnyilFU="]; var CLIENT_ID = System.Configuration.ConfigurationManager.AppSettings["fdd30319757d1cf"]; var CLIENT_SECRET = System.Configuration.ConfigurationManager.AppSettings["b4ee94f79457430cd201f82f69cfd85f2aa72518"]; try { //抓取Line Event LineEvent = this.ReceivedMessage.events.FirstOrDefault(); //設定抓取Web.Config //this.ChannelAccessToken = channelAccessToken; //取得Line Event(範例,只取第一個) //配合Line verify if (LineEvent.replyToken == "00000000000000000000000000000000") { return(Ok()); } //回覆訊息 if (LineEvent.type == "message") { if (LineEvent.message.type == "text") //收到文字 { this.ReplyMessage(LineEvent.replyToken, "你說了:" + LineEvent.message.text); } if (LineEvent.message.type == "sticker") //收到貼圖 { this.ReplyMessage(LineEvent.replyToken, 1, 2); } //收到用戶傳來的圖片(重點在這一段) if (LineEvent.message.type == "image") { //建立 ImgurClient var client = new ImgurClient(CLIENT_ID, CLIENT_SECRET); var endpoint = new ImageEndpoint(client); IImage image; //從LineEvent取得用戶上傳的圖檔bytes var byteArray = isRock.LineBot.Utility.GetUserUploadedContent(LineEvent.message.id, token); //取得圖片檔案FileStream Stream stream = new MemoryStream(byteArray); using (stream) { image = endpoint.UploadImageStreamAsync(stream).GetAwaiter().GetResult(); } //上傳成功之後,image.Link會回傳 url //建立文字訊息 isRock.LineBot.TextMessage TextMsg = new isRock.LineBot.TextMessage(image.Link); //建立圖形訊息(用上傳後的網址) isRock.LineBot.ImageMessage imageMsg = new isRock.LineBot.ImageMessage(new Uri(image.Link), new Uri(image.Link)); //建立集合 var Messages = new List <isRock.LineBot.MessageBase>(); Messages.Add(TextMsg); Messages.Add(imageMsg); //一次把集合中的多則訊息回覆給用戶 this.ReplyMessage(LineEvent.replyToken, Messages); } } //response OK return(Ok()); } catch (Exception ex) { //如果發生錯誤,傳訊息給Admin this.ReplyMessage(LineEvent.replyToken, "發生錯誤:\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["ComputerVisionServiceKey"]; var ComputerVisionServiceEndpoint = System.Configuration.ConfigurationManager.AppSettings["ComputerVisionServiceEndpoint"]; 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); }