예제 #1
0
 public static MemoryStream GetMemoryStream(this HttpRequest Request)
 {
     Request.EnableRewind();
     if (Request.Body != null && Request.Body.CanSeek)
     {
         var mem = new MemoryStream();
         {
             try
             {
                 Request.Body.Seek(0, SeekOrigin.Begin);
                 Request.Body.CopyTo(mem);//有时会抛出 Unexpected end of request content.
             }catch (Exception ex)
             {
                 LogService.AnyLog("WarningException", ex.ToString());
             }
             finally
             {
                 mem.Seek(0, SeekOrigin.Begin);          //还原到初始位置
                 Request.Body.Seek(0, SeekOrigin.Begin); //还原到初始位置
             }
         }
         return(mem);
     }
     else
     {
         throw new System.Exception("无请求流或无法倒流");
     }
 }
예제 #2
0
 public LinyeeNLAnalyzer()
 {
     if (ConfigBase.Default.IsTraceStack)
     {
         LogService.AnyLog("Stack", new StackTrace().GetFrame(0).GetMethod().ToString());
     }
     //var dict= LinyeeWrodDict.Default;//初始化词典
 }
예제 #3
0
 public WordInfoOnce(string word)
 {
     if (ConfigBase.Default.IsTraceStack)
     {
         LogService.AnyLog("Stack", new StackTrace().GetFrame(0).GetMethod().ToString());
     }
     this.w = word;
 }
예제 #4
0
 public Task StopAsync(CancellationToken cancellationToken)
 {
     Dispose();
     foreach (var wcs in wcss.Values)
     {
         wcs.Dispose();
     }
     LogService.AnyLog("MLBot", "计时服务已停止", id.ToString());
     return(Task.CompletedTask);
 }
예제 #5
0
        public WordAnalyResult Save()
        {
            if (ConfigBase.Default.IsTraceStack)
            {
                LogService.AnyLog("Stack", new StackTrace().GetFrame(0).GetMethod().ToString());
            }

            LinyeeWrodDict.Default.OpenSaveCloseSave();
            return(new WordAnalyResult().SetOk());
        }
        internal WordAnalyResult SentenceAnaly()
        {
            if (ConfigBase.Default.IsTraceStack)
            {
                LogService.AnyLog("Stack", new StackTrace().GetFrame(0).GetMethod().ToString());
            }
            WordAnalyResult result = new WordAnalyResult();

            stops.Clear();
            stops.Add(0);//开始值
            //计算停止处
            for (var fi = 0; fi < Raw.Length; fi++)
            {
                //句断符号停止
                if (SentenceStopChars.Contains(Raw[fi]))
                {
                    if (Raw[fi] != '.' || Raw[fi] == '.' && (fi == Raw.Length - 1 || Raw[fi++] == ' '))
                    {
                        stops.Add(fi);
                    }
                }
            }
            stops.Add(Raw.Length);//结束值
            //截句
            for (var fi = 1; fi < stops.Count; fi++)
            {
                var spi = stops[fi - 1];
                if (spi > 0)
                {
                    var splitword = Raw[spi];
                    //words.Add(splitword.ToString());
                    spi++;
                }
                var epi = stops[fi];
                var sch = '\x0';
                if (epi < Raw.Length)
                {
                    sch = Raw[epi];
                    //epi++;//包含符号//注释后不包含符号
                }
                var slen = epi - spi;
                if (slen < 1)
                {
                    break;
                }
                var span = Raw.Slice(spi, slen);
                //$"P>{span.ToString()}".WriteInfoLine();
                var words = new LinyeeNLWordAnalyzer(span, Enc, WordStopChars).WordAnaly();
                var res   = new Sentence(words, sch);
                sentences.Add(res);;
            }

            //
            return(result.SetData(sentences).SetOk());
        }
        internal WordAnalyResult ParagraphAnaly()
        {
            if (ConfigBase.Default.IsTraceStack)
            {
                LogService.AnyLog("Stack", new StackTrace().GetFrame(0).GetMethod().ToString());
            }

            WordAnalyResult result = new WordAnalyResult();

            stops.Clear();
            stops.Add(0);//开始值
            //计算停止处
            for (var fi = 0; fi < Raw.Length; fi++)
            {
                //段落符号停止
                if (ParagraphStopChars.Contains(Raw[fi]))
                {
                    stops.Add(fi);
                }
            }
            stops.Add(Raw.Length);//结束值
            //截段
            for (var fi = 1; fi < stops.Count; fi++)
            {
                var spi = stops[fi - 1];
                if (spi > 0)
                {
                    var splitword = Raw[spi];
                    //words.Add(splitword.ToString());
                    spi++;
                }
                var epi = stops[fi];
                //if (epi >= Raw.Length && paragraphs.Count > 0)
                //{
                //    break;//退出
                //}
                //else if(epi< Raw.Length)
                //{
                //    epi++;
                //}
                var slen = epi - spi;
                if (slen < 1)
                {
                    break;
                }
                var span = Raw.Slice(spi, slen);
                paragraphs.Add(new Paragraph(new LinyeeNLSentenceAnalyzer(span, Enc, SentenceStopChars, WordStopChars).SentenceAnaly()));
            }

            //
            return(result.SetData(paragraphs).SetOk());
        }
예제 #8
0
        internal WordAnalyResult <List <WordInfoOnce> > WordAnaly()
        {
            if (ConfigBase.Default.IsTraceStack)
            {
                LogService.AnyLog("Stack", new StackTrace().GetFrame(0).GetMethod().ToString());
            }
            WordAnalyResult <List <WordInfoOnce> > result = new WordAnalyResult <List <WordInfoOnce> >();

            var winfos = WordDict.WordAnaly(Raw, 0);

            words.AddRange(winfos);
            //
            return(result.SetData(words).SetOk());
        }
        internal LinyeeNLParagraphAnalyzer(ReadOnlySpan <char> span, Encoding enc, List <char> paragraphstopchars, List <char> sentencestopchars, List <char> wordstopchars)
        {
            if (ConfigBase.Default.IsTraceStack)
            {
                LogService.AnyLog("Stack", new StackTrace().GetFrame(0).GetMethod().ToString());
            }

            this.Raw = span;
            this.Enc = enc;
            this.ParagraphStopChars = paragraphstopchars;
            this.SentenceStopChars  = sentencestopchars;
            this.WordStopChars      = wordstopchars;

            paragraphs = new List <Paragraph>();
            stops      = new List <int>();
        }
예제 #10
0
        private Task ExecuteAsync(CancellationToken stoppingToken)
        {
            if (timer != null)
            {
                return(Task.CompletedTask);
            }

            timer = new Timer((obj) => {
                foreach (var wcs in wcss.Values)
                {
                    wcs.CheckService();
                }
            }, null, 5 * 1000, 5 * 1000);
            LogService.AnyLog("MLBot", "计时服务已启动", id.ToString());
            return(Task.CompletedTask);
        }
예제 #11
0
        public WordAnalyResult <List <string> > WordAnalyJieba(string text, Encoding encoding = null)
        {
            if (ConfigBase.Default.IsTraceStack)
            {
                LogService.AnyLog("Stack", new StackTrace().GetFrame(0).GetMethod().ToString());
            }
            if (string.IsNullOrEmpty(text))
            {
                return(WordAnalyResult <List <string> > .Empty);
            }
            var segmenter = new JiebaSegmenter();

            return(new WordAnalyResult <List <string> >().SetData(segmenter.Cut(text).ToList()));
            //var posSeg = new PosSegmenter(segmenter);
            //return posSeg.Cut(text, hmm).Select(token => string.Format("{0}/{1}", token.Word, token.Flag));
        }
예제 #12
0
        public WordAnalyResult AddWord(string text, Encoding encoding = null)
        {
            if (ConfigBase.Default.IsTraceStack)
            {
                LogService.AnyLog("Stack", new StackTrace().GetFrame(0).GetMethod().ToString());
            }
            if (string.IsNullOrEmpty(text))
            {
                return(WordAnalyResult.Empty);
            }

            //var enc = Encoding.UTF8;
            ////var buffer = enc.GetBytes(text);
            //if (encoding != null) enc = encoding;
            ReadOnlySpan <char> span = new ReadOnlySpan <char>(text.ToCharArray());

            return(LinyeeWrodDict.Default.AddNew(text, new WordInfoOnce(span)));
        }
예제 #13
0
파일: Logger.cs 프로젝트: morefun0302/MLBot
        public async Task InvokeAsync(HttpContext context)
        {
            LogService.AnyLog("MLBot", "=====Logger===InvokeAsync=====");
            var url = context.Request.GetAbsoluteUri();

            LogService.AnyLog("MLBot", "请求地址:" + url);
            LogService.AnyLog("MLBot", "头部信息:" + string.Join("\r\n", context.Request.Headers));

            if (!nologurls.Contains(url))
            {
                LogService.AnyLog("MLBot", "内容主体:" + context.Request.GetBodyString());
            }

            LogService.AnyLog("MLBot", "=====Logger===Out=====");
            if (_next != null)
            {
                await _next.Invoke(context);
            }
            return;
        }
예제 #14
0
        /// <summary>
        /// 获取网站授权令牌
        /// </summary>
        /// <param name="webcode"></param>
        /// <param name="appid"></param>
        /// <param name="appsecrete"></param>
        /// <returns></returns>
        public static WxAccessToken GetWxWebToken(string webcode, string appid, string appsecret)
        {
            var         apiurl = $"https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={appsecret}&code={webcode}&grant_type=authorization_code";
            WebClientLy wc     = new WebClientLy();
            var         rejson = wc.DownloadString(apiurl);

            LogService.AnyLog("WxWebToken", rejson);
            var res = Newtonsoft.Json.JsonConvert.DeserializeObject <WxAccessToken>(rejson);

            if (res != null)
            {
                lock (webtoken)
                {
                    if (webtoken.ContainsKey(res.openid))
                    {
                        webtoken.Remove(res.openid);
                    }
                    webtoken.Add(res.openid, res);
                }
            }
            return(res);
        }
