版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】如何使用webapi開發(fā)微信公眾號調(diào)用圖靈機器人接口
這篇文章給大家分享的是有關(guān)如何使用webapi開發(fā)微信公眾號調(diào)用圖靈機器人接口的內(nèi)容。在下覺得挺實用的,因此分享給大家做個參考,一起跟隨在下過來看看吧。被動響應(yīng)消息(返回XML)微信要求我們返回XML數(shù)據(jù),且格式是規(guī)定好的,具體請看微信公眾平臺開發(fā)者文檔。響應(yīng)的實體類,我們之前已經(jīng)寫好了,因為要求是XML格式。我們在此使用微軟提供的System.Xml.Serialization.XmlSerializer來將我們的數(shù)據(jù)序列化為XML。所以我們在類上邊標(biāo)記了XmlRoot特性,在枚舉的字段上邊標(biāo)記了XmlEnum特性,NewsMsg中在文章列表上標(biāo)記了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;
//從正文參數(shù)中加載微信的請求參數(shù)
XmlDocument
xmlDoc
=
new
XmlDocument();
xmlDoc.Load(requestContent);
logger.DebugFormat("WX請求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
=
"俺還小,不知道你在說啥子(⊙_⊙)?",
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好哇~"
:
"大爺,奴家會想你的",//其實取消訂閱是不會發(fā)送消息的
CreateTime
=
UnixTimestamp.Now.ToNumeric(),
ToUserName
=
userName
},
typeof(TextMsg));
return
new
HttpResponseMessage(HttpStatusCode.OK)
{
Content
=
new
StringContent(responseContent,
Encoding.UTF8,
"application/xml"),
};
}至此,我們已經(jīng)完成了微信被動回復(fù)消息的響應(yīng)。映射圖靈消息及微信消息上邊我們已經(jīng)實現(xiàn)了被動回復(fù)消息的功能,接下來我們需要將圖靈機器人接口與我們的公眾平臺關(guān)聯(lián)起來。分析圖靈機器人返回的參數(shù),我們發(fā)現(xiàn)所有類型的內(nèi)容都有code和text參數(shù)。又因為我們需要將圖靈的消息與微信的響應(yīng)消息直接對應(yīng)起來,因此我們定義接口,提供轉(zhuǎn)換方法public
class
TuLingResult{
//消息類型(我們在序列化為XML的時候需要提供類型)
public
Type
DataType
{
get;
set;
}
public
object
Data
{
get;
set;
}
}public
interface
IResponse{
TuLingResult
ToTuLingResult(string
fromUserName,
string
toUserName);
}創(chuàng)建文本類數(shù)據(jù)的實體作為圖靈消息的基類(對應(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ù)的實體類。如:新聞(對應(yīng)微信的圖文消息)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>
///
標(biāo)題
///
</summary>
public
string
Article
{
get;
set;
}
///
<summary>
///
來源
///
</summary>
public
string
Source
{
get;
set;
}
///
<summary>
///
詳情地址
///
</summary>
public
string
DetailUrl
{
get;
set;
}
///
<summary>
///
圖標(biāo)地址
///
</summary>
public
string
Icon
{
get;
set;
}
}同理創(chuàng)建圖靈機器人提供的各類數(shù)據(jù)實體類我們想要支持的數(shù)據(jù)實體都定義完畢后,我們便可以開始請求圖靈接口,獲取真實的消息了,在此我們使用HttpClient實現(xiàn)。private
const
string
TULING_API_URL
=
"/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("圖靈機器人響應(yīng):{0}",
content);
}
return
ConvertToMsg(content,
userFlag,
efhName);
}圖靈返回了code標(biāo)識消息的類型和錯誤信息,因此我們先將響應(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
}對應(yīng)于圖靈的返回碼100000
文本類數(shù)據(jù)
200000
網(wǎng)址類數(shù)據(jù)
301000
小說
302000
新聞
304000
應(yīng)用、軟件、下載
305000
列車
306000
航班
307000
團購
308000
優(yōu)惠
309000
酒店
310000
彩票
311000
價格
312000
餐廳
40001
key的長度錯誤(32位)
40002
請求內(nèi)容為空
40003
key錯誤或帳號未激活
40004
當(dāng)天請求次數(shù)已用完
40005
暫不支持該功能
40006
服務(wù)器升級中
40007
服務(wù)器數(shù)據(jù)格式異常
50000
機器人設(shè)定的“學(xué)用戶說話”或者“默認回答”而后拿到消息類型private
ResultType
GetResultType(string
response)
{
var
result
=
JsonConvert.DeserializeObject<TextResult>(response);
return
(ResultType)result.Code;
}之后,我們便可以按照不同類型返回相對應(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<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
TextRes
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度互聯(lián)網(wǎng)企業(yè)與廣告公司之間的廣告投放合同3篇
- 2024年度個人消費貸款還款合同范本3篇
- 2024年物業(yè)公司保安服務(wù)管理合同
- 2024年環(huán)境監(jiān)測數(shù)據(jù)報告編制與交付合同
- 2024年土地流轉(zhuǎn)與農(nóng)業(yè)廢棄物處理合同規(guī)范范本9篇
- 2024年事業(yè)單位編外用工績效評估與獎懲制度合同3篇
- 2024年度產(chǎn)品研發(fā)合同:某企業(yè)與研發(fā)團隊關(guān)于新產(chǎn)品開發(fā)的約定3篇
- 2024年度砂漿代銷綠色環(huán)保合同3篇
- 2024版醫(yī)療設(shè)備回收利用合同3篇
- 2024年度藝術(shù)品投資與合作合同3篇
- 生命不是游戲拒絕死亡挑戰(zhàn)主題班會
- 拒絕躺平 停止擺爛-學(xué)生心理健康主題班會(課件)
- 現(xiàn)代教育技術(shù)智慧樹知到期末考試答案章節(jié)答案2024年濟寧學(xué)院
- 現(xiàn)代通信技術(shù)導(dǎo)論智慧樹知到期末考試答案章節(jié)答案2024年北京科技大學(xué)
- 印刷服務(wù)投標(biāo)方案(技術(shù)方案)
- 醫(yī)療器械軟件設(shè)計和開發(fā)-全套開發(fā)資料模板范本匯編
- 旅游出行安全告知書
- 一線員工技能等級評定方案
- 輸電線路鐵塔基礎(chǔ)施工質(zhì)量控制
- (完整版)服裝生產(chǎn)工藝流程圖匯總,推薦文檔
評論
0/150
提交評論