摘要:今天的主角是如何搭建一個(gè)公眾號(hào)自動(dòng)回復(fù)功能。對(duì)于大網(wǎng)站或者項(xiàng)目來(lái)說(shuō),找一家如阿里云騰訊云等云服務(wù)平臺(tái),但對(duì)于個(gè)人只是想簡(jiǎn)單的搭建一個(gè)公眾號(hào)管理自動(dòng)回復(fù)功能,終究有些大材小用了結(jié)合使用相得映彰,而且可以根據(jù)需要升級(jí)擴(kuò)展。
程序員愛(ài)炫技,寫(xiě)個(gè)公眾號(hào)文章,都想拿點(diǎn)技術(shù)整整【自動(dòng)回復(fù)】;程序員愛(ài)偷懶,什么都想做個(gè)【自動(dòng)化】,最好所有事情系統(tǒng)都給做了,點(diǎn)點(diǎn)手指頭就能達(dá)到目標(biāo)。
今天的主角是如何搭建一個(gè)公眾號(hào)自動(dòng)回復(fù)功能。整個(gè)流程如下:
利用 hapi 開(kāi)發(fā) web 程序,對(duì)接微信公眾號(hào)后臺(tái);
利用 LeanCloud SDK 將文章存儲(chǔ)于 LeanCloud 后端;
接收用戶(hù)發(fā)送的消息,獲取關(guān)鍵詞,查詢(xún)文章,并回復(fù)給用戶(hù);
將 web 程序代碼托管于 coding.net;
使用 LeanEngine 部署 hapi 程序。
1. hapiA 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 同音)吸引,也主要因?yàn)樽约簮?ài)折騰,老想著用不同的框架寫(xiě)寫(xiě),重點(diǎn)是看看區(qū)別,你也可以看看 stackoverflow 上的帖子
https://stackoverflow.com/que...
在用 hapi 寫(xiě)代碼時(shí),有種代碼既文檔的感覺(jué),更重點(diǎn)的是 hapi 提供了一套 Plugins 方案,所有代碼都可以以這種方式進(jìn)行擴(kuò)展和分離組織,可讀性更高,如我將對(duì)接微信公眾后臺(tái)的 API 獨(dú)立為 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; } });
這樣就可以將微信公眾號(hào)后臺(tái)功能相關(guān)的代碼獨(dú)立到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; // 具體邏輯處理 和 自動(dòng)回復(fù) }); } }); return next(); }; exports.register.attributes = { name: "wechat-weixin" };
具體如何配置開(kāi)發(fā) hapi 可以參考官網(wǎng)和 github
https://hapijs.com/
https://github.com/hapijs/hap...
具體和微信后臺(tái)路由配置就好說(shuō)了,直接上圖:
為什么選擇 LeanCloudLeanCloud 領(lǐng)先的 BaaS 提供商,為移動(dòng)開(kāi)發(fā)提供強(qiáng)有力的后端支持
包括云存儲(chǔ)、數(shù)據(jù)分析、用戶(hù)關(guān)系、消息推送、即時(shí)通信等現(xiàn)代應(yīng)用基礎(chǔ)模塊,滿(mǎn)足移動(dòng)開(kāi)發(fā)所有需求
https://leancloud.cn/
云存儲(chǔ)。 主要方便自動(dòng)回復(fù),不需要存儲(chǔ)大量數(shù)據(jù),完全沒(méi)必要購(gòu)買(mǎi)一臺(tái)【云服務(wù)器】或者【云數(shù)據(jù)庫(kù)服務(wù)器】,而且 LeanCloud 提供 10 GB 免費(fèi)空間,足夠前期使用;
數(shù)據(jù)。支持任意類(lèi)型的 JSON 對(duì)象,以及對(duì)象之間的關(guān)聯(lián)映射,同時(shí)提供完整的增刪改查操作接口,方便開(kāi)發(fā);
統(tǒng)計(jì)。提供開(kāi)箱即用的移動(dòng)統(tǒng)計(jì),沒(méi)準(zhǔn)哪天粉絲數(shù)量增多了,也可以做一些統(tǒng)計(jì)分析,如分析分析哪個(gè)關(guān)鍵詞是大家關(guān)注的,哪個(gè)話(huà)題是大家樂(lè)于傳播分享的,等等。
全平臺(tái) SDK 。搭建公眾號(hào)后臺(tái)功能,主要也是折騰折騰,這回用 Javascipt SDK 寫(xiě)寫(xiě)接口,沒(méi)準(zhǔn)哪天想換換口味,也可以重新試試用 PHP SDK 來(lái)重構(gòu)復(fù)寫(xiě)。滿(mǎn)足折騰需求。
JavaScript SDK使用 SDK 主要三個(gè)作用:
存儲(chǔ)公眾號(hào)文章基本信息,便于查詢(xún)
根據(jù)微信公眾號(hào)文檔接口需要,主要存儲(chǔ) title, description, picurl, url 四要素;如果為了結(jié)合搜索功能,還需要存儲(chǔ)這篇文章的關(guān)鍵詞。
結(jié)合 LeanCloud SDK,存儲(chǔ)代碼就很簡(jiǎn)單了:
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) { // 成功保存之后,執(zhí)行其他邏輯. console.log("成功保存:New object created with objectId: " + blog.id); reply(blog); }, function (error) { // 失敗之后執(zhí)行其他邏輯 console.log("Failed to create new object, with error message: " + error.message); return reply(Boom.wrap(error, "error")); });
獲取最新的一篇文章;
當(dāng)一個(gè)新粉絲首次進(jìn)入公眾號(hào),或者發(fā)了一些暫時(shí)沒(méi)處理的信息時(shí),可以直接回復(fù)最新的一篇文章:
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) { });
通過(guò)【關(guān)鍵詞】查詢(xún)相關(guān)文章。
搜索【關(guān)鍵詞】,主要搜索 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([]); });
最后可以將查詢(xún)結(jié)果轉(zhuǎn)成【圖文信息】回復(fù)
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); } });
當(dāng)然,根據(jù)情況需要,如果在找不到查詢(xún)結(jié)果時(shí),我們可以?xún)?nèi)建一些【智能聊天】、【生活信息查詢(xún)】等等。
3. LeanEngine云引擎(LeanEngine)是 LeanCloud 推出的服務(wù)端托管平臺(tái)。提供了多種運(yùn)行環(huán)境(Node.js, Python 等)來(lái)運(yùn)行服務(wù)端程序。你只需要提供服務(wù)端的業(yè)務(wù)邏輯(網(wǎng)站或云函數(shù)等),而服務(wù)端的多實(shí)例負(fù)載均衡,不中斷服務(wù)的平滑升級(jí)等都由云引擎提供支持。
當(dāng)寫(xiě)了服務(wù)端代碼后,總要有個(gè)地方托管。對(duì)于大網(wǎng)站或者項(xiàng)目來(lái)說(shuō),找一家如阿里云、騰訊云等云服務(wù)平臺(tái), 但對(duì)于個(gè)人只是想簡(jiǎn)單的搭建一個(gè)公眾號(hào)管理——自動(dòng)回復(fù)功能,終究有些大材小用了;LeanEngine 結(jié)合 LeanCloud 使用相得映彰,而且 LeanEngine 可以根據(jù)需要升級(jí)擴(kuò)展。
部署主要有兩種途徑:命令行部署和 Git 部署
命令行部署
只要在項(xiàng)目的根目錄運(yùn)行:
lean deploy
使用命令行工具可以方便的部署、發(fā)布應(yīng)用,查看應(yīng)用狀態(tài),查看日志,甚至進(jìn)行多應(yīng)用部署。具體可參考網(wǎng)站文檔:
https://leancloud.cn/docs/lea...使用
Git 部署
代碼都有一個(gè)版本控制,為了配合 LeanEngine 使用,我將代碼托管到 https://coding.net/ 進(jìn)行源碼的版本管理,只要在 LeanCloud 后臺(tái)一鍵部署即可,具體可參考網(wǎng)站文檔:
https://leancloud.cn/docs/lea...部署
總結(jié)寫(xiě)代碼太無(wú)聊了,偶爾折騰折騰挺好,如何將不同的技術(shù)和工具,以及第三方服務(wù)結(jié)合在一起,做一些事情也挺好的。
LeanCloud 負(fù)責(zé)后臺(tái)數(shù)據(jù)存儲(chǔ);
LeanEngine 負(fù)責(zé)服務(wù)端托管平臺(tái),來(lái)運(yùn)行服務(wù)端程序;
hapi 負(fù)責(zé)服務(wù)端 web 程序開(kāi)發(fā);
coding.net 負(fù)責(zé)源碼的版本控制管理;
下一步要做:
搭建一個(gè)錄入微信文章的后臺(tái);
如何解析和加解密微信的消息體;
coding01 期待您關(guān)注
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/84250.html
摘要:時(shí)間年月日星期五說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。本套課程介紹微信公眾號(hào)開(kāi)發(fā),主要涉及公眾號(hào)介紹編輯模式介紹開(kāi)發(fā)模式介紹等。慕課網(wǎng)是垂直的互聯(lián)網(wǎng)技能免費(fèi)學(xué)習(xí)網(wǎng)站。 時(shí)間:2017年08月11日星期五說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github...
摘要:本篇是該系列的第一篇,本地開(kāi)發(fā)環(huán)境搭建以及接入微信。若確認(rèn)此次請(qǐng)求來(lái)自微信服務(wù)器,原樣返回參數(shù)內(nèi)容,則接入生效,成為開(kāi)發(fā)者成功,否則接入失敗。 一、簡(jiǎn)介 關(guān)于微信公眾號(hào)的介紹就省略了,自行搜索。注冊(cè)過(guò)程也不說(shuō)了。我們會(huì)直接注冊(cè)測(cè)試號(hào)來(lái)實(shí)現(xiàn)代碼。這將會(huì)是個(gè)全面講解微信公眾號(hào)開(kāi)發(fā)的系列教程。本篇是該系列的第一篇,本地開(kāi)發(fā)環(huán)境搭建以及接入微信。在開(kāi)始之前最好去看看開(kāi)發(fā)者文檔微信公眾平臺(tái)技術(shù)文...
摘要:官網(wǎng)源碼推薦從開(kāi)始手寫(xiě)一個(gè)框架更多請(qǐng)?jiān)诩夹g(shù)棧微信公眾號(hào)后臺(tái)回復(fù)關(guān)鍵字。是一個(gè)開(kāi)放源代碼的對(duì)象關(guān)系映射框架,它對(duì)進(jìn)行了非常輕量級(jí)的對(duì)象封裝,它將與數(shù)據(jù)庫(kù)表建立映射關(guān)系,是一個(gè)全自動(dòng)的框架。 Java 程序員方向太多,且不說(shuō)移動(dòng)開(kāi)發(fā)、大數(shù)據(jù)、區(qū)塊鏈、人工智能這些,大部分 Java 程序員都是 Java Web/后端開(kāi)發(fā)。那作為一名 Java Web 開(kāi)發(fā)程序員必須需要熟悉哪些框架呢? 今天...
摘要:重度強(qiáng)迫癥患者取消大小寫(xiě)敏感,讓自動(dòng)完成更齊全。如何為當(dāng)前項(xiàng)目工程添加多個(gè)模塊啊答對(duì)著工程右鍵選擇通常選擇,如圖寫(xiě)在最后歡迎關(guān)注喜歡和點(diǎn)贊后續(xù)將推出更多的工具集教程,敬請(qǐng)期待。公眾號(hào)回復(fù)面試,領(lǐng)取面試實(shí)戰(zhàn)學(xué)習(xí)資源。 showImg(https://segmentfault.com/img/remote/1460000018862588); 前言:IntelliJ IDEA 如果說(shuō)Int...
閱讀 1594·2019-08-30 13:18
閱讀 1582·2019-08-29 12:19
閱讀 2120·2019-08-26 13:57
閱讀 4146·2019-08-26 13:22
閱讀 1189·2019-08-26 10:35
閱讀 2995·2019-08-23 18:09
閱讀 2508·2019-08-23 17:19
閱讀 685·2019-08-23 17:18