搭建公衆號自動回覆功能

程序員愛炫技,寫個公衆號文章,都想拿點技術整整【自動回覆】;程序員愛偷懶,什麼都想作個【自動化】,最好全部事情繫統都給作了,點點手指頭就能達到目標。html

今天的主角是如何搭建一個公衆號自動回覆功能。整個流程以下:node

  1. 利用 hapi 開發 web 程序,對接微信公衆號後臺;git

  2. 利用 LeanCloud SDK 將文章存儲於 LeanCloud 後端;程序員

  3. 接收用戶發送的消息,獲取關鍵詞,查詢文章,並回復給用戶;github

  4. 將 web 程序代碼託管於 coding.net;web

  5. 使用 LeanEngine 部署 hapi 程序。數據庫

1. hapi

A rich framework for building applications and servicesexpress

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

選擇 hapi,主要被它的 logo 和讀音(與 happy 同音)吸引,也主要由於本身愛折騰,老想着用不一樣的框架寫寫,重點是看看區別,你也能夠看看 stackoverflow 上的帖子api

https://stackoverflow.com/que...

在用 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/hap...

具體和微信後臺路由配置就好說了,直接上圖:

2. LeanCloud

LeanCloud 領先的 BaaS 提供商,爲移動開發提供強有力的後端支持

包括雲存儲、數據分析、用戶關係、消息推送、即時通訊等現代應用基礎模塊,知足移動開發全部需求

https://leancloud.cn/

爲何選擇 LeanCloud

  • 雲存儲。 主要方便自動回覆,不須要存儲大量數據,徹底不必購買一臺【雲服務器】或者【雲數據庫服務器】,並且 LeanCloud 提供 10 GB 免費空間,足夠前期使用;

  • 數據。支持任意類型的 JSON 對象,以及對象之間的關聯映射,同時提供完整的增刪改查操做接口,方便開發;

  • 統計。提供開箱即用的移動統計,沒準哪天粉絲數量增多了,也能夠作一些統計分析,如分析分析哪一個關鍵詞是你們關注的,哪一個話題是你們樂於傳播分享的,等等。

  • 全平臺 SDK 。搭建公衆號後臺功能,主要也是折騰折騰,這回用 Javascipt SDK 寫寫接口,沒準哪天想換換口味,也能夠從新試試用 PHP SDK 來重構複寫。知足折騰需求。

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/lea...使用

  • Git 部署

代碼都有一個版本控制,爲了配合 LeanEngine 使用,我將代碼託管到 https://coding.net/ 進行源碼的版本管理,只要在 LeanCloud 後臺一鍵部署便可,具體可參考網站文檔:

https://leancloud.cn/docs/lea...部署

總結

寫代碼太無聊了,偶爾折騰折騰挺好,如何將不一樣的技術和工具,以及第三方服務結合在一塊兒,作一些事情也挺好的。

  • LeanCloud 負責後臺數據存儲;

  • LeanEngine 負責服務端託管平臺,來運行服務端程序;

  • hapi 負責服務端 web 程序開發;

  • coding.net 負責源碼的版本控制管理;

下一步要作:

  1. 搭建一個錄入微信文章的後臺;

  2. 如何解析和加解密微信的消息體;


coding01 期待您關注

qrcode

相關文章
相關標籤/搜索