前端都会去了解的互联网科技workflow

搭建公众号自动回复功能

2017-07-23  本文已影响159人  Coding01

程序员爱炫技,写个公众号文章,都想拿点技术整整【自动回复】;程序员爱偷懒,什么都想做个【自动化】,最好所有事情系统都给做了,点点手指头就能达到目标。

今天的主角是如何搭建一个公众号自动回复功能。整个流程如下:

  1. 利用 hapi 开发 web 程序,对接微信公众号后台;
  2. 利用 LeanCloud SDK 将文章存储于 LeanCloud 后端;
  3. 接收用户发送的消息,获取关键词,查询文章,并回复给用户;
  4. 将 web 程序代码托管于 coding.net;
  5. 使用 LeanEngine 部署 hapi 程序。

1. hapi

A rich framework for building applications and services

hapi enables developers to focus on writing reusable application logic instead of spending time building infrastructure.

选择 hapi,主要被它的 logo 和读音(与 happy 同音)吸引,也主要因为自己爱折腾,老想着用不同的框架写写,重点是看看区别,你也可以看看 stackoverflow 上的帖子

https://stackoverflow.com/questions/30469767/how-do-express-and-hapi-compare-to-each-other

在用 hapi 写代码时,有种代码既文档的感觉,更重点的是 hapi 提供了一套 Plugins 方案,所有代码都可以以这种方式进行扩展和分离组织,可读性更高,如我将对接微信公众后台的 API 独立为 Plugin 形式:

server.register([{
  register: require('./api/Books'),
  options: {}
}, {
  register: require('./api/Articles'),
  options: {}
},{
  register: require('./api/Blogs'),
  options: {}
}, {
    register: require('./api/User'),
    options: {}
}, {
    register: require('./api/Comments'),
    options: {}
}], {routes: {prefix: '/api'}}, (err) => {
    if (err) {
        throw err;
    }
});

// wechat
server.register([{
  register: require('./wechat/weixin'),
  options: {}
}], (err) => {
    if (err) {
        throw err;
    }
});

这样就可以将微信公众号后台功能相关的代码独立到wechat/weixin.js中:

const wechat = require('./wechatserver');
const AV = require('leanengine');

const ModelBlog = require('../model/Blogs');
const config = {
  token: '***',
  appid: '***',
  encodingAESKey: '***'
};

exports.register = function (server, options, next) {
    server.route({
        method: ['POST', 'GET'],
        path: '/wechat',
        handler: function (request, reply) {
          wechat(config, request, reply, next, function (req, res, next) {
            // 微信输入信息都在req.weixin上
            var message = req.weixin;
            // 具体逻辑处理 和 自动回复
          });
        }
    });
    return next();
};

exports.register.attributes = {
    name: 'wechat-weixin'
};

具体如何配置开发 hapi 可以参考官网和 github
https://hapijs.com/
https://github.com/hapijs/hapi/

具体和微信后台路由配置就好说了,直接上图:


2. LeanCloud

LeanCloud 领先的 BaaS 提供商,为移动开发提供强有力的后端支持

包括云存储、数据分析、用户关系、消息推送、即时通信等现代应用基础模块,满足移动开发所有需求

https://leancloud.cn/

为什么选择 LeanCloud

JavaScript SDK

使用 SDK 主要三个作用:

根据微信公众号文档接口需要,主要存储 title, description, picurl, url 四要素;如果为了结合搜索功能,还需要存储这篇文章的关键词。

结合 LeanCloud SDK,存储代码就很简单了:

    var blog = new Blog();
    blog.set('title', request.payload.title);
    blog.set('url', request.payload.url);
    blog.set('desc', request.payload.desc);
    blog.set('picurl', request.payload.picurl);
    blog.set('tags', request.payload.tags);
    blog.save().then(function (blog) {
        // 成功保存之后,执行其他逻辑.
        console.log('成功保存:New object created with objectId: ' + blog.id);
        reply(blog);
    }, function (error) {
        // 失败之后执行其他逻辑
        console.log('Failed to create new object, with error message: ' + error.message);
        return reply(Boom.wrap(error, 'error'));
    });
    const query = new AV.Query(Blog);
    query.descending('createdAt');
    
    query.first().then(function (data) {
      res.reply([
          {
              title: data.get('title'),
              description: data.get('desc'),
              picurl: data.get('picurl'),
              url: data.get('url')
          }
      ]);
    }, function (error) {
    });

搜索【关键词】,主要搜索 title, description, tags等:

    const titleQuery = new AV.Query(Blog)
    titleQuery.contains('title', words);
    
    const descQuery = new AV.Query(Blog)
    descQuery.contains('desc', words);
    
    const tagsQuery = new AV.Query(Blog)
    tagsQuery.contains('tags', words);
    
    const wordsQuery = AV.Query.or(titleQuery, descQuery, tagsQuery);
    
    wordsQuery.descending('createdAt');
    wordsQuery.limit(5);
    wordsQuery.find().then(function (results) {
        res(results);
    }, function (error) {
        res([]);
    });

最后可以将查询结果转成【图文信息】回复

ModelBlog.search(message.Content, results => {
    if (results.length === 0) {
        res.reply({
            content: message.Content,
            type: 'text'
        });
    } else {
        let data = [];
        results.forEach(function(v) {
            let wrap = {};

            wrap.title = v.get('title');
            wrap.description = v.get('desc');
            wrap.picurl = v.get('picurl');
            wrap.url = v.get('url');

            data.push(wrap);
        });
        res.reply(data);
    }
});

当然,根据情况需要,如果在找不到查询结果时,我们可以内建一些【智能聊天】、【生活信息查询】等等。

3. LeanEngine

云引擎(LeanEngine)是 LeanCloud 推出的服务端托管平台。提供了多种运行环境(Node.js, Python 等)来运行服务端程序。你只需要提供服务端的业务逻辑(网站或云函数等),而服务端的多实例负载均衡,不中断服务的平滑升级等都由云引擎提供支持。

当写了服务端代码后,总要有个地方托管。对于大网站或者项目来说,找一家如阿里云、腾讯云等云服务平台, 但对于个人只是想简单的搭建一个公众号管理——自动回复功能,终究有些大材小用了;LeanEngine 结合 LeanCloud 使用相得映彰,而且 LeanEngine 可以根据需要升级扩展。


部署

部署主要有两种途径:命令行部署和 Git 部署

只要在项目的根目录运行:

lean deploy

使用命令行工具可以方便的部署、发布应用,查看应用状态,查看日志,甚至进行多应用部署。具体可参考网站文档:
https://leancloud.cn/docs/leanengine_cli.html#使用

代码都有一个版本控制,为了配合 LeanEngine 使用,我将代码托管到 https://coding.net/ 进行源码的版本管理,只要在 LeanCloud 后台一键部署即可,具体可参考网站文档:

https://leancloud.cn/docs/leanengine_webhosting_guide-node.html#Git_部署

总结

写代码太无聊了,偶尔折腾折腾挺好,如何将不同的技术和工具,以及第三方服务结合在一起,做一些事情也挺好的。

下一步要做:

  1. 搭建一个录入微信文章的后台;
  2. 如何解析和加解密微信的消息体;

coding01 期待您关注

qrcode
上一篇下一篇

猜你喜欢

热点阅读