版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】如何使用webapi開發(fā)微信公眾號(hào)調(diào)用圖靈機(jī)器人接口
這篇文章給大家分享的是有關(guān)如何使用webapi開發(fā)微信公眾號(hào)調(diào)用圖靈機(jī)器人接口的內(nèi)容。在下覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨在下過來看看吧。被動(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來將我們的數(shù)據(jù)序列化為XML。所以我們?cè)陬惿线厴?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的命名空間,不然微信不識(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
=
"俺還小,不知道你在說啥子(⊙_⊙)?",
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ù)消息的功能,接下來我們需要將圖靈機(jī)器人接口與我們的公眾平臺(tái)關(guān)聯(lián)起來。分析圖靈機(jī)器人返回的參數(shù),我們發(fā)現(xiàn)所有類型的內(nèi)容都有code和text參數(shù)。又因?yàn)槲覀冃枰獙D靈的消息與微信的響應(yīng)消息直接對(duì)應(yīng)起來,因此我們定義接口,提供轉(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<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)建圖靈機(jī)器人提供的各類數(shù)據(jù)實(shí)體類我們想要支持的數(shù)據(jù)實(shí)體都定義完畢后,我們便可以開始請(qǐng)求圖靈接口,獲取真實(shí)的消息了,在此我們使用HttpClient實(shí)現(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("圖靈機(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
小說
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é)用戶說話”或者“默認(rèn)回答”而后拿到消息類型private
ResultType
GetResultType(string
response)
{
var
result
=
JsonConvert.DeserializeObject<TextResult>(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<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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版高中數(shù)學(xué)必修二《第六章 平面向量及其應(yīng)用》同步練習(xí)及答案解析
- 專題3 新民主主義革命時(shí)期國(guó)共兩黨關(guān)系的演變【單元測(cè)試】(解析版)
- 2024年跨國(guó)供應(yīng)鏈合作協(xié)議
- 地下停車場(chǎng)擴(kuò)建防水施工合同
- 高端月子中心保姆聘用模板
- 產(chǎn)品缺陷反饋程序
- 房地產(chǎn)策劃師招聘合同
- 咖啡制作安全管理辦法
- 農(nóng)村電商工程合同
- 商務(wù)樓宇熱水器改造招標(biāo)書
- 2024過敏性休克搶救指南(2024)課件干貨分享
- 【發(fā)動(dòng)機(jī)曲軸數(shù)控加工工藝過程卡片的設(shè)計(jì)7800字(論文)】
- 物資設(shè)備部工作述職報(bào)告
- 精品資料(2021-2022年收藏)龍門吊軌道基礎(chǔ)施工方案
- 畫廊與畫家合作協(xié)議書范本
- 全口義齒-印模與模型-課件PPT
- 地方課程六年級(jí)上冊(cè)
- 中科院大連化物所模板PPT課件
- YOX液力偶合器使用說明書
- 優(yōu)秀團(tuán)支部申報(bào)表
評(píng)論
0/150
提交評(píng)論