微信公众平台开发教程(四) 实例入门:机器人回复(附源码)

网友投稿 213 2023-06-26


微信公众平台开发教程(四) 实例入门:机器人回复(附源码)

上一篇文章,写了基本框架,可能很多人会觉得晕头转向,这里提供一个简单的例子来予以说明,希望能帮你解开谜团。

一、功能介绍

通过微信公众平台实现在线客服机器人功能。主要的功能包括:简单对话、查询天气等服务。

这里只是提供比较简单的功能,重在通过此实例来说明公众平台的具体研发过程。只是一个简单DEMO,如果需要的话可以在此基础上进行扩展。

当然后续我们还会推出比较复杂的应用实例。

二、具体实现

1、提供访问接口

这里不再赘述,参照上一章,微信公众账号开发教程(二) 基础框架搭建

//jb51.net/article/98754.htm

2、签名认证和分发请求

这里不再赘述,参照上一章,微信公众账号开发教程(二) 基础框架搭建

//jb51.net/article/98754.htm

3、处理请求,并响应

1)关注

当微信用户关注公众账号时,可以给其适当的提示。可以是欢迎词,可以是帮助提示。

直接上代码:

class EventHandler : IHandler

{

///

/// 请求的xml

///

private string RequestXml { get; set; }

///

/// 构造函数

///

///

public EventHandler(string requestXml)

{

this.RequestXml = requestXml;

}

///

/// 处理请求

///

///

public string HandleRequest()

{

string response = string.Empty;

EventMessage em = EventMessage.LoadFromXml(RequestXml);

if (em.Event.Equals("subscribe",StringComparison.OrdinalIgnoreCase))

{

//回复欢迎消息

TextMessage tm = new TextMessage();

tm.ToUserName = em.FromUserName;

tm.FromUserName = em.ToUserName;

tm.CreateTime = Common.GetNowTime();

tm.Content = "欢迎您关注***,我是大哥大,有事就问我,呵呵!\n\n";

response = tm.GenerateContent();

}

return response;

}

}

2)问候

简单的交流问候,比如你好、帮助等等,跟我们使用微信聊天一样,不过回应是由我们的程序响应。具体功能,可以根据自己的需要进行添加。

微信本来就是沟通的平台。这个案例,可以用于在线服务机器人,类似于淘宝的客服机器人,可是我们这个是微信版的。呵呵

其实,很简单,获取请求消息,根据关键字来匹配回应。当然这里可能要做的工作很多,如何支持智能匹配,如何支持模糊匹配等。

代码如下:

///

/// 文本信息处理类

///

public class TextHandler : IHandler

{

///

/// 请求的XML

///

private string RequestXml { get; set; }

///

/// 构造函数

///

/// 请求的xml

public TextHandler(string requestXml)

{

this.RequestXml = requestXml;

}

///

/// 处理请求

///

///

public string HandleRequest()

{

string response = string.Empty;

TextMessage tm = TextMessage.LoadFromXml(RequestXml);

string content = tm.Content.Trim();

if (string.IsNullOrEmpty(content))

{

response = "您什么都没输入,没法帮您啊,%>_<%。";

}

else

{

if (content.StartsWith("tq", StringComparison.OrdinalIgnoreCase))

{

string cityName = content.Substring(2).Trim();

response = WeatherHelper.GetWeather(cityName);

}

else

{

response = HandleOther(content);

}

}

tm.Content = response;

//进行发送者、接收者转换

string temp = tm.ToUserName;

tm.ToUserName = tm.FromUserName;

tm.FromUserName = temp;

response = tm.GenerateContent();

return response;

}

///

/// 处理其他消息

///

///

/// <returns>

private string HandleOther(string requestContent)

{

string response = string.Empty;

if (requestContent.Contains("你好") || requestContent.Contains("您好"))

{

response = "您也好~";

}

else if (requestContent.Contains("傻"))

{

response = "我不傻!哼~ ";

}

else if (requestContent.Contains("逼") || requestContent.Contains("操"))

{

response = "哼,你说脏话! ";

}

else if (requestContent.Contains("是谁"))

{

response = "我是大哥大,有什么能帮您的吗?~";

}

else if (requestContent.Contains("再见"))

{

response = "再见!";

}

else if (requestContent.Contains("bye"))

{

response = "Bye!";

}

else if (requestContent.Contains("谢谢"))

{

response = "不客气!嘿嘿";

}

else if (requestContent == "h" || requestContent == "H" || requestContent.Contains("帮助"))

{

response = @"查询天气,输入tq 城市名称\拼音\首字母";

}

else

{

response = "您说的,可惜,我没明白啊,试试其他关键字吧。";

}

return response;

}

}

3)查询天气

这个功能需要请求实时查询的,请求官方的天气发布网站,然后解析其返回值,按照我们需要的格式,组织天气信息,最后发送给微信客户。

采用文本消息方式处理。

用户请求,只需输入:tq 城市名称/拼音/首字母,即可获取消息。

回复的消息:(以北京为例)

北京

2013年11月6日 星期三

今天:(17℃~4℃)晴北风4-5级转3-4级4-5级转3-4级

24小时穿http://衣指数:天气冷,建议着棉服、羽绒服、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣、冬大衣或厚羽绒服。

明天:(14℃~3℃)晴转多云微风小于3级

48小时穿衣指数:天气冷,建议着棉服、羽绒服、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣、冬大衣或厚羽绒服。

来看源码吧:

class WeatherHelper

{

///

/// 城市集合字段

///

private static Dictionary mCities;

///

/// 城市集合

///

public static Dictionary Cities

{

get

{

if (mCities == null)

{

LoadCities();

}

return mCities;

}

}

///

/// 加载城市

///

private static void LoadCities()

{

mCities = new Dictionary();

mCities.Clear();

mCities.Add("101010100", new City() { Code = "101010100", Name = "北京", PinYin = "beijing", FristLetter = "bj" });

mCities.Add("101020100", new City() { Code = "101020100", Name = "上海", PinYin = "shanghai", FristLetter = "sh" });

mCities.Add("101200101", new City() { Code = "101200101", Name = "武汉", PinYin = "wuhai", FristLetter = "wh" });

}

///

/// 获取城市的天气

///

/// 城市名称、拼音或首字母

///

public static string GetWeather(string name)

{

string result = string.Empty;

string cityCode = string.Empty;

//获取城市编码

IEnumerable codes = from item in Cities

where item.Value != null

&& (item.Value.Name.Equals(name, StringComparison.OrdinalIgnoreCase)

|| item.Value.PinYin.Equals(name, StringComparison.OrdinalIgnoreCase)

|| item.Value.FristLetter.Equals(name, StringComparison.OrdinalIgnoreCase))

select item.Value.Code;

if (codes != null && codes.Count() > 0)

{

cityCode = codes.First();

}

//http请求,获取天气

if (!string.IsNullOrEmpty(cityCode))

{

string url = "http://m.weather.com.cn/data/{0}.html";

url = string.Format(url, cityCode);

WebRequest request = HttpWebRequest.Create(url);

//超时时间为:2秒

request.Timeout = 2000;

request.Credentials = CredentialCache.DefaultCredentials;

WebResponse response = request.GetResponse();

StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);

string weahterInfo = reader.ReadToEnd();

if (string.IsNullOrEmpty(weahterInfo))

{

result = "暂时没有取到天气数据,请稍后再试";

}

else

{

XmlDocument doc = jsonConvert.DeserializeXmlNode(weahterInfo);

if (doc != null)

{

XmlNode node = doc.DocumentElement;

if (node != null)

{

StringBuilder builder = new StringBuilder();

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\'";

}

//返回

return result;

}

///

/// 内部类:城市

///

internal class City

{

///

/// 编码

///

public string Code { get; set; }

///

/// 名称

///

public string Name { get; set; }

///

/// 拼音

///

public string PinYin { get; set; }

///

/// 拼音首字母

///

public string FristLetter { get; set; }

}

}

三、源码

这里可是可执行的代码哦。应大家的需求,这里提供全部的源代码。

demo下载


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:搭建Bootstrap离线文档的方法
下一篇:微信公众平台开发教程(五)详解自定义菜单
相关文章

 发表评论

暂时没有评论,来抢沙发吧~