十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
這篇文章給大家分享的是有關(guān)如何使用web api開發(fā)微信公眾號(hào)調(diào)用圖靈機(jī)器人接口的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

被動(dòng)響應(yīng)消息(返回XML)
微信要求我們返回XML數(shù)據(jù),且格式是規(guī)定好的,具體請(qǐng)看
微信公眾平臺(tái)開發(fā)者文檔。
響應(yīng)的實(shí)體類,我們之前已經(jīng)寫好了,因?yàn)橐笫荴ML格式。
我們?cè)诖耸褂梦④浱峁┑腟ystem.Xml.Serialization.XmlSerializer來(lái)將我們的數(shù)據(jù)序列化為XML。
所以我們?cè)陬惿线厴?biāo)記了XmlRoot特性,在枚舉的字段上邊標(biāo)記了XmlEnum特性,NewsMsg中在文章列表上標(biāo)記了XmlArray和XmlArrayItem特性。而后反序列化出來(lái)的便是微信要求的格式了。
序列化方法如下:
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的命名空間,不然微信不識(shí)別
完整方法奉上:
public HttpResponseMessage Post(){ var requestContent = Request.Content.ReadAsStreamAsync().Result; //從正文參數(shù)中加載微信的請(qǐng)求參數(shù)
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(requestContent);
logger.DebugFormat("WX請(qǐng)求XML內(nèi)容:{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 = "俺還小,不知道你在說(shuō)啥子(⊙_⊙)?",
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);
}
//圖靈消息轉(zhuǎn)換為微信響應(yīng)消息,下一節(jié)奉上
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好哇~" : "大爺,奴家會(huì)想你的",//其實(shí)取消訂閱是不會(huì)發(fā)送消息的
CreateTime = UnixTimestamp.Now.ToNumeric(),
ToUserName = userName
}, typeof(TextMsg)); return new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(responseContent, Encoding.UTF8, "application/xml"),
};
}至此,我們已經(jīng)完成了微信被動(dòng)回復(fù)消息的響應(yīng)。
映射圖靈消息及微信消息
上邊我們已經(jīng)實(shí)現(xiàn)了被動(dòng)回復(fù)消息的功能,接下來(lái)我們需要將圖靈機(jī)器人接口與我們的公眾平臺(tái)關(guān)聯(lián)起來(lái)。
分析圖靈機(jī)器人返回的參數(shù),我們發(fā)現(xiàn)所有類型的內(nèi)容都有code和text參數(shù)。又因?yàn)槲覀冃枰獙D靈的消息與微信的響應(yīng)消息直接對(duì)應(yīng)起來(lái),因此我們定義接口,提供轉(zhuǎn)換方法
public class TuLingResult{ //消息類型(我們?cè)谛蛄谢癁閄ML的時(shí)候需要提供類型)
public Type DataType { get; set; } public object Data { get; set; }
}public interface IResponse{ TuLingResult ToTuLingResult(string fromUserName, string toUserName);
}創(chuàng)建文本類數(shù)據(jù)的實(shí)體作為圖靈消息的基類(對(duì)應(yīng)微信的文本消息)
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
}
};
}
}而后依次創(chuàng)建各種數(shù)據(jù)的實(shí)體類。
如:新聞(對(duì)應(yīng)微信的圖文消息)
public class NewsResult : TextResult{ public List 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{ ///
/// 標(biāo)題
///
public string Article { get; set; } ///
/// 來(lái)源
///
public string Source { get; set; } ///
/// 詳情地址
///
public string DetailUrl { get; set; } ///
/// 圖標(biāo)地址
///
public string Icon { get; set; }
} 同理創(chuàng)建圖靈機(jī)器人提供的各類數(shù)據(jù)實(shí)體類
我們想要支持的數(shù)據(jù)實(shí)體都定義完畢后,我們便可以開始請(qǐng)求圖靈接口,獲取真實(shí)的消息了,在此我們使用HttpClient實(shí)現(xiàn)。
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("圖靈機(jī)器人響應(yīng):{0}", content);
} return ConvertToMsg(content, userFlag, efhName);
}圖靈返回了code標(biāo)識(shí)消息的類型和錯(cuò)誤信息,因此我們先將響應(yīng)消息解析為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
}對(duì)應(yīng)于圖靈的返回碼
100000 文本類數(shù)據(jù) 200000 網(wǎng)址類數(shù)據(jù) 301000 小說(shuō) 302000 新聞 304000 應(yīng)用、軟件、下載 305000 列車 306000 航班 307000 團(tuán)購(gòu) 308000 優(yōu)惠 309000 酒店 310000 彩票 311000 價(jià)格 312000 餐廳 40001 key的長(zhǎng)度錯(cuò)誤(32位) 40002 請(qǐng)求內(nèi)容為空 40003 key錯(cuò)誤或帳號(hào)未激活 40004 當(dāng)天請(qǐng)求次數(shù)已用完 40005 暫不支持該功能 40006 服務(wù)器升級(jí)中 40007 服務(wù)器數(shù)據(jù)格式異常 50000 機(jī)器人設(shè)定的“學(xué)用戶說(shuō)話”或者“默認(rèn)回答”
而后拿到消息類型
private ResultType GetResultType(string response)
{
var result = JsonConvert.DeserializeObject(response);
return (ResultType)result.Code;
} 之后,我們便可以按照不同類型返回相對(duì)應(yīng)的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(response); break; case ResultType.TL_LINK_DATA:
result = JsonConvert.DeserializeObject(response); break; case ResultType.TL_NEWS_DATA:
result = JsonConvert.DeserializeObject(response); break; case ResultType.TL_TUWEN_DATA:
result = JsonConvert.DeserializeObject(response); break; case ResultType.TL_TRAIN_DATA:
result = JsonConvert.DeserializeObject(response); break; case ResultType.TL_AIRPORT_DATA:
result = JsonConvert.DeserializeObject(response); break; case ResultType.TL_APP_DATA:
result = JsonConvert.DeserializeObject(response); break; case ResultType.TL_HOTEL_DATA:
result = JsonConvert.DeserializeObject(response); break; case ResultType.TL_PRICE_DATA:
result = JsonConvert.DeserializeObject(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 = "服務(wù)器忙,暫時(shí)無(wú)法為您提供服務(wù)" }; break; case ResultType.TL_ERROR_NOTSUPPORT:
result = new TextResult { Text = "俺還小,您說(shuō)的這個(gè)還得慢慢學(xué)習(xí),以后再來(lái)試吧" }; break;
default:
result = new TextResult { Text = "俺還小,不知道你在說(shuō)啥子(⊙_⊙)?" }; 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"),
};感謝各位的閱讀!關(guān)于“如何使用web api開發(fā)微信公眾號(hào)調(diào)用圖靈機(jī)器人接口”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!