2025-04-24 18:31:27 +08:00

498 lines
28 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Senparc.Weixin.MP.MessageHandlers;
using Senparc.Weixin.MP.Entities;
using System.Xml.Linq;
using Senparc.Weixin.MP.Entities.Request;
using Senparc.NeuChar.Context;
using Senparc.NeuChar.Entities;
namespace MyCode.Project.Services.CustomMessageHandler
{
public partial class CustomMessageHandler : MessageHandler<MessageContext<IRequestMessageBase, IResponseMessageBase>>
{
public CustomMessageHandler(XDocument requestDoc, PostModel postModel = null, int maxRecordCount = 0)
: base(requestDoc, postModel, maxRecordCount)
{
}
public CustomMessageHandler(RequestMessageBase requestMessage, PostModel postModel = null, int maxRecordCount = 0)
: base(requestMessage, postModel, maxRecordCount)
{
}
public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
{
var responseMessage = this.CreateResponseMessage<ResponseMessageText>();
return responseMessage;
}
// /// <summary>
// /// 处理文字请求
// /// </summary>
// /// <returns></returns>
// public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
// {
// //说明实际项目中这里的逻辑可以交给Service处理具体信息参考OnLocationRequest方法或/Service/LocationSercice.cs
// var requestHandler = requestMessage.StartHandler();
// var defaultResponseMessage = base.CreateResponseMessage<ResponseMessageText>();
// // 获取主公众号关键词回复配置
// GetCurrentAutoreplyInfoResult AutoreplyInfoResult = GetCurrentAutoreplyInfo();
// KeywordAutoReplyInfo keywordAutoReplyInfo = null;
// // 关键词自动回复列表
// List<KeywordAutoReplyInfo_Item> keywordAutoReplyInfoItemlist = null;
// // 匹配的关键词列表
// List<KeywordListInfoItem> keywordListInfoList = null;
// // 回复内容列表
// List<ReplyListInfoItem> replyListInfoList = null;
// ReplyListInfoItem replyListInfo = null;
// // 关键词内容
// string content = null;
// // 回复匹配模式 contain 0消息内容必须和关键词严格相同equal 1消息内容必须和关键词严格相同
// AutoReplyMatchMode matchMode;
// // 回复模式 reply_all 0全部回复random_one 1 回复其中任意一条
// AutoReplyMode autoReplyMode;
// // 回复类型 关键词的 貌似没用
// AutoReplyType keywordType;
// int randomone = 0;
// string[] keyWordArray;
// string wxUserName = requestMessage.ToUserName;
// //WechatAccountSettingEntity model = new WechatAccountSettingManager().GetObjectByUserName(wxUserName);
// //var accessToken = GlobalSetting.GetAuthorizerAccessToken(model);
// //int circleNum = 0;
// if (AutoreplyInfoResult == null)
// {
// //defaultResponseMessage.Content = "您刚才发送了文字信息:{0}\r\n\r\n", requestMessage.Content;
// //return defaultResponseMessage;
// requestHandler.Default(() =>
// {
// var responseMessageText = base.CreateResponseMessage<ResponseMessageText>();
// var result = new StringBuilder();
// result.AppendFormat("您刚才发送了文字信息:{0}\r\n\r\n", requestMessage.Content);
// result.AppendLine("\r\n");
// result.AppendLine("目前系统还没办法给你回复~~~");
// responseMessageText.Content = result.ToString();
// return responseMessageText;
// });
// }
// else
// {
// // 可以自定义系统的操作参数 而且可以指定必须是某个OpenId才可以
// if (string.Equals("刷新", requestMessage.Content))
// {
// requestHandler
// //关键字不区分大小写,按照顺序匹配成功后将不再运行下面的逻辑
// .Default(() =>
// {
// //AutoreplyInfoResult = GetCurrentAutoreplyInfo(true);
// ////var result = new StringBuilder();
// ////result.AppendLine("主公众号关键词配置已强制刷新完毕");
// ////result.AppendLine("\r\n 数据内容");
// ////result.AppendLine(AutoreplyInfoResult.FastToJson());
// //defaultResponseMessage.Content = "主公众号关键词配置已强制刷新完毕";
// try
// {
// //string authorizerAccessToken = GetAuthorizerAccessToken(model);
// //CustomApi.SendText(accessToken, requestMessage.FromUserName, "现在时间是:" + DateTime.Now);
// defaultResponseMessage.Content = "后台代码消息";
// }
// catch (Exception ex)
// {
// defaultResponseMessage.Content += ",出现异常:" + ex.Message;
// }
// return defaultResponseMessage;
// });
// }
// else
// {
// keywordAutoReplyInfo = AutoreplyInfoResult.keyword_autoreply_info;
// if (keywordAutoReplyInfo == null)
// {
// requestHandler.Default(() =>
// {
// var responseMessageText = base.CreateResponseMessage<ResponseMessageText>();
// var result = new StringBuilder();
// result.AppendFormat("您刚才发送了文字信息:{0}\r\n\r\n", requestMessage.Content);
// result.AppendLine("\r\n");
// result.AppendLine("没有获取到任何回复信息,貌似主系统没有配置或关闭了关键词回复功能");
// responseMessageText.Content = result.ToString();
// return responseMessageText;
// });
// }
// else
// {
// // 关键词回复信息列表
// keywordAutoReplyInfoItemlist = keywordAutoReplyInfo.list;
// if (keywordAutoReplyInfoItemlist != null && keywordAutoReplyInfoItemlist.Any())
// {
// // 判断输入的关键词是否在List中
// foreach (var item in keywordAutoReplyInfoItemlist)
// {
// // 关键词列表 判断关键词是否符合输入的内容
// keywordListInfoList = item.keyword_list_info;
// autoReplyMode = item.reply_mode;
// if (keywordListInfoList != null && keywordListInfoList.Any())
// {
// foreach (var keywordListInfoItem in keywordListInfoList)
// {
// replyListInfoList = item.reply_list_info;
// content = keywordListInfoItem.content;
// // 是否精确匹配
// matchMode = keywordListInfoItem.match_mode;
// keywordType = keywordListInfoItem.type;
// if (!string.IsNullOrWhiteSpace(content))
// {
// // 只要包含了英文的,就是要进行分组
// if (content.IndexOf(",") > 0)
// {
// keyWordArray = content.Split(',');
// }
// else
// {
// keyWordArray = new string[] { content };
// }
// // 判断如果是随机回复一条 设置随机值
// if (autoReplyMode == AutoReplyMode.random_one)
// {
// Random rd = new Random();
// randomone = rd.Next(0, replyListInfoList.Count);
// }
// bool matchSuccessed = false;
// // 关键词列表 匹配
// foreach (var keyword in keyWordArray)
// {
// if (matchMode == AutoReplyMatchMode.equal)
// {
// // 精确匹配
// if (!requestHandler.MatchSuccessed &&
// ((requestHandler.CaseSensitive && requestMessage.Content == keyword) ||
// (!requestHandler.CaseSensitive && requestMessage.Content.ToUpper() == keyword.ToUpper())))
// {
// matchSuccessed = true;
// //requestHandler.ResponseMessage = func();
// break;
// }
// }
// else
// {
// //// 只要包含就可以
// //if (!requestHandler.MatchSuccessed &&
// // ((requestHandler.CaseSensitive && RequestMessageTextExtension.ContainEachOther(requestMessage.Content, keyword)) ||
// // (!requestHandler.CaseSensitive && RequestMessageTextExtension.ContainEachOther(requestMessage.Content.ToUpper(), keyword.ToUpper()))))
// //{
// // matchSuccessed = true;
// // //requestHandler.ResponseMessage = func();
// // break;
// //}
// }
// }
// if (matchSuccessed)
// {
// for (int i = 0; i < replyListInfoList.Count; i++)
// {
// // 使用自动回复
// if (matchMode == AutoReplyMatchMode.equal)
// {
// replyListInfo = replyListInfoList[i];
// }
// else
// {
// replyListInfo = replyListInfoList[0];
// }
// AutoReplyType replyType = replyListInfo.type;
// SetRequestHandler(requestMessage, requestHandler, defaultResponseMessage, replyListInfo, replyType);
// //if (matchMode == AutoReplyMatchMode.equal && i == randomone)
// //{
// // continue;
// //}
// //else if (i == 0)
// //{
// // continue;
// //}
// //else
// //{
// // // 使用客服接口发送
// // try
// // {
// // replyListInfo = replyListInfoList[i];
// // //SendCustomMessagei(accessToken, requestMessage, replyListInfo);
// // }
// // catch (Exception ex)
// // {
// // //NLogHelper.Warn(ex, "关键词回复时,客户接口异常");
// // }
// //}
// }
// // 匹配完毕不再执行
// break;
// }
// //// 回复内容列表
// //for (int i = 0; i < replyListInfoList.Count; i++)
// ////foreach (var replyListInfo in replyListInfoList)
// //{
// // replyListInfo = replyListInfoList[i];
// // // 是随机回复一条的模式
// // if (autoReplyMode == AutoReplyMode.random_one)
// // {
// // // 此处思路不对关键词是否符合是在HandlerRequest里判断的 需要移到外面判断??
// // if (randomone == i)
// // {
// //HandlerRequest(requestHandler, requestMessage, defaultResponseMessage, replyListInfo, matchMode, keyWordArray);
// // break;
// // }
// // }
// // else
// // {
// // HandlerRequest(requestHandler, requestMessage, defaultResponseMessage, replyListInfo, matchMode, keyWordArray);
// // }
// // circleNum++;
// // if (requestHandler.MatchSuccessed)
// // {
// // break;
// // }
// //}
// }
// }
// }
// // requestHandler.GetResponseMessage();
// // 只要匹配成功就不再继续了
// //if (requestHandler.MatchSuccessed)
// //{
// // NLogHelper.Debug(requestMessage.Content + "匹配成功autoReplyMode = " + AutoReplyMode.random_one + ",输出 ResponseMessage=" + requestHandler.GetResponseMessage().FastToJson());
// // break;
// //}
// }
// }
// else
// {
// var responseMessageText = base.CreateResponseMessage<ResponseMessageText>();
// var result = new StringBuilder();
// result.AppendFormat("您刚才发送了文字信息:{0}\r\n\r\n", requestMessage.Content);
// result.AppendLine("\r\n");
// result.AppendLine("没有获取到关键词回复列表数据");
// responseMessageText.Content = result.ToString();
// return responseMessageText;
// }
// }
// }
// }
// if (!requestHandler.MatchSuccessed)
// {
// requestHandler.Default(() =>
// {
// var responseMessageText = base.CreateResponseMessage<ResponseMessageText>();
// var result = new StringBuilder();
// result.AppendFormat("您刚才发送了信息:{0}\r\n\r\n", requestMessage.Content);
// result.AppendLine("\r\n");
// result.AppendLine("目前还不能理解您的意思。");
// responseMessageText.Content = result.ToString();
// return responseMessageText;
// });
// }
// return requestHandler.GetResponseMessage() as IResponseMessageBase;
// }
// /// <summary>
// /// 关键词自动回复
// /// </summary>
// /// <param name="requestMessage"></param>
// /// <param name="requestHandler"></param>
// /// <param name="defaultResponseMessage"></param>
// /// <param name="replyListInfo"></param>
// /// <param name="replyType"></param>
// private void SetRequestHandler(RequestMessageText requestMessage, RequestMessageTextKeywordHandler requestHandler, ResponseMessageText defaultResponseMessage, ReplyListInfoItem replyListInfo, AutoReplyType replyType)
// {
// LogHelper.Info("replyType" + replyType.ToString());
// switch (replyType)
// {
// case AutoReplyType.text:
// var responseMessageText = base.CreateResponseMessage<ResponseMessageText>();
// responseMessageText.Content = replyListInfo.content;
// requestHandler.ResponseMessage = responseMessageText;
// break;
// case AutoReplyType.img:
// var responseMessageImage = base.CreateResponseMessage<ResponseMessageImage>();
// responseMessageImage.Image.MediaId = replyListInfo.content;
// requestHandler.ResponseMessage = responseMessageImage;
// break;
// case AutoReplyType.voice:
// var responseMessageVoice = base.CreateResponseMessage<ResponseMessageVoice>();
// responseMessageVoice.Voice.MediaId = replyListInfo.content;
// requestHandler.ResponseMessage = responseMessageVoice;
// break;
// case AutoReplyType.video:
// var responseMessageVideo = base.CreateResponseMessage<ResponseMessageVideo>();
// responseMessageVideo.Video.MediaId = replyListInfo.content;
// requestHandler.ResponseMessage = responseMessageVideo;
// break;
// case AutoReplyType.news:
// var responseMessageNews = base.CreateResponseMessage<ResponseMessageNews>();
// //responseMessageNews.Articles = replyListInfo.news_info.list;
// //return responseMessageNews;
// foreach (var newsInfo in replyListInfo.news_info.list)
// {
// responseMessageNews.Articles.Add(new Article()
// {
// Title = newsInfo.title,
// Description = newsInfo.digest,
// Url = newsInfo.content_url,
// PicUrl = newsInfo.cover_url
// });
// }
// requestHandler.ResponseMessage = responseMessageNews;
// break;
// default:
// var result = new StringBuilder();
// result.AppendFormat("您刚才发送了文字信息:{0}\r\n\r\n", requestMessage.Content);
// result.AppendLine("\r\n");
// result.AppendFormat("由于没有这个类型:{0},系统不能给你任何回复", replyListInfo.type);
// defaultResponseMessage.Content = result.ToString();
// requestHandler.ResponseMessage = defaultResponseMessage;
// break;
// }
// // 设置匹配成功
// requestHandler.MatchSuccessed = true;
// }
// /// <summary>
// /// 推送客服消息
// /// </summary>
// /// <param name="accessToken"></param>
// /// <param name="requestMessage"></param>
// /// <param name="replyListInfo"></param>
// /// <param name="replyType"></param>
// private void SendCustomMessagei(string accessToken, RequestMessageText requestMessage, ReplyListInfoItem replyListInfo)
// {
// AutoReplyType replyType = replyListInfo.type;
// switch (replyType)
// {
// case AutoReplyType.text:
// CustomApi.SendText(accessToken, requestMessage.FromUserName, replyListInfo.content);
// break;
// case AutoReplyType.img:
// CustomApi.SendImage(accessToken, requestMessage.FromUserName, replyListInfo.content);
// break;
// case AutoReplyType.voice:
// CustomApi.SendVoice(accessToken, requestMessage.FromUserName, replyListInfo.content);
// break;
// case AutoReplyType.video:
// CustomApi.SendVideo(accessToken, requestMessage.FromUserName, replyListInfo.content, "视频回复", "视频消息");
// break;
// case AutoReplyType.news:
// List<Article> articles = new List<Article>();
// foreach (var newsInfo in replyListInfo.news_info.list)
// {
// articles.Add(new Article()
// {
// Title = newsInfo.title,
// Description = newsInfo.digest,
// Url = newsInfo.content_url
// });
// }
// CustomApi.SendNews(accessToken, requestMessage.FromUserName, articles);
// break;
// }
// }
// /// <summary>
// /// 获取主公众号自动回复规则设置
// /// </summary>
// /// <returns></returns>
// protected GetCurrentAutoreplyInfoResult GetCurrentAutoreplyInfo()
// {
// // 进行缓存
// GetCurrentAutoreplyInfoResult infoResult = null;
// try
// {
// IContainerCacheStrategy containerCache = LocalContainerCacheStrategy.Instance;
// IBaseObjectCacheStrategy baseCache = containerCache.BaseCacheStrategy();
// string key = "AutoreplyInfo:" + appId;
// HashSetCacheModel<GetCurrentAutoreplyInfoResult> cacheModel = null;
// if (baseCache.CheckExisted(key))
// {
// cacheModel = baseCache.Get<HashSetCacheModel<GetCurrentAutoreplyInfoResult>>(key);
// if (cacheModel.ExpireAt < DateTime.Now)
// {
// // 过期了,要更新一次
// infoResult = AutoReplyApi.GetCurrentAutoreplyInfo(appId);
// cacheModel = new HashSetCacheModel<GetCurrentAutoreplyInfoResult>();
// cacheModel.CreateOn = DateTime.Now;
// cacheModel.ExpireAt = DateTime.Now.AddMinutes(10);
// cacheModel.Value = infoResult;
// baseCache.Update(key, cacheModel);
// }
// infoResult = cacheModel.Value;
// }
// else
// {
// infoResult = AutoReplyApi.GetCurrentAutoreplyInfo(appId);
// cacheModel = new HashSetCacheModel<GetCurrentAutoreplyInfoResult>();
// cacheModel.CreateOn = DateTime.Now;
// cacheModel.ExpireAt = DateTime.Now.AddMinutes(10);
// cacheModel.Value = infoResult;
// baseCache.Set(key, cacheModel);
// }
// }
// catch (Exception ex)
// {
// LogHelper.Error("GetCurrentAutoreplyInfo", ex);
// }
// return infoResult;
// }
//}
///// <summary>
///// HashSetCacheModel<T>
///// HashSet结构
/////
///// 修改纪录
/////
///// 2018-07-02版本1.0 JiShiYu 创建文件。
/////
///// <author>
///// <name>JiShiYu</name>
///// <date>2018-07-02</date>
///// </author>
///// </summary>
//public class HashSetCacheModel<T>
//{
// /// <summary>
// /// 进入缓存的时间
// /// </summary>
// public DateTime CreateOn { set; get; } = DateTime.Now;
// /// <summary>
// /// 缓存过期时间
// /// </summary>
// public DateTime ExpireAt { set; get; }
// /// <summary>
// /// 缓存对象的值
// /// </summary>
// public T Value { get; set; }
//}
}
}