【移動應(yīng)用開發(fā)技術(shù)】如何使用web api開發(fā)微信公眾號調(diào)用圖靈機器人接口_第1頁
【移動應(yīng)用開發(fā)技術(shù)】如何使用web api開發(fā)微信公眾號調(diào)用圖靈機器人接口_第2頁
【移動應(yīng)用開發(fā)技術(shù)】如何使用web api開發(fā)微信公眾號調(diào)用圖靈機器人接口_第3頁
【移動應(yīng)用開發(fā)技術(shù)】如何使用web api開發(fā)微信公眾號調(diào)用圖靈機器人接口_第4頁
【移動應(yīng)用開發(fā)技術(shù)】如何使用web api開發(fā)微信公眾號調(diào)用圖靈機器人接口_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論