498 lines
28 KiB
C#
498 lines
28 KiB
C#
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; }
|
||
//}
|
||
|
||
}
|
||
}
|