예제 #15
0
        public WordAnalyResult WordAnaly(string text, Encoding encoding = null)
        {
            if (ConfigBase.Default.IsTraceStack)
            {
                LogService.AnyLog("Stack", new StackTrace().GetFrame(0).GetMethod().ToString());
            }
            if (string.IsNullOrEmpty(text))
            {
                return(WordAnalyResult.Empty);
            }

            var enc = Encoding.UTF8;

            //var buffer = enc.GetBytes(text);
            if (encoding != null)
            {
                enc = encoding;
            }
            ReadOnlySpan <char> span = new ReadOnlySpan <char>(text.ToCharArray());

            return(new LinyeeNLParagraphAnalyzer(span, enc, ParagraphStopChars, SentenceStopChars, WordStopChars).ParagraphAnaly());
        }
예제 #16
0
        public LinyeeWrodDict()
        {
            if (ConfigBase.Default.IsTraceStack)
            {
                LogService.AnyLog("Stack", new StackTrace().GetFrame(0).GetMethod().ToString());
            }
            this.name = "默认";

            //目录检测
            if (string.IsNullOrEmpty(jsondir))
            {
                jsondir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "Dictionarys");
                if (!Directory.Exists(jsondir))
                {
                    Directory.CreateDirectory(jsondir);
                }
            }
            dbfile = Path.Combine(jsondir, "default.db");

            init(name);
            //子词典
            subdicts.AddRange(new LinyeeWrodDict[] { WordsDict, Idioms, PersonNames, PlaceNames, TempWords });
            //LinyeeCharDict.Default.OpenSaveCloseSave();
        }
예제 #17
0
        public ActionResult Post(string signature, string timestamp, string nonce, string openid, string encrypt_type, string msg_signature)
        {
            //StringBuilder log = new StringBuilder();
            LogService.AnyLog("WeChatWebHook", $"WxApi\tPost In");//{DateTime.Now.ToString("HH:mm:ss.fffffff")}\t

            PostModel postModel = new PostModel()
            {
                Token          = WechatMpSettings.Default.Token, //根据自己后台的设置保持一致
                Signature      = signature,
                Timestamp      = timestamp,
                Nonce          = nonce,
                AppId          = WechatMpSettings.Default.AppId,
                EncodingAESKey = WechatMpSettings.Default.EncodingAESKey,
                Msg_Signature  = msg_signature,
            };

            try
            {
                //加密异常
                if (encrypt_type == "aes" && string.IsNullOrEmpty(postModel.EncodingAESKey))
                {
                    return(Content("公从号接口有异常,请通过其它途径解决您的问题,并反馈此消息"));
                }
                if (encrypt_type == "aes" && wxcrypt == null)
                {
                    wxcrypt = new WXBizMsgCrypt(postModel.Token, postModel.EncodingAESKey, postModel.AppId);
                }

                if (!CheckSignature.Check(signature, postModel))
                {
                    return(Content("参数错误!"));
                }

                String PostXml = Request.GetBodyString();
                //解密信息
                if (encrypt_type == "aes")
                {
                    var    aeskey = WechatMpSettings.Default.EncodingAESKey;
                    string detext = null;
                    var    res    = wxcrypt.DecryptMsg(postModel.Msg_Signature, postModel.Timestamp, postModel.Nonce, PostXml, ref detext);
                    //Console.WriteLine($"{res} detext({postModel.Token},{postModel.EncodingAESKey},{postModel.AppId},{postModel.Msg_Signature}, {postModel.Timestamp}, {postModel.Nonce},{PostXml})>{detext}");
                    PostXml = detext;
                }

                WechatResponse wxsponse  = new WechatResponse(Request, PostXml);
                var            botsponse = wxsponse.Rebot();
                LogService.AnyLog("WeChatWebHook", "响应源数据", $"{botsponse.Content}");
                //加密信息
                if (encrypt_type == "aes")
                {
                    var    rTimeStamp = DateTime.Now.GetTimestamp10();
                    var    rNonce     = RandomString.BuildRndString(16);
                    string restr      = null;
                    var    rb         = wxcrypt.EncryptMsg(botsponse.Content, rTimeStamp + "", rNonce, ref restr);
                    if (rb == 0)
                    {
                        botsponse.Content = restr;
                    }
                    else
                    {
                        $"{rb} EncryptMsg".WriteErrorLine();
                    }
                }
                LogService.AnyLog("WeChatWebHook", "响应密数据", $"{botsponse.Content}");
                return(botsponse);
            }
            catch (Exception ex)
            {
                #region 异常处理
                LogService.AnyLog("WeChatWebHook", $"{ex.Message}");
                LogService.Exception(ex);
                return(Content(""));

                #endregion
            }
            finally
            {
                LogService.AnyLog("WeChatWebHook", $"WxApi\tPost Out");
            }
        }
