498 lines
28 KiB
C#
Raw Normal View History

2025-04-21 14:10:27 +08:00
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; }
//}
}
}