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);
        }
示例#2
0
        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);
        }
示例#3
0
        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());
            }
        }
示例#6
0
        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("");
 }
示例#9
0
        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);
        }