目前在做微信第三方平台開發,其中有一個需求,所有綁定的公眾號使用主公眾號的關鍵詞配置,我看了下Senparc.Weixin SDK的關鍵詞回復方法,進行了一些調整,滿足了需求。
使用Senparc.Weixin SDK 底層,文件位置 DotNet.WeChat.CommonService.CustomMessageHandler.CustomMessageHandler.cs
/// <summary> /// 處理文字請求 /// </summary> /// <returns></returns> public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage) { //說明:實際項目中這里的邏輯可以交給Service處理具體信息,參考OnLocationRequest方法或/Service/LocationSercice.cs #region 書中例子 //if (requestMessage.Content == "你好") //{ // var responseMessage = base.CreateResponseMessage<ResponseMessageNews>(); // var title = "Title"; // var description = "Description"; // var picUrl = "PicUrl"; // var url = "Url"; // responseMessage.Articles.Add(new Article() // { // Title = title, // Description = description, // PicUrl = picUrl, // Url = url // }); // return responseMessage; //} //else if (requestMessage.Content == "Senparc") //{ // //相似處理邏輯 //} //else //{ // //... //} #endregion #region 歷史方法 //方法一(v0.1),此方法調用太過繁瑣,已過時(但仍是所有方法的核心基礎),建議使用方法二到四 //var responseMessage = // ResponseMessageBase.CreateFromRequestMessage(RequestMessage, ResponseMsgType.Text) as // ResponseMessageText; //方法二(v0.4) //var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(RequestMessage); //方法三(v0.4),擴展方法,需要using Senparc.Weixin.MP.Helpers; //var responseMessage = RequestMessage.CreateResponseMessage<ResponseMessageText>(); //方法四(v0.6+),僅適合在HandlerMessage內部使用,本質上是對方法三的封裝 //注意:下面泛型ResponseMessageText即返回給客戶端的類型,可以根據自己的需要填寫ResponseMessageNews等不同類型。 #endregion 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); } 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) { // 使用自動回復 if (matchMode == AutoReplyMatchMode.equal) { replyListInfo = replyListInfoList[randomone]; } else { replyListInfo = replyListInfoList[0]; } AutoReplyType replyType = replyListInfo.type; SetRequestHandler(requestMessage, requestHandler, defaultResponseMessage, replyListInfo, replyType); for (int i = 0; i < replyListInfoList.Count; i++) { 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; }); } //NLogHelper.Info("circleNum=" + circleNum); // // 下面的要替換掉 // requestHandler // //關鍵字不區分大小寫,按照順序匹配成功后將不再運行下面的邏輯 // .Keyword("約束", () => // { // defaultResponseMessage.Content = // @"您正在進行微信內置瀏覽器約束判斷測試。您可以: // <a href=""http://sdk.weixin.senparc.com/FilterTest/"">點擊這里</a>進行客戶端約束測試(地址:http://sdk.weixin.senparc.com/FilterTest/),如果在微信外打開將直接返回文字。 // 或: // <a href=""http://sdk.weixin.senparc.com/FilterTest/Redirect"">點擊這里</a>進行客戶端約束測試(地址:http://sdk.weixin.senparc.com/FilterTest/Redirect),如果在微信外打開將重定向一次URL。"; // return defaultResponseMessage; // }). // //匹配任一關鍵字 // Keywords(new[] { "托管", "代理" }, () => // { // //開始用代理托管,把請求轉到其他服務器上去,然后拿回結果 // //甚至也可以將所有請求在DefaultResponseMessage()中托管到外部。 // DateTime dt1 = DateTime.Now; //計時開始 // var agentXml = RequestDocument.ToString(); // #region 暫時轉發到SDK線上Demo // agentUrl = "http://sdk.weixin.senparc.com/weixin"; // //agentToken = WebConfigurationManager.AppSettings["WeixinToken"];//Token // //修改內容,防止死循環 // var agentDoc = XDocument.Parse(agentXml); // agentDoc.Root.Element("Content").SetValue("代理轉發文字:" + requestMessage.Content); // agentDoc.Root.Element("CreateTime").SetValue(DateTimeHelper.GetWeixinDateTime(DateTime.Now));//修改時間,防止去重 // agentDoc.Root.Element("MsgId").SetValue("123");//防止去重 // agentXml = agentDoc.ToString(); // #endregion // var responseXml = MessageAgent.RequestXml(this, agentUrl, agentToken, agentXml); // //獲取返回的XML // //上面的方法也可以使用擴展方法:this.RequestResponseMessage(this,agentUrl, agentToken, RequestDocument.ToString()); // /* 如果有WeiweihiKey,可以直接使用下面的這個MessageAgent.RequestWeiweihiXml()方法。 // * WeiweihiKey專門用於對接www.weiweihi.com平台,獲取方式見:https://www.weiweihi.com/ApiDocuments/Item/25#51 // */ // //var responseXml = MessageAgent.RequestWeiweihiXml(weiweihiKey, RequestDocument.ToString());//獲取Weiweihi返回的XML // DateTime dt2 = DateTime.Now; //計時結束 // //轉成實體。 // /* 如果要寫成一行,可以直接用: // * responseMessage = MessageAgent.RequestResponseMessage(agentUrl, agentToken, RequestDocument.ToString()); // * 或 // * // */ // var msg = string.Format("\r\n\r\n代理過程總耗時:{0}毫秒", (dt2 - dt1).Milliseconds); // var agentResponseMessage = responseXml.CreateResponseMessage(); // if (agentResponseMessage is ResponseMessageText) // { // (agentResponseMessage as ResponseMessageText).Content += msg; // } // else if (agentResponseMessage is ResponseMessageNews) // { // (agentResponseMessage as ResponseMessageNews).Articles[0].Description += msg; // } // return agentResponseMessage;//可能出現多種類型,直接在這里返回 // }) // .Keywords(new[] { "測試", "退出" }, () => // { // /* // * 這是一個特殊的過程,此請求通常來自於微微嗨(http://www.weiweihi.com)的“粉絲生活小助手”應用請求(https://www.weiweihi.com/User/App/Detail/1), // * 用於演示微微嗨應用商店的處理過程,由於微微嗨的應用內部可以單獨設置對話過期時間,所以這里通常不需要考慮對話狀態,只要做最簡單的響應。 // */ // if (defaultResponseMessage.Content == "測試") // { // //進入APP測試 // defaultResponseMessage.Content = "您已經進入【粉絲生活小助手】的測試程序,請發送任意信息進行測試。發送文字【退出】退出測試對話。10分鍾內無任何交互將自動退出應用對話狀態。"; // } // else // { // //退出APP測試 // defaultResponseMessage.Content = "您已經退出【粉絲生活小助手】的測試程序。"; // } // return defaultResponseMessage; // }) // .Keyword("AsyncTest", () => // { // //異步並發測試(提供給單元測試使用) //#if NET45 // DateTime begin = DateTime.Now; // int t1, t2, t3; // System.Threading.ThreadPool.GetAvailableThreads(out t1, out t3); // System.Threading.ThreadPool.GetMaxThreads(out t2, out t3); // System.Threading.Thread.Sleep(TimeSpan.FromSeconds(4)); // DateTime end = DateTime.Now; // var thread = System.Threading.Thread.CurrentThread; // defaultResponseMessage.Content = string.Format("TId:{0}\tApp:{1}\tBegin:{2:mm:ss,ffff}\tEnd:{3:mm:ss,ffff}\tTPool:{4}", // thread.ManagedThreadId, // HttpContext.Current != null ? HttpContext.Current.ApplicationInstance.GetHashCode() : -1, // begin, // end, // t2 - t1 // ); //#endif // return defaultResponseMessage; // }) // .Keyword("OPEN", () => // { // var openResponseMessage = requestMessage.CreateResponseMessage<ResponseMessageNews>(); // openResponseMessage.Articles.Add(new Article() // { // Title = "開放平台微信授權測試", // Description = @"點擊進入Open授權頁面。 // 授權之后,您的微信所收到的消息將轉發到第三方(粉絲生活小助手)的服務器上,並獲得對應的回復。 // 測試完成后,您可以登陸公眾號后台取消授權。", // //Url = "http://sdk.weixin.senparc.com/OpenOAuth/JumpToMpOAuth" // Url = "http://wechat.fensishenghuo.com/Admin/WechatOpen/JumpToMpOAuth" // }); // return openResponseMessage; // }) // .Keyword("錯誤", () => // { // var errorResponseMessage = requestMessage.CreateResponseMessage<ResponseMessageText>(); // //因為沒有設置errorResponseMessage.Content,所以這小消息將無法正確返回。 // return errorResponseMessage; // }) // .Keyword("容錯", () => // { // Thread.Sleep(4900);//故意延時1.5秒,讓微信多次發送消息過來,觀察返回結果 // var faultTolerantResponseMessage = requestMessage.CreateResponseMessage<ResponseMessageText>(); // faultTolerantResponseMessage.Content = string.Format("測試容錯,MsgId:{0},Ticks:{1}", requestMessage.MsgId, // DateTime.Now.Ticks); // return faultTolerantResponseMessage; // }) // .Keyword("TM", () => // { // var openId = requestMessage.FromUserName; // var checkCode = Guid.NewGuid().ToString("n").Substring(0, 3);//為了防止openId泄露造成騷擾,這里啟用驗證碼 // TemplateMessageCollection[checkCode] = openId; // defaultResponseMessage.Content = string.Format(@"新的驗證碼為:{0},請在網頁上輸入。網址:http://sdk.weixin.senparc.com/AsyncMethods", checkCode); // return defaultResponseMessage; // }) // .Keyword("OPENID", () => // { // var openId = requestMessage.FromUserName;//獲取OpenId // var userInfo = Senparc.Weixin.MP.AdvancedAPIs.UserApi.Info(appId, openId, Language.zh_CN); // defaultResponseMessage.Content = string.Format( // "您的OpenID為:{0}\r\n昵稱:{1}\r\n性別:{2}\r\n地區(國家/省/市):{3}/{4}/{5}\r\n關注時間:{6}\r\n關注狀態:{7}", // requestMessage.FromUserName, userInfo.nickname, (Sex)userInfo.sex, userInfo.country, userInfo.province, userInfo.city, DateTimeHelper.GetDateTimeFromXml(userInfo.subscribe_time), userInfo.subscribe); // return defaultResponseMessage; // }) // .Keyword("EX", () => // { // var ex = new WeixinException("openid:" + requestMessage.FromUserName + ":這是一條測試異常信息");//回調過程在global的ConfigWeixinTraceLog()方法中 // defaultResponseMessage.Content = "請等待異步模板消息發送到此界面上(自動延時數秒)。\r\n當前時間:" + DateTime.Now.ToString(); // return defaultResponseMessage; // }) // .Keyword("MUTE", () => //不回復任何消息 // { // //方案一: // return new SuccessResponseMessage(); // //方案二: // var muteResponseMessage = base.CreateResponseMessage<ResponseMessageNoResponse>(); // return muteResponseMessage; // //方案三: // base.TextResponseMessage = "success"; // return null; // }) // .Keyword("JSSDK", () => // { // defaultResponseMessage.Content = "點擊打開:http://sdk.weixin.senparc.com/WeixinJsSdk"; // return defaultResponseMessage; // }) // //Default不一定要在最后一個 // .Default(() => // { // var result = new StringBuilder(); // result.AppendFormat("您剛才發送了文字信息:{0}\r\n\r\n", requestMessage.Content); // if (CurrentMessageContext.RequestMessages.Count > 1) // { // result.AppendFormat("您剛才還發送了如下消息({0}/{1}):\r\n", CurrentMessageContext.RequestMessages.Count, // CurrentMessageContext.StorageData); // for (int i = CurrentMessageContext.RequestMessages.Count - 2; i >= 0; i--) // { // var historyMessage = CurrentMessageContext.RequestMessages[i]; // result.AppendFormat("{0} 【{1}】{2}\r\n", // historyMessage.CreateTime.ToString("HH:mm:ss"), // historyMessage.MsgType.ToString(), // (historyMessage is RequestMessageText) // ? (historyMessage as RequestMessageText).Content // : "[非文字類型]" // ); // } // result.AppendLine("\r\n"); // } // result.AppendFormat("如果您在{0}分鍾內連續發送消息,記錄將被自動保留(當前設置:最多記錄{1}條)。過期后記錄將會自動清除。\r\n", // WeixinContext.ExpireMinutes, WeixinContext.MaxRecordCount); // result.AppendLine("\r\n"); // //result.AppendLine("您還可以發送【位置】【圖片】【語音】【視頻】等類型的信息(注意是這幾種類型,不是這幾個文字),查看不同格式的回復。\r\nSDK官方地址:http://sdk.weixin.senparc.com"); // result.AppendLine("您還可以發送【位置】【圖片】【語音】【視頻】等類型的信息(注意是這幾種類型,不是這幾個文字),查看不同格式的回復。"); // defaultResponseMessage.Content = result.ToString(); // return defaultResponseMessage; // }) // //“一次訂閱消息”接口測試 // .Keyword("訂閱", () => // { // defaultResponseMessage.Content = "點擊打開:https://sdk.weixin.senparc.com/SubscribeMsg"; // return defaultResponseMessage; // }) // //正則表達式 // .Regex(@"^\d+#\d+$", () => // { // defaultResponseMessage.Content = string.Format("您輸入了:{0},符合正則表達式:^\\d+#\\d+$", requestMessage.Content); // return defaultResponseMessage; // }); 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) { 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 }); } 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; } }
關鍵詞匹配方法新增的方法:注:獲取主公眾號關鍵詞回復的方法見:https://www.cnblogs.com/hnsongbiao/p/9257087.html