예제 #18
0
        internal WordAnalyResult <List <string> > WordAnaly()
        {
            if (ConfigBase.Default.IsTraceStack)
            {
                LogService.AnyLog("Stack", new StackTrace().GetFrame(0).GetMethod().ToString());
            }
            WordAnalyResult <List <string> > result = new WordAnalyResult <List <string> >();

            #region 标点分词
            stops.Clear();
            stops.Add(0);//开始值
            //计算停止处
            for (var fi = 0; fi < Raw.Length; fi++)
            {
                //标点符号停止
                if (StopChars.Contains(Raw[fi]))
                {
                    stops.Add(fi);
                }
            }
            stops.Add(Raw.Length);//结束值
            //截词
            for (var fi = 1; fi < stops.Count; fi++)
            {
                var spi = stops[fi - 1];
                if (spi > 0)
                {
                    var splitword = Raw[spi];
                    words.Add(splitword.ToString());
                    spi++;
                }
                var epi = stops[fi];
                //if (epi >= Raw.Length && words.Count>0)
                //{
                //    break;//退出
                //}
                var wlen = epi - spi;
                if (wlen < 1)
                {
                    break;
                }
                var word    = Raw.Slice(spi, wlen);
                var wordstr = word.ToString();

                //词中是否含有中文
                if (wordstr.ContainChinese())
                {
                    try
                    {
                        var winfos = new LinyeeNLZHWordAnalyzer(word, Enc, LinyeeWrodDict.Default).WordAnaly();
                        if (winfos.IsOK)
                        {
                            words.AddRange(winfos.Data.Select(p => p.w));
                        }
                    }
                    catch (Exception ex)
                    {
                        ex.ToString().WriteErrorLine();
                    }
                }
                else
                {
                    words.Add(wordstr);
                    var info = new WordInfoOnce(wordstr);
                }
            }
            #endregion

            //
            return(result.SetData(words).SetOk());
        }
예제 #19
0
        internal virtual List <WordInfoOnce> WordAnaly(ReadOnlySpan <char> raw, int fi)
        {
            if (ConfigBase.Default.IsTraceStack)
            {
                LogService.AnyLog("Stack", new StackTrace().GetFrame(0).GetMethod().ToString());
            }
            List <WordInfoOnce> list = new List <WordInfoOnce>();
            var maxlen = raw.Length - fi;

            if (maxlen > 1)
            {
                #region 词典分词
                var arr = new WordInfoOnce[maxlen];
                for (var fj = 0; fj < maxlen; fj++)
                {
                    var ch = raw[fi + fj];
                    //charDict.CharAnaly(ch);//补充词典

                    var word = WordsAnaly(raw, fi + fj);

                    //语法调整

                    //词频调整
                    if (fj > 0 && word != null)
                    {
                        if (word.w.Length > arr[fj - 1].w.Length)
                        {
                            arr[fj - 1] = null;
                        }
                        else if (word.w.Length == arr[fj - 1].w.Length && word.f > arr[fj - 1].f)
                        {
                            arr[fj - 1] = null;
                        }
                    }
                    arr[fj] = word;
                }

                //结果处理
                string tword = "";
                for (var fj = 0; fj < maxlen;)
                {
                    var cword = arr[fj];
                    var nword = (fj + 1 < maxlen)?arr[fj + 1]:null;
                    if (cword == null)
                    {
                        tword += raw[fi + fj];
                        fj++;
                        continue;
                    }
                    else
                    {
                        if (tword.Length == 1)//单字成词
                        {
                            list.Add(new WordInfoOnce(tword[0]));
                            //list.Add(charDict.CharAnaly(tword[0]));
                            tword = "";
                        }
                        else if (tword.Length > 1)//多字新词
                        {
                            var maxkey = tword;
                            var info   = new WordInfoOnce(maxkey);
                            list.Add(info);
                            tword = "";
                            //SaveThread();
                        }

                        list.Add(cword);
                        tword = "";
                        fj   += cword.w.Length;
                        continue;
                    }
                }

                //最后不成词的字
                if (!string.IsNullOrEmpty(tword))
                {
                    list.Add(new WordInfoOnce(tword));
                    tword = "";
                }

                return(list);

                #endregion
            }
            else
            {
                #region 词典分词
                //list.Add( charDict.CharAnaly(raw[fi]));
                list.Add(new WordInfoOnce(raw[fi]));
                return(list);

                #endregion
            }
        }
예제 #20
0
        public WechatResponse Rebot()
        {
            var dtnow   = DateTime.Now;
            var dtday_1 = dtnow.AddDays(-1);

            try
            {
                switch (PostWxMsgType)
                {
                //文本
                case WxMsgType.TEXT:
                {
                    RebotContext    rc     = null;
                    string          rcrkey = null;
                    RebotChatRecord rcr    = null;
                    var             from   = xdict["FromUserName"];
                    if (rcdict.ContainsKey(from))
                    {
                        rc = rcdict[from];
                    }
                    else
                    {
                        rc = new RebotContext(from);
                    }

                    var botres = MLAiBot.Default.Processing(PostContent);
                    if (botres.IsOk)
                    {
                        _ = GetTextResponse(botres.Msg);
                        return(this);
                    }

                    //数字
                    if (dblBodyRegex.IsMatch(PostContent))
                    {
                        var val = 0d;
                        double.TryParse(PostContent, out val);
                        string res = null;
                        switch (val)
                        {
                        //不处理
                        case 1:
                            //return GetEmptyResponse();
                            break;

                        //原文返回
                        case 88:
                        case 886:
                        case 3166:
                            res = PostContent;
                            //return GetTextResponse(PostContent);
                            break;

                        default:
                            res = PostContent;
                            break;
                        }

                        if (string.IsNullOrEmpty(res))
                        {
                            _ = GetEmptyResponse();
                        }
                        else
                        {
                            _ = GetTextResponse(res);
                        }


                        if (rcr != null)
                        {
                            rcr.Records.Add(new ChatRecordInfo()
                                {
                                    Q = PostContent,
                                    A = Content,
                                    T = "数字",
                                    P = 1,
                                    //RT = -1,
                                    DT = DateTime.Now,
                                });
                        }

                        return(this);
                    }

                    //算术表达式
                    if (ArithmeticRegex.IsMatch(PostContent))
                    {
                        var res = rc.Exp_Cal_Async(PostContent).Result;
                        if (res.IsOk)
                        {
                            _ = GetTextResponse(res);
                        }

                        if (rcr != null)
                        {
                            rcr.Records.Add(new ChatRecordInfo()
                                {
                                    Q = PostContent,
                                    A = Content,
                                    T = "算术",
                                    P = 1,
                                    //RT= dtday_1,
                                    DT = DateTime.Now,
                                    IM = 0.01,
                                });
                            //cache.Replace(rcrkey, rcr);
                        }
                        if (res.IsOk)
                        {
                            return(this);
                        }
                    }


                    //闹钟服务
                    var alaim = setAlaim1.Match(PostContent);
                    if (alaim == null)
                    {
                        alaim = setAlaim2.Match(PostContent);
                    }
                    if (alaim != null && rc != null)
                    {
                        rc.ServiceType = ServiceTypeCode.闹钟服务;
                    }
                    if (alaim != null && rc != null && rc.ServiceType == ServiceTypeCode.闹钟服务)
                    {
                        if (!WechatCustomService.Default.AccessSendMsg)
                        {
                            _ = GetTextResponse($"抱歉,当前小玉无权向您主动发送消息,所以无法为您提供闹钟服务。");
                            return(this);
                        }

                        var time = -1;
                        int.TryParse(alaim.Groups["time"]?.Value, out time);
                        if (time > 0)
                        {
                            var      unit   = alaim.Groups["unit"].Value;
                            var      dothin = alaim.Groups["do"].Value;
                            DateTime dt     = DateTime.MinValue;
                            if (unit == "秒")
                            {
                                dt = DateTime.Now.AddSeconds(time);
                            }
                            else if (unit == "分钟")
                            {
                                dt = DateTime.Now.AddMinutes(time);
                            }
                            else if (unit == "小时")
                            {
                                dt = DateTime.Now.AddHours(time);
                            }

                            //添加 任务
                            WechatCustomService.Default.Enqueue(() =>
                                {
                                    //LogService.AnyLog("MLBot", "执行提醒服务");

                                    if (DateTime.Now >= dt)
                                    {
                                        var sentres = WechatCustomService.Default.SendTextMsg(xdict["FromUserName"], $"您让我{time}{unit}提醒您{dothin},现在时间已经到了!");
                                        if (!sentres.IsOk)
                                        {
                                            LogService.AnyLog("WeChatKF", "提醒服务", sentres.Code.ToString(), sentres.Msg);
                                        }
                                        return(true);
                                    }
                                    else
                                    {
                                        return(false);
                                    }
                                });
                            _ = GetTextResponse($"{time}{unit}后提醒您{dothin},闹钟设置已完成");

                            if (rcr != null)
                            {
                                rcr.Records.Add(new ChatRecordInfo()
                                    {
                                        Q  = PostContent,
                                        A  = Content,
                                        T  = "设定闹钟",
                                        P  = 1,
                                        RT = dtday_1,
                                        DT = DateTime.Now,
                                        IM = 0.01,
                                    });
                            }
                            return(this);
                        }
                    }

                    //招呼
                    if (new Regex(regHeaderString + "[你您]好[!.。!,,]" + regEnderString, RegexOptions.Compiled).IsMatch(PostContent))
                    {
                        _ = GetTextResponse("您好,我是小玉,正在为您服务!");
                        if (rcr != null)
                        {
                            rcr.Records.Add(new ChatRecordInfo()
                                {
                                    Q = PostContent,
                                    A = Content,
                                    T = "被招呼",
                                    P = 1,
                                    //RT = dtday_1,
                                    DT = DateTime.Now,
                                    IM = 0.01,
                                });
                        }
                        return(this);
                    }

                    //回应感谢
                    if (new Regex(regHeaderString + "谢谢[您你]?[啦了]?[!.。!,,]" + regEnderString, RegexOptions.Compiled).IsMatch(PostContent))
                    {
                        _ = GetTextResponse("能为您服务,是小玉的荣幸!");
                        if (rcr != null)
                        {
                            rcr.Records.Add(new ChatRecordInfo()
                                {
                                    Q = PostContent,
                                    A = Content,
                                    T = "被感谢",
                                    P = 1,
                                    //RT = -1,
                                    DT = DateTime.Now,
                                    IM = 0.01,
                                });
                        }
                        return(this);
                    }

                    //再见
                    if (new Regex(regHeaderString + "再见[啦了]?[!.。!,,]" + regEnderString, RegexOptions.Compiled).IsMatch(PostContent))
                    {
                        _ = GetTextResponse("能为您服务,是小玉的荣幸,期待您的再次光临!");
                        if (rcr != null)
                        {
                            rcr.Records.Add(new ChatRecordInfo()
                                {
                                    Q = PostContent,
                                    A = Content,
                                    T = "被再见",
                                    P = 1,
                                    //RT = -1,
                                    DT = DateTime.Now,
                                    IM = 0.01,
                                });
                        }
                        return(this);
                    }

                    ////意图或问题分类
                    //var words = LinyeeNLAnalyzer.Default.WordAnalyJieba(PostContent.ToLower()).Data;//暂时全转小写
                    //var yt = 0;

                    ////根据意图不同使用不同类型
                    //var s2s = s2ses[yt];
                    //switch (yt)
                    //{
                    //    case 0:
                    //    default:
                    //        var sres= s2s.Predict(words);
                    //        LogService.AnyLog("WxRebotNoSuper","seq2seq预测", $"{sres.ToJsonString()}");
                    //        if (sres.IsOk)
                    //        {
                    //            _ = GetTextResponse(string.Join("",sres.Data));
                    //            if (rcr != null)
                    //            {
                    //                rcr.Records.Add(new ChatRecordInfo()
                    //                {
                    //                    Q = PostContent,
                    //                    A = Content,
                    //                    T = "对话",
                    //                    P = 0,
                    //                    //RT = -1,
                    //                    DT = DateTime.Now,
                    //                    IM = 0.01,
                    //                });
                    //            }
                    //            return this;
                    //        }
                    //        break;
                    //}


                    //微信对话
                    {
                        var signedData  = jwt.Encode(new { username = fromuser, msg = PostContent }, WxopenAISettings.Default.EncodingAESKey);
                        var postjwtdata = "query=" + signedData;

                        var wc = new WebClientLy();
                        try
                        {
                            LogService.AnyLog("wxopenai", "提交参数", postjwtdata);
                            wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
                            var resjson = wc.UploadString("https://openai.weixin.qq.com/openapi/message/" + WxopenAISettings.Default.TOKEN, postjwtdata);
                            LogService.AnyLog("wxopenai", "响应参数", resjson);
                            var res = Newtonsoft.Json.JsonConvert.DeserializeObject <WxopenAIMessageSponseInfo>(resjson);
                            _ = GetTextResponse(res.answer);
                            return(this);
                        }
                        catch (Exception ex)
                        {
                            //res = new { ex.Message, Details = ex.ToString() }.ToJson();
                        }
                    }


                    //不能处理
                    LogService.AnyLog("WxRebotNoSuper", $@"小玉未能处理信息:{PostXml}");
                    _ = GetTextResponse($@"亲,小玉暂时不能理解您的信息,已收妥保存信息。请切换服务方式或通过其它途径获得解答。");

                    if (rcr != null)
                    {
                        rcr.Records.Add(new ChatRecordInfo()
                            {
                                Q = PostContent,
                                A = Content,
                                T = "未处理",
                                P = 1,
                                //RT = -1,
                                DT = DateTime.Now,
                                IM = 0.01,
                            });
                    }
                    return(this);
                }

                //事件
                case WxMsgType.EVENT:
                {
                    switch (PostWxEvent)
                    {
                    //关注
                    case WxEventType.SUBSCRIBE:
                        return(GetTextResponse($@"欢迎回家!!我是小玉,可以为您提供很多服务哦!"));

                    //取消关注
                    case WxEventType.UNSUBSCRIBE:
                        return(GetTextResponse($@"亲,小玉都很舍不得您!!记得常回来看看哦!"));

                    //菜单处理
                    case WxEventType.CLICK:
                        return(GetResponseFromMenu(PostEventKey));

                    //不处理
                    case WxEventType.TEMPLATESENDJOBFINISH:
                        return(GetEmptyResponse());

                    //url跳转
                    case WxEventType.VIEW:
                        return(GetEmptyResponse());

                    //不能处理
                    case WxEventType.SCAN:
                    case WxEventType.LOCATION:
                    case WxEventType.NONE:
                    default:
                        LogService.AnyLog("WxRebotNoSuper", $@"小玉未能处理信息:{PostXml}");
                        return(GetTextResponse($@"亲,抱歉!小玉暂时不能理解您的{PostWxEvent.ToString()}事件信息,已收妥保存信息。请通过其它途径获得解答。"));
                    }
                }

                //不能处理
                case WxMsgType.IMAGE:
                case WxMsgType.LINK:
                case WxMsgType.LOCATION:
                case WxMsgType.SHORTVIDEO:
                case WxMsgType.VIDEO:
                case WxMsgType.VOICE:
                case WxMsgType.NONE:
                default:
                    LogService.AnyLog("WxRebotNoSuper", $@"小玉未能处理信息:{PostXml}");
                    return(GetTextResponse($@"亲,抱歉!小玉暂时不能理解您的{PostWxMsgType.ToString()}信息,已收妥保存信息。请通过其它途径获得解答。"));
                }
            }
            catch (Exception ex)
            {
                LogService.Exception(ex);
                return(GetTextResponse($@"亲,小玉的软体出问题了{ex.Message},请通过其它途径获得解答。"));
            }
        }
예제 #21
0
        public WechatResponse Rebot()
        {
            var dtnow   = DateTime.Now;
            var dtday_1 = dtnow.AddDays(-1);

            try
            {
                switch (PostWxMsgType)
                {
                //文本
                case WxMsgType.TEXT:
                {
                    RebotContext    rc     = null;
                    string          rcrkey = null;
                    RebotChatRecord rcr    = null;
                    var             botres = MLAiBot.Default.Processing(PostContent);
                    if (botres.IsOk)
                    {
                        _ = GetTextResponse(botres.Msg);
                        return(this);
                    }

                    //数字
                    if (dblBodyRegex.IsMatch(PostContent))
                    {
                        var val = 0d;
                        double.TryParse(PostContent, out val);
                        string res = null;
                        switch (val)
                        {
                        //不处理
                        case 1:
                            //return GetEmptyResponse();
                            break;

                        //原文返回
                        case 88:
                        case 886:
                        case 3166:
                            res = PostContent;
                            //return GetTextResponse(PostContent);
                            break;
                            //default:
                            //    res = $@"亲,小玉暂时不能理解{PostContent}的意思。请使用更具体的文字来表述或通过其它途径获得解答。";
                            //    //return GetTextResponse($@"亲,小玉暂时不能理解{PostContent}的意思。请使用更具体的文字来表述或通过其它途径获得解答。");
                            //    break;
                        }

                        if (string.IsNullOrEmpty(res))
                        {
                            _ = GetEmptyResponse();
                        }
                        else
                        {
                            _ = GetTextResponse(res);
                        }


                        if (rcr != null)
                        {
                            rcr.Records.Add(new ChatRecordInfo()
                                {
                                    Q = PostContent,
                                    A = Content,
                                    T = "数字",
                                    P = 1,
                                    //RT = -1,
                                    DT = DateTime.Now,
                                });
                        }

                        return(this);
                    }

                    //算术表达式
                    if (ArithmeticRegex.IsMatch(PostContent))
                    {
                        var res = rc.Exp_Cal_Async(PostContent).Result;
                        if (res.IsOk)
                        {
                            _ = GetTextResponse(res);
                        }

                        if (rcr != null)
                        {
                            rcr.Records.Add(new ChatRecordInfo()
                                {
                                    Q = PostContent,
                                    A = Content,
                                    T = "算术",
                                    P = 1,
                                    //RT= dtday_1,
                                    DT = DateTime.Now,
                                    IM = 0.01,
                                });
                            //cache.Replace(rcrkey, rcr);
                        }
                        if (res.IsOk)
                        {
                            return(this);
                        }
                    }


                    //闹钟服务
                    var alaim = setAlaim1.Match(PostContent);
                    if (alaim == null)
                    {
                        alaim = setAlaim2.Match(PostContent);
                    }
                    if (alaim != null && rc != null)
                    {
                        rc.ServiceType = ServiceTypeCode.闹钟服务;
                    }
                    if (alaim != null && rc != null && rc.ServiceType == ServiceTypeCode.闹钟服务)
                    {
                        var time = -1;
                        int.TryParse(alaim.Groups["time"]?.Value, out time);
                        if (time > 0)
                        {
                            var      unit   = alaim.Groups["unit"].Value;
                            var      dothin = alaim.Groups["do"].Value;
                            DateTime dt     = DateTime.MinValue;
                            if (unit == "秒")
                            {
                                dt = DateTime.Now.AddSeconds(time);
                            }
                            else if (unit == "分钟")
                            {
                                dt = DateTime.Now.AddMinutes(time);
                            }
                            else if (unit == "小时")
                            {
                                dt = DateTime.Now.AddHours(time);
                            }

                            //添加 任务
                            WechatCustomService.Default.Enqueue(() =>
                                {
                                    if (DateTime.Now >= dt)
                                    {
                                        WechatCustomService.Default.SendTextMsg(xdict["FromUserName"], $"您让我{time}{unit}提醒您{dothin},现在时间已经到了!");
                                        return(true);
                                    }
                                    else
                                    {
                                        return(false);
                                    }
                                });
                            _ = GetTextResponse($"{time}{unit}后提醒您{dothin},闹钟设置已完成");

                            if (rcr != null)
                            {
                                rcr.Records.Add(new ChatRecordInfo()
                                    {
                                        Q  = PostContent,
                                        A  = Content,
                                        T  = "设定闹钟",
                                        P  = 1,
                                        RT = dtday_1,
                                        DT = DateTime.Now,
                                        IM = 0.01,
                                    });
                            }
                            return(this);
                        }
                    }

                    //招呼
                    if (new Regex(regHeaderString + "[你您]好[!.。!,,]" + regEnderString, RegexOptions.Compiled).IsMatch(PostContent))
                    {
                        _ = GetTextResponse("您好,我是小玉,正在为您服务!");
                        if (rcr != null)
                        {
                            rcr.Records.Add(new ChatRecordInfo()
                                {
                                    Q = PostContent,
                                    A = Content,
                                    T = "被招呼",
                                    P = 1,
                                    //RT = dtday_1,
                                    DT = DateTime.Now,
                                    IM = 0.01,
                                });
                        }
                        return(this);
                    }

                    //回应感谢
                    if (new Regex(regHeaderString + "谢谢[您你]?[啦了]?[!.。!,,]" + regEnderString, RegexOptions.Compiled).IsMatch(PostContent))
                    {
                        _ = GetTextResponse("能为您服务,是小玉的荣幸!");
                        if (rcr != null)
                        {
                            rcr.Records.Add(new ChatRecordInfo()
                                {
                                    Q = PostContent,
                                    A = Content,
                                    T = "被感谢",
                                    P = 1,
                                    //RT = -1,
                                    DT = DateTime.Now,
                                    IM = 0.01,
                                });
                        }
                        return(this);
                    }

                    //再见
                    if (new Regex(regHeaderString + "再见[啦了]?[!.。!,,]" + regEnderString, RegexOptions.Compiled).IsMatch(PostContent))
                    {
                        _ = GetTextResponse("能为您服务,是小玉的荣幸,期待您的再次光临!");
                        if (rcr != null)
                        {
                            rcr.Records.Add(new ChatRecordInfo()
                                {
                                    Q = PostContent,
                                    A = Content,
                                    T = "被再见",
                                    P = 1,
                                    //RT = -1,
                                    DT = DateTime.Now,
                                    IM = 0.01,
                                });
                        }
                        return(this);
                    }

                    //意图或问题分类
                    var words = LinyeeNLAnalyzer.Default.WordAnalyJieba(PostContent.ToLower()).Data;        //暂时全转小写
                    var yt    = 0;

                    //根据意图不同使用不同类型
                    var s2s = s2ses[yt];
                    switch (yt)
                    {
                    case 0:
                    default:
                        var sres = s2s.Predict(words);
                        LogService.AnyLog("WxRebotNoSuper", "seq2seq预测", $"{sres.ToJsonString()}");
                        if (sres.IsOk)
                        {
                            _ = GetTextResponse(string.Join("", sres.Data));
                            if (rcr != null)
                            {
                                rcr.Records.Add(new ChatRecordInfo()
                                    {
                                        Q = PostContent,
                                        A = Content,
                                        T = "对话",
                                        P = 0,
                                        //RT = -1,
                                        DT = DateTime.Now,
                                        IM = 0.01,
                                    });
                            }
                            return(this);
                        }
                        break;
                    }

                    //不能处理
                    LogService.AnyLog("WxRebotNoSuper", $@"小玉未能处理信息:{PostXml}");
                    _ = GetTextResponse($@"亲,小玉暂时不能理解您的信息,已收妥保存信息。请切换服务方式或通过其它途径获得解答。");

                    if (rcr != null)
                    {
                        rcr.Records.Add(new ChatRecordInfo()
                            {
                                Q = PostContent,
                                A = Content,
                                T = "未处理",
                                P = 1,
                                //RT = -1,
                                DT = DateTime.Now,
                                IM = 0.01,
                            });
                    }
                    return(this);
                }

                //事件
                case WxMsgType.EVENT:
                {
                    switch (PostWxEvent)
                    {
                    //关注
                    case WxEventType.SUBSCRIBE:
                        return(GetTextResponse($@"欢迎回家!!我是小玉,可以为您提供很多服务哦!"));

                    //取消关注
                    case WxEventType.UNSUBSCRIBE:
                        return(GetTextResponse($@"亲,小玉都很舍不得您!!记得常回来看看哦!"));

                    //菜单处理
                    case WxEventType.CLICK:
                        return(GetResponseFromMenu(PostEventKey));

                    //不处理
                    case WxEventType.TEMPLATESENDJOBFINISH:
                        return(GetEmptyResponse());

                    //url跳转
                    case WxEventType.VIEW:
                        return(GetEmptyResponse());

                    //不能处理
                    case WxEventType.SCAN:
                    case WxEventType.LOCATION:
                    case WxEventType.NONE:
                    default:
                        LogService.AnyLog("WxRebotNoSuper", $@"小玉未能处理信息:{PostXml}");
                        return(GetTextResponse($@"亲,抱歉!小玉暂时不能理解您的{PostWxEvent.ToString()}事件信息,已收妥保存信息。请通过其它途径获得解答。"));
                    }
                }

                //不能处理
                case WxMsgType.IMAGE:
                case WxMsgType.LINK:
                case WxMsgType.LOCATION:
                case WxMsgType.SHORTVIDEO:
                case WxMsgType.VIDEO:
                case WxMsgType.VOICE:
                case WxMsgType.NONE:
                default:
                    LogService.AnyLog("WxRebotNoSuper", $@"小玉未能处理信息:{PostXml}");
                    return(GetTextResponse($@"亲,抱歉!小玉暂时不能理解您的{PostWxMsgType.ToString()}信息,已收妥保存信息。请通过其它途径获得解答。"));
                }
            }
            catch (Exception ex)
            {
                LogService.Exception(ex);
                return(GetTextResponse($@"亲,小玉的软体出问题了{ex.Message},请通过其它途径获得解答。"));
            }
        }
예제 #22
0
 private WechatResponse GetResponseFromMenu(string postEventKey)
 {
     LogService.AnyLog("WxRebotNoSuper", $@"小玉未能正确识别菜单信息:{postEventKey} {PostXml}");
     return(GetEmptyResponse());
 }