微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
上一篇文章,写了基本框架,可能很多人会觉得晕头转向,这里提供一个简单的例子来予以说明,希望能帮你解开谜团。
一、功能介绍
通过微信公众平台实现在线客服机器人功能。主要的功能包括:简单对话、查询天气等服务。
这里只是提供比较简单的功能,重在通过此实例来说明公众平台的具体研发过程。只是一个简单DEMO,如果需要的话可以在此基础上进行扩展。
当然后续我们还会推出比较复杂的应用实例。
二、具体实现
1、提供访问接口
这里不再赘述,参照上一章,微信公众账号开发教程(二)基础框架搭建
https://www.nhooo.com/article/98754.htm
2、签名认证和分发请求
这里不再赘述,参照上一章,微信公众账号开发教程(二)基础框架搭建
https://www.nhooo.com/article/98754.htm
3、处理请求,并响应
1)关注
当微信用户关注公众账号时,可以给其适当的提示。可以是欢迎词,可以是帮助提示。
直接上代码:
classEventHandler:IHandler
{
///<summary>
///请求的xml
///</summary>
privatestringRequestXml{get;set;}
///<summary>
///构造函数
///</summary>
///<paramname="requestXml"></param>
publicEventHandler(stringrequestXml)
{
this.RequestXml=requestXml;
}
///<summary>
///处理请求
///</summary>
///<returns></returns>
publicstringHandleRequest()
{
stringresponse=string.Empty;
EventMessageem=EventMessage.LoadFromXml(RequestXml);
if(em.Event.Equals("subscribe",StringComparison.OrdinalIgnoreCase))
{
//回复欢迎消息
TextMessagetm=newTextMessage();
tm.ToUserName=em.FromUserName;
tm.FromUserName=em.ToUserName;
tm.CreateTime=Common.GetNowTime();
tm.Content="欢迎您关注***,我是大哥大,有事就问我,呵呵!\n\n";
response=tm.GenerateContent();
}
returnresponse;
}
}
2)问候
简单的交流问候,比如你好、帮助等等,跟我们使用微信聊天一样,不过回应是由我们的程序响应。具体功能,可以根据自己的需要进行添加。
微信本来就是沟通的平台。这个案例,可以用于在线服务机器人,类似于淘宝的客服机器人,可是我们这个是微信版的。呵呵
其实,很简单,获取请求消息,根据关键字来匹配回应。当然这里可能要做的工作很多,如何支持智能匹配,如何支持模糊匹配等。
代码如下:
///<summary>
///文本信息处理类
///</summary>
publicclassTextHandler:IHandler
{
///<summary>
///请求的XML
///</summary>
privatestringRequestXml{get;set;}
///<summary>
///构造函数
///</summary>
///<paramname="requestXml">请求的xml</param>
publicTextHandler(stringrequestXml)
{
this.RequestXml=requestXml;
}
///<summary>
///处理请求
///</summary>
///<returns></returns>
publicstringHandleRequest()
{
stringresponse=string.Empty;
TextMessagetm=TextMessage.LoadFromXml(RequestXml);
stringcontent=tm.Content.Trim();
if(string.IsNullOrEmpty(content))
{
response="您什么都没输入,没法帮您啊,%>_<%。";
}
else
{
if(content.StartsWith("tq",StringComparison.OrdinalIgnoreCase))
{
stringcityName=content.Substring(2).Trim();
response=WeatherHelper.GetWeather(cityName);
}
else
{
response=HandleOther(content);
}
}
tm.Content=response;
//进行发送者、接收者转换
stringtemp=tm.ToUserName;
tm.ToUserName=tm.FromUserName;
tm.FromUserName=temp;
response=tm.GenerateContent();
returnresponse;
}
///<summary>
///处理其他消息
///</summary>
///<paramname="tm"></param>
///<returns></returns>
privatestringHandleOther(stringrequestContent)
{
stringresponse=string.Empty;
if(requestContent.Contains("你好")||requestContent.Contains("您好"))
{
response="您也好~";
}
elseif(requestContent.Contains("傻"))
{
response="我不傻!哼~";
}
elseif(requestContent.Contains("逼")||requestContent.Contains("操"))
{
response="哼,你说脏话!";
}
elseif(requestContent.Contains("是谁"))
{
response="我是大哥大,有什么能帮您的吗?~";
}
elseif(requestContent.Contains("再见"))
{
response="再见!";
}
elseif(requestContent.Contains("bye"))
{
response="Bye!";
}
elseif(requestContent.Contains("谢谢"))
{
response="不客气!嘿嘿";
}
elseif(requestContent=="h"||requestContent=="H"||requestContent.Contains("帮助"))
{
response=@"查询天气,输入tq城市名称\拼音\首字母";
}
else
{
response="您说的,可惜,我没明白啊,试试其他关键字吧。";
}
returnresponse;
}
}
3)查询天气
这个功能需要请求实时查询的,请求官方的天气发布网站,然后解析其返回值,按照我们需要的格式,组织天气信息,最后发送给微信客户。
采用文本消息方式处理。
用户请求,只需输入:tq城市名称/拼音/首字母,即可获取消息。
回复的消息:(以北京为例)
北京
2013年11月6日星期三
今天:(17℃~4℃)晴北风4-5级转3-4级4-5级转3-4级
24小时穿衣指数:天气冷,建议着棉服、羽绒服、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣、冬大衣或厚羽绒服。
明天:(14℃~3℃)晴转多云微风小于3级
48小时穿衣指数:天气冷,建议着棉服、羽绒服、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣、冬大衣或厚羽绒服。
来看源码吧:
classWeatherHelper
{
///<summary>
///城市集合字段
///</summary>
privatestaticDictionary<string,City>mCities;
///<summary>
///城市集合
///</summary>
publicstaticDictionary<string,City>Cities
{
get
{
if(mCities==null)
{
LoadCities();
}
returnmCities;
}
}
///<summary>
///加载城市
///</summary>
privatestaticvoidLoadCities()
{
mCities=newDictionary<string,City>();
mCities.Clear();
mCities.Add("101010100",newCity(){Code="101010100",Name="北京",PinYin="beijing",FristLetter="bj"});
mCities.Add("101020100",newCity(){Code="101020100",Name="上海",PinYin="shanghai",FristLetter="sh"});
mCities.Add("101200101",newCity(){Code="101200101",Name="武汉",PinYin="wuhai",FristLetter="wh"});
}
///<summary>
///获取城市的天气
///</summary>
///<paramname="name">城市名称、拼音或首字母</param>
///<returns></returns>
publicstaticstringGetWeather(stringname)
{
stringresult=string.Empty;
stringcityCode=string.Empty;
//获取城市编码
IEnumerable<string>codes=fromiteminCities
whereitem.Value!=null
&&(item.Value.Name.Equals(name,StringComparison.OrdinalIgnoreCase)
||item.Value.PinYin.Equals(name,StringComparison.OrdinalIgnoreCase)
||item.Value.FristLetter.Equals(name,StringComparison.OrdinalIgnoreCase))
selectitem.Value.Code;
if(codes!=null&&codes.Count()>0)
{
cityCode=codes.First<string>();
}
//http请求,获取天气
if(!string.IsNullOrEmpty(cityCode))
{
stringurl="http://m.weather.com.cn/data/{0}.html";
url=string.Format(url,cityCode);
WebRequestrequest=HttpWebRequest.Create(url);
//超时时间为:2秒
request.Timeout=2000;
request.Credentials=CredentialCache.DefaultCredentials;
WebResponseresponse=request.GetResponse();
StreamReaderreader=newStreamReader(response.GetResponseStream(),Encoding.UTF8);
stringweahterInfo=reader.ReadToEnd();
if(string.IsNullOrEmpty(weahterInfo))
{
result="暂时没有取到天气数据,请稍后再试";
}
else
{
XmlDocumentdoc=JsonConvert.DeserializeXmlNode(weahterInfo);
if(doc!=null)
{
XmlNodenode=doc.DocumentElement;
if(node!=null)
{
StringBuilderbuilder=newStringBuilder();
builder.Append(node["city"].InnerText).Append("\n");
builder.Append(node["date_y"].InnerText).Append("").Append(node["week"].InnerText).Append("\n");
builder.Append("今天:").Append("(").Append(node["temp1"].InnerText).Append(")").Append(node["weather1"].InnerText).Append(node["wind1"].InnerText).Append(node["fl1"].InnerText).Append("\n");
builder.Append("24小时穿衣指数:").Append(node["index_d"].InnerText).Append("\n");
builder.Append("明天:").Append("(").Append(node["temp2"].InnerText).Append(")").Append(node["weather2"].InnerText).Append(node["wind2"].InnerText).Append(node["fl2"].InnerText).Append("\n");
builder.Append("48小时穿衣指数:").Append(node["index48_d"].InnerText).Append("\n");
result=builder.ToString();
}
}
#region天气json数据格式
/*
{
"weatherinfo":{
"city":"北京",
"city_en":"beijing",
"date_y":"2013年11月4日",
"date":"",
"week":"星期一",
"fchh":"11",
"cityid":"101010100",
"temp1":"17℃~5℃",
"temp2":"16℃~5℃",
"temp3":"18℃~4℃",
"temp4":"17℃~5℃",
"temp5":"14℃~6℃",
"temp6":"14℃~2℃",
"tempF1":"62.6℉~41℉",
"tempF2":"60.8℉~41℉",
"tempF3":"64.4℉~39.2℉",
"tempF4":"62.6℉~41℉",
"tempF5":"57.2℉~42.8℉",
"tempF6":"57.2℉~35.6℉",
"weather1":"晴转多云",
"weather2":"多云",
"weather3":"多云转晴",
"weather4":"晴转多云",
"weather5":"多云转阴",
"weather6":"阴转晴",
"img1":"0",
"img2":"1",
"img3":"1",
"img4":"99",
"img5":"1",
"img6":"0",
"img7":"0",
"img8":"1",
"img9":"1",
"img10":"2",
"img11":"2",
"img12":"0",
"img_single":"0",
"img_title1":"晴",
"img_title2":"多云",
"img_title3":"多云",
"img_title4":"多云",
"img_title5":"多云",
"img_title6":"晴",
"img_title7":"晴",
"img_title8":"多云",
"img_title9":"多云",
"img_title10":"阴",
"img_title11":"阴",
"img_title12":"晴",
"img_title_single":"晴",
"wind1":"微风",
"wind2":"微风",
"wind3":"微风",
"wind4":"微风",
"wind5":"微风",
"wind6":"北风4-5级",
"fx1":"微风",
"fx2":"微风",
"fl1":"小于3级",
"fl2":"小于3级",
"fl3":"小于3级",
"fl4":"小于3级",
"fl5":"小于3级",
"fl6":"4-5级",
"index":"较冷",
"index_d":"建议着大衣、呢外套加毛衣、卫衣等服装。体弱者宜着厚外套、厚毛衣。因昼夜温差较大,注意增减衣服。",
"index48":"冷",
"index48_d":"天气冷,建议着棉服、羽绒服、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣、冬大衣或厚羽绒服。",
"index_uv":"中等",
"index48_uv":"弱",
"index_xc":"适宜",
"index_tr":"适宜",
"index_co":"舒适",
"st1":"17",
"st2":"5",
"st3":"17",
"st4":"5",
"st5":"18",
"st6":"6",
"index_cl":"适宜",
"index_ls":"适宜",
"index_ag":"极不易发"
}
}
*/
#endregion
}
}
else
{
result="没有获取到该城市的天气,请确定输入了正确的城市名称,如\'北京\'或者\'beijing\'或者\'bj\'";
}
//返回
returnresult;
}
///<summary>
///内部类:城市
///</summary>
internalclassCity
{
///<summary>
///编码
///</summary>
publicstringCode{get;set;}
///<summary>
///名称
///</summary>
publicstringName{get;set;}
///<summary>
///拼音
///</summary>
publicstringPinYin{get;set;}
///<summary>
///拼音首字母
///</summary>
publicstringFristLetter{get;set;}
}
}
三、源码
这里可是可执行的代码哦。应大家的需求,这里提供全部的源代码。
demo下载
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。