91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用web api開發微信公眾號調用圖靈機器人接口

發布時間:2021-01-26 14:25:43 來源:億速云 閱讀:220 作者:小新 欄目:移動開發

這篇文章給大家分享的是有關如何使用web api開發微信公眾號調用圖靈機器人接口的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

被動響應消息(返回XML)

微信要求我們返回XML數據,且格式是規定好的,具體請看

微信公眾平臺開發者文檔。

響應的實體類,我們之前已經寫好了,因為要求是XML格式。
我們在此使用微軟提供的System.Xml.Serialization.XmlSerializer來將我們的數據序列化為XML。
所以我們在類上邊標記了XmlRoot特性,在枚舉的字段上邊標記了XmlEnum特性,NewsMsg中在文章列表上標記了XmlArray和XmlArrayItem特性。而后反序列化出來的便是微信要求的格式了。

序列化方法如下:

public string ResponseXML(object value, Type type){
    StringWriter sw = new StringWriter();
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();

    ns.Add("", "");  //去除命名空間
    XmlSerializer serializer = new XmlSerializer(type);

    serializer.Serialize(sw, value, ns);    return sw.ToString();
}

注意:此處必須去除XML的命名空間,不然微信不識別

完整方法奉上:

public HttpResponseMessage Post(){    var requestContent = Request.Content.ReadAsStreamAsync().Result;    //從正文參數中加載微信的請求參數
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(requestContent);

    logger.DebugFormat("WX請求XML內容:{0}", xmlDoc.InnerText);    string msgTypeStr = xmlDoc.SelectSingleNode("xml/MsgType").InnerText;    string userName = xmlDoc.SelectSingleNode("xml/FromUserName").InnerText;    string efhName = xmlDoc.SelectSingleNode("xml/ToUserName").InnerText;    string responseContent;
    MsgType msgType;    
    //獲取消息類型,若未定義,則返回。
    if (!Enum.TryParse(msgTypeStr, true, out msgType))
    {           
        responseContent = MsgService.Instance.ResponseXML(new TextMsg
            {
                FromUserName = efhName,
                MsgType = MsgType.Text,
                Content = "俺還小,不知道你在說啥子(⊙_⊙)?",
                CreateTime = UnixTimestamp.Now.ToNumeric(),
                ToUserName = userName
            }, typeof(TextMsg));        return new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StringContent(responseContent, Encoding.UTF8, "application/xml"),
        };
    }    if (msgType == MsgType.Event)
    {        return ProcessEvent(xmlDoc, userName, efhName);
    }    
    //圖靈消息轉換為微信響應消息,下一節奉上
    string content = xmlDoc.SelectSingleNode("xml/Content").InnerText;    var requestResult = TuLingService.Instance.GetMsgFromResponse(content, userName, efhName);

    responseContent = MsgService.Instance.ResponseXML(requestResult.Data, requestResult.DataType);    return new HttpResponseMessage(HttpStatusCode.OK)
    {
        Content = new StringContent(responseContent, Encoding.UTF8, "application/xml"),
    };
}private HttpResponseMessage ProcessEvent(XmlDocument xmlDoc, string userName, string efhName){    string eventValue = xmlDoc.SelectSingleNode("xml/Event").InnerText;    var responseContent = MsgService.Instance.ResponseXML(new TextMsg
    {
        FromUserName = efhName,
        MsgType = MsgType.Text,
        Content = eventValue.ToLower().Equals("subscribe") ? "lei好哇~" : "大爺,奴家會想你的",//其實取消訂閱是不會發送消息的
        CreateTime = UnixTimestamp.Now.ToNumeric(),
        ToUserName = userName
    }, typeof(TextMsg));    return new HttpResponseMessage(HttpStatusCode.OK)
    {
        Content = new StringContent(responseContent, Encoding.UTF8, "application/xml"),
    };
}

至此,我們已經完成了微信被動回復消息的響應。

映射圖靈消息及微信消息

上邊我們已經實現了被動回復消息的功能,接下來我們需要將圖靈機器人接口與我們的公眾平臺關聯起來。

分析圖靈機器人返回的參數,我們發現所有類型的內容都有code和text參數。又因為我們需要將圖靈的消息與微信的響應消息直接對應起來,因此我們定義接口,提供轉換方法

