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


Posted in Javascript onDecember 02, 2016

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

一、功能介绍

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

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

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

二、具体实现

1、提供访问接口

这里不再赘述,参照上一章,微信公众账号开发教程(二) 基础框架搭建
https://3water.com/article/98754.htm

2、签名认证和分发请求

这里不再赘述,参照上一章,微信公众账号开发教程(二) 基础框架搭建
https://3water.com/article/98754.htm

3、处理请求,并响应

1)关注

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

直接上代码:

class EventHandler : IHandler
  {
    /// <summary>
    /// 请求的xml
    /// </summary>
    private string RequestXml { get; set; }
    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="requestXml"></param>
    public EventHandler(string requestXml)
    {
      this.RequestXml = requestXml;
    }
    /// <summary>
    /// 处理请求
    /// </summary>
    /// <returns></returns>
    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)问候

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

微信本来就是沟通的平台。这个案例,可以用于在线服务机器人,类似于淘宝的客服机器人,可是我们这个是微信版的。呵呵
其实,很简单,获取请求消息,根据关键字来匹配回应。当然这里可能要做的工作很多,如何支持智能匹配,如何支持模糊匹配等。

代码如下:

/// <summary>
  /// 文本信息处理类
  /// </summary>
  public class TextHandler : IHandler
  {
    /// <summary>
    /// 请求的XML
    /// </summary>
    private string RequestXml { get; set; }
    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="requestXml">请求的xml</param>
    public TextHandler(string requestXml)
    {
      this.RequestXml = requestXml;
    }
    /// <summary>
    /// 处理请求
    /// </summary>
    /// <returns></returns>
    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;
    }
    /// <summary>
    /// 处理其他消息
    /// </summary>
    /// <param name="tm"></param>
    /// <returns></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小时穿衣指数:天气冷,建议着棉服、羽绒服、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣、冬大衣或厚羽绒服。
明天:(14℃~3℃)晴转多云微风小于3级
48小时穿衣指数:天气冷,建议着棉服、羽绒服、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣、冬大衣或厚羽绒服。

来看源码吧:

class WeatherHelper
  {
    /// <summary>
    /// 城市集合字段
    /// </summary>
    private static Dictionary<string, City> mCities;
    /// <summary>
    /// 城市集合
    /// </summary>
    public static Dictionary<string, City> Cities
    {
      get
      {
        if (mCities == null)
        {
          LoadCities();
        }

        return mCities;
      }
    }
    /// <summary>
    /// 加载城市
    /// </summary>
    private static void LoadCities()
    {
      mCities = new Dictionary<string, City>();
      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" });
      
    }
    /// <summary>
    /// 获取城市的天气
    /// </summary>
    /// <param name="name">城市名称、拼音或首字母</param>
    /// <returns></returns>
    public static string GetWeather(string name)
    {
      string result = string.Empty;
      string cityCode = string.Empty;
      //获取城市编码
      IEnumerable<string> 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<string>();
      }

      //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;
    }
    /// <summary>
    /// 内部类:城市
    /// </summary>
    internal class City
    {
      /// <summary>
      /// 编码
      /// </summary>
      public string Code { get; set; }
      /// <summary>
      /// 名称
      /// </summary>
      public string Name { get; set; }
      /// <summary>
      /// 拼音
      /// </summary>
      public string PinYin { get; set; }
      /// <summary>
      /// 拼音首字母
      /// </summary>
      public string FristLetter { get; set; }
    }
  }

 三、源码

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

demo下载

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
Nov 04 Javascript
如何在父窗口中得知window.open()出的子窗口关闭事件
Oct 15 Javascript
jquery制作居中遮罩层效果分享
Feb 21 Javascript
node.js中的console.error方法使用说明
Dec 10 Javascript
jQuery插件datepicker 日期连续选择
Jun 12 Javascript
JavaScript实现瀑布流布局
Jun 28 Javascript
js验证真实姓名与身份证号,手机号的简单实例
Jul 18 Javascript
使用smartupload组件实现jsp+jdbc上传下载文件实例解析
Jan 05 Javascript
AngularJS表单基本操作
Jan 09 Javascript
jQuery Easyui Treegrid实现显示checkbox功能
Aug 08 jQuery
关于JavaScript语句后面的分号问题
Dec 07 Javascript
nginx部署访问vue-cli搭建的项目的方法
Feb 12 Javascript
基于javascript实现按圆形排列DIV元素(三)
Dec 02 #Javascript
js中动态创建json,动态为json添加属性、属性值的实例
Dec 02 #Javascript
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
Nov 30 #Javascript
js 动态生成json对象、时时更新json对象的方法
Dec 02 #Javascript
详解JavaScript中数组的reduce方法
Dec 02 #Javascript
基于javascript实现按圆形排列DIV元素(二)
Dec 02 #Javascript
微信公众平台开发教程(六)获取个性二维码的实例
Dec 02 #Javascript
You might like
解析PHP无限级分类方法及代码
2013/06/21 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
4种PHP异步执行的常用方式
2015/12/24 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
javascript编程起步(第三课)
2007/02/27 Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
JavaScript实现点击文字切换登录窗口的方法
2015/05/11 Javascript
基于JS实现省市联动效果代码分享
2016/06/06 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
详解Chai.js断言库API中文文档
2018/01/31 Javascript
原生JS封装_new函数实现new关键字的功能
2018/08/12 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
vue-cli在 history模式下的配置详解
2019/11/26 Javascript
详解实现vue的数据响应式原理
2021/01/20 Vue.js
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
Python pass详细介绍及实例代码
2016/11/24 Python
Python实现简易端口扫描器代码实例
2017/03/15 Python
Python实现字符串匹配算法代码示例
2017/12/05 Python
Python3.5面向对象编程图文与实例详解
2019/04/24 Python
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
局域网定义和特性
2016/01/23 面试题
Linux Interview Questions For software testers
2012/06/02 面试题
学术会议邀请函范文
2014/01/22 职场文书
如何编写优秀的食品项目创业计划书
2014/01/23 职场文书
留学自荐信写作方法
2014/01/27 职场文书
妈妈活动方案
2014/08/15 职场文书
校运会新闻稿
2015/07/17 职场文书
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
2021/06/08 Python
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