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("无请求流或无法倒流"); } }
public LinyeeNLAnalyzer() { if (ConfigBase.Default.IsTraceStack) { LogService.AnyLog("Stack", new StackTrace().GetFrame(0).GetMethod().ToString()); } //var dict= LinyeeWrodDict.Default;//初始化词典 }
public WordInfoOnce(string word) { if (ConfigBase.Default.IsTraceStack) { LogService.AnyLog("Stack", new StackTrace().GetFrame(0).GetMethod().ToString()); } this.w = word; }
public Task StopAsync(CancellationToken cancellationToken) { Dispose(); foreach (var wcs in wcss.Values) { wcs.Dispose(); } LogService.AnyLog("MLBot", "计时服务已停止", id.ToString()); return(Task.CompletedTask); }
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()); }
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>(); }
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); }
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)); }
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))); }
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; }
/// <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); }
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()); }
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(); }
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"); } }
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()); }
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 } }
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},请通过其它途径获得解答。")); } }
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},请通过其它途径获得解答。")); } }
private WechatResponse GetResponseFromMenu(string postEventKey) { LogService.AnyLog("WxRebotNoSuper", $@"小玉未能正确识别菜单信息:{postEventKey} {PostXml}"); return(GetEmptyResponse()); }