public class TuLingResult{    //消息類型(我們在序列化為XML的時候需要提供類型)
    public Type DataType { get; set; }    public object Data { get; set; }
}public interface IResponse{    TuLingResult ToTuLingResult(string fromUserName, string toUserName);
}

創建文本類數據的實體作為圖靈消息的基類(對應微信的文本消息)

public class TextResult : IResponse{    public int Code { get; set; }    public string Text { get; set; }    public virtual TuLingResult ToTuLingResult(string fromUserName, string toUserName)    {        return new TuLingResult
        {
            DataType = typeof(TextMsg),
            Data = new TextMsg
             {
                 FromUserName = fromUserName,
                 ToUserName = toUserName,
                 Content = Text,
                 CreateTime = UnixTimestamp.Now.ToNumeric(),
                 MsgType = MsgType.Text
             }
        };
    }
}

而后依次創建各種數據的實體類。
如:新聞(對應微信的圖文消息)

public class NewsResult : TextResult{    public List<NewsInfo> List { get; set; }    public override TuLingResult ToTuLingResult(string fromUserName, string toUserName)    {        if (List.Count > 10)
        {
            List = List.Take(10).ToList();
        }        return new TuLingResult
        {
            DataType = typeof(NewsMsg),
            Data = new NewsMsg
            {
                FromUserName = fromUserName,
                ToUserName = toUserName,
                ArticleCount = List.Count,
                Articles = List.Select(m => new MsgNewsInfo
                {
                    Title = m.Article,
                    Description = m.Source,
                    Url = m.DetailUrl,
                    PicUrl = m.Icon
                }).ToList(),
                CreateTime = UnixTimestamp.Now.ToNumeric(),
                MsgType=MsgType.News
            }
        };
    }
}public class NewsInfo{    /// <summary>
    /// 標題
    /// </summary>
    public string Article { get; set; }    /// <summary>
    /// 來源
    /// </summary>
    public string Source { get; set; }    /// <summary>
    /// 詳情地址
    /// </summary>
    public string DetailUrl { get; set; }    /// <summary>
    /// 圖標地址
    /// </summary>
    public string Icon { get; set; }
}

同理創建圖靈機器人提供的各類數據實體類

我們想要支持的數據實體都定義完畢后,我們便可以開始請求圖靈接口,獲取真實的消息了,在此我們使用HttpClient實現。

private const string TULING_API_URL = "http://www.tuling123.com/openapi/api";private const string TULING_API_KEY = "XXXXX";//圖靈的APIKEYpublic TuLingResult GetMsgFromResponse(string keyword, string userFlag, string efhName){    string linkString = string.Format("{0}?key={1}&info={2}&userid={3}"
        , TULING_API_URL, TULING_API_KEY, keyword, userFlag);    string content = string.Empty;    using (HttpClient client = new HttpClient())
    {
        HttpResponseMessage response = client.GetAsync(linkString).Result;

        content = response.Content.ReadAsStringAsync().Result;
        logger.DebugFormat("圖靈機器人響應:{0}", content);
    }    return ConvertToMsg(content, userFlag, efhName);
}

圖靈返回了code標識消息的類型和錯誤信息,因此我們先將響應消息解析為TextResult,拿到圖靈的類型。

先定義圖靈類型枚舉

public enum ResultType
{
    TL_FORMAT_DATA = 50000,
    TL_TEXT_DATA = 100000,
    TL_LINK_DATA = 200000,
    TL_NOVEL_DATA = 301000,
    TL_NEWS_DATA = 302000,
    TL_APP_DATA = 304000,
    TL_TRAIN_DATA = 305000,
    TL_AIRPORT_DATA = 306000,
    TL_TUAN_DATA = 307000,
    TL_TUWEN_DATA = 308000,
    TL_HOTEL_DATA = 309000,
    TL_LOTTERY_DATA = 310000,
    TL_PRICE_DATA = 311000,
    TL_RESTAURANT_DATA = 312000,

    TL_ERROR_LENGTH = 40001,
    TL_ERROR_EMPTY = 40002,
    TL_ERROR_INVALID = 40003,
    TL_ERROR_OUTLIMIT = 40004,
    TL_ERROR_NOTSUPPORT = 40005,
    TL_ERROR_SERVERUPDATE = 40006,
    TL_ERROR_SERVERERROR = 40007
}

對應于圖靈的返回碼

100000  文本類數據
200000  網址類數據
301000  小說
302000  新聞
304000  應用、軟件、下載
305000  列車
306000  航班
307000  團購
308000  優惠
309000  酒店
310000  彩票
311000  價格
312000  餐廳
40001   key的長度錯誤(32位)
40002   請求內容為空
40003   key錯誤或帳號未激活
40004   當天請求次數已用完
40005   暫不支持該功能
40006   服務器升級中
40007   服務器數據格式異常
50000   機器人設定的“學用戶說話”或者“默認回答”

而后拿到消息類型

private ResultType GetResultType(string response)
{
    var result = JsonConvert.DeserializeObject<TextResult>(response);

    return (ResultType)result.Code;
}

之后,我們便可以按照不同類型返回相對應的TuLingResult。

public TuLingResult ConvertToMsg(string response, string userFlag, string efhName)
{
    IResponse result = null;

    var resultType = GetResultType(response);    switch (resultType)
    {        case ResultType.TL_TEXT_DATA:
            result = JsonConvert.DeserializeObject<TextResult>(response);            break;        case ResultType.TL_LINK_DATA:
            result = JsonConvert.DeserializeObject<LinkResult>(response);            break;        case ResultType.TL_NEWS_DATA:
            result = JsonConvert.DeserializeObject<NewsResult>(response);            break;        case ResultType.TL_TUWEN_DATA:
            result = JsonConvert.DeserializeObject<TuWenResult>(response);            break;        case ResultType.TL_TRAIN_DATA:
            result = JsonConvert.DeserializeObject<TrainResult>(response);            break;        case ResultType.TL_AIRPORT_DATA:
            result = JsonConvert.DeserializeObject<AirportResult>(response);            break;        case ResultType.TL_APP_DATA:
            result = JsonConvert.DeserializeObject<AppResult>(response);            break;        case ResultType.TL_HOTEL_DATA:
            result = JsonConvert.DeserializeObject<HotelResult>(response);            break;        case ResultType.TL_PRICE_DATA:
            result = JsonConvert.DeserializeObject<PriceResult>(response);            break;        case ResultType.TL_ERROR_LENGTH:
        case ResultType.TL_ERROR_INVALID:
        case ResultType.TL_ERROR_EMPTY:
        case ResultType.TL_ERROR_OUTLIMIT:
            result = new TextResult { Text = "您的輸入有誤" };            break;        case ResultType.TL_ERROR_SERVERERROR:
        case ResultType.TL_ERROR_SERVERUPDATE:
            result = new TextResult { Text = "服務器忙,暫時無法為您提供服務" };            break;        case ResultType.TL_ERROR_NOTSUPPORT:
            result = new TextResult { Text = "俺還小,您說的這個還得慢慢學習,以后再來試吧" };            break;
        default:
            result = new TextResult { Text = "俺還小,不知道你在說啥子(⊙_⊙)?" };            break;
    }    return result.ToTuLingResult(efhName, userFlag);
}

而后,我們便可以將我們拿到的TuLingResult中的Data序列化為微信需要的XML

var requestResult = TuLingService.Instance.GetMsgFromResponse(content, userName, efhName);

responseContent = MsgService.Instance.ResponseXML(requestResult.Data, requestResult.DataType);return new HttpResponseMessage(HttpStatusCode.OK)
{
    Content = new StringContent(responseContent, Encoding.UTF8, "application/xml"),
};

感謝各位的閱讀!關于“如何使用web api開發微信公眾號調用圖靈機器人接口”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

涟源市| 宜川县| 合水县| 吐鲁番市| 上蔡县| 冕宁县| 卫辉市| 商水县| 麦盖提县| 邢台市| 雅安市| 婺源县| 西吉县| 英德市| 静乐县| 布拖县| 喀什市| 讷河市| 任丘市| 襄樊市| 云南省| 台安县| 四会市| 吉木乃县| 大石桥市| 栖霞市| 彭州市| 府谷县| 洛川县| 丁青县| 贺州市| 河西区| 乌苏市| 荥阳市| 公安县| 临猗县| 汶川县| 十堰市| 胶南市| 安福县| 农安县|