微信第三方平台關鍵詞回復的處理方式


目前在做微信第三方平台開發,其中有一個需求,所有綁定的公眾號使用主公眾號的關鍵詞配置,我看了下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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM