這篇文章主要為大家詳細介紹了NodeJS實現微信公眾號關注後自動回复功能,具有一定的參考價值,有興趣的小伙伴們可以參考一下
##一實先自動回覆功能的邏輯步驟
1 處理POST類型的控制邏輯,接收XML
的封包; 2 解析XML封包(取得封包的訊息類型或是###事件###類型);###### 3 拼裝我們定義好的訊息;###### 4 包裝成XML格式;## #### 5 在5秒內回回去#########二程式碼實作######### 本節程式碼參考上節課繼續修改和完善,###目錄結構###跟之前相同,新引入的模組raw-body使用npm inst###all######安裝###一下即可,app.js啟動檔案和util.js不做變動,主要修改一下generator.js文件,以及在generator.js同級目錄下新建wechat.js檔案和tools.js檔案。 ###### wechat.js檔案是將前一節generator.js檔案中票據部分的程式碼抽離出來單獨放在一個檔案中,具體程式碼如下:###'use strict'; // 引入模块 var Promise = require('bluebird'); var request = Promise.promisify(require('request')); //增加url配置项 var prefix = 'https://api.weixin.qq.com/cgi-bin/'; var api = { accessToken: prefix + 'token?grant_type=client_credential' }; //利用构造函数生成实例 完成票据存储逻辑 function weChat(opts) { var that = this; this.appID = opts.appID; this.appSecret = opts.appSecret; this.getAccessToken = opts.getAccessToken; this.saveAccessToken = opts.saveAccessToken; //获取票据的方法 this.getAccessToken() .then(function(data) { //从静态文件获取票据,JSON化数据,如果有异常,则尝试更新票据 try { data = JSON.parse(data); } catch (e) { return that.updateAccessToken(); } //判断票据是否在有效期内,如果合法,向下传递票据,如果不合法,更新票据 if (that.isValidAccessToken(data)) { Promise.resolve(data); } else { return that.updateAccessToken(); } }) //将拿到的票据信息和有效期信息存储起来 .then(function(data) { //console.log(data); that.access_token = data.access_token; that.expires_in = data.expires_in; that.saveAccessToken(data); }) }; //在weChat的原型链上增加验证有效期的方法 weChat.prototype.isValidAccessToken = function(data) { //进行判断,如果票据不合法,返回false if (!data || !data.access_token || !data.expires_in) { return false; } //拿到票据和过期时间的数据 var access_token = data.access_token; var expires_in = data.expires_in; //获取当前时间 var now = (new Date().getTime()); //如果当前时间小于票据过期时间,返回true,否则返回false if (now < expires_in) { return true; } else { return false; }; }; //在weChat的原型链上增加更新票据的方法 weChat.prototype.updateAccessToken = function() { var appID = this.appID; var appSecret = this.appSecret; var url = api.accessToken + '&appid=' + appID + '&secret=' + appSecret; return new Promise(function(resolve, reject) { //使用request发起请求 request({ url: url, json: true }).then(function(response) { var data = response.body; var now = (new Date().getTime()); var expires_in = now + (data.expires_in - 20) * 1000; //把新票据的有效时间赋值给data data.expires_in = expires_in; resolve(data); }) }) }; //向外暴露weChat module.exports = weChat;### generator.js檔案進行精簡後,加入判斷對xml資料的格式化方法以及判斷事件,新增關注事件測試訊息,具體程式碼如下:###
'use strict'; // 引入模块 var sha1 = require('sha1'); var getRawBody = require('raw-body'); var weChat = require('./wechat'); var tools = require('./tools'); // 建立中间件函数并暴露出去 module.exports = function(opts) { //实例化weChat()函数 //var wechat = new weChat(opts); return function*(next) { //console.log(this.query); var that = this; var token = opts.token; var signature = this.query.signature; var nonce = this.query.nonce; var timestamp = this.query.timestamp; var echostr = this.query.echostr; // 进行字典排序 var str = [token, timestamp, nonce].sort().join(''); // 进行加密 var sha = sha1(str); //使用this.method对请求方法进行判断 if (this.method === 'GET') { // 如果是get请求 判断加密后的值是否等于签名值 if (sha === signature) { this.body = echostr + ''; } else { this.body = 'wrong'; }; } else if (this.method === 'POST') { //如果是post请求 也是先判断签名是否合法 如果不合法 直接返回wrong if (sha !== signature) { this.body = 'wrong'; return false; }; //通过raw-body模块 可以把把this上的request对象 也就是http模块中的request对象 去拼装它的数据 最终拿到一个buffer的xml数据 //通过yield关键字 获取到post过来的原始的XML数据 var data = yield getRawBody(this.req, { length: this.length, limit: '1mb', encoding: this.charset }); //console.log(data.toString());打印XML数据(当微信公众号有操作的时候 终端可以看到返回的XML数据) //tools为处理XML数据的工具包 使用tools工具包的parseXMLAsync方法 把XML数据转化成数组对象 var content = yield tools.parseXMLAsync(data); //console.log(content);打印转化后的数组对象 //格式化content数据为json对象 var message = tools.formatMessage(content.xml); console.log(message); //打印message //判断message的MsgType 如果是event 则是一个事件 if (message.MsgType === 'event') { //如果是订阅事件 if (message.Event === 'subscribe') { //获取当前时间戳 var now = new Date().getTime(); //设置回复状态是200 that.status = 200; //设置回复的类型是xml格式 that.type = 'application/xml'; //设置回复的主体 that.body = '<xml>' + '<ToUserName><![CDATA[' + message.FromUserName + ']]></ToUserName>' + '<FromUserName><![CDATA[' + message.ToUserName + ']]></FromUserName>' + '<CreateTime>' + now + '</CreateTime>' + '<MsgType><![CDATA[text]]></MsgType>' + '<Content><![CDATA[你好,同学!]]></Content>' + '</xml>'; return; } } } } };### tools.js是處理XML資料的工具檔:###
'use strict'; //引入模块 var xml2js = require('xml2js'); var Promise = require('bluebird'); //导出解析XML的方法 exports.parseXMLAsync = function(xml) { return new Promise(function(resolve, reject) { xml2js.parseString(xml, { trim: true }, function(err, content) { if (err) { reject(err); } else { resolve(content); }; }); }); }; //因为value值可能是嵌套多层的 所以先对value值进行遍历 function formatMessage(result) { //声明空对象message var message = {}; //对result类型进行判断 if (typeof result === 'object') { //如果是object类型 通过Object.keys()方法拿到result所有的key 并存入keys变量中 var keys = Object.keys(result); //对keys进行循环遍历 for (var i = 0; i < keys.length; i++) { //拿到每个key对应的value值 var item = result[keys[i]]; //拿到key var key = keys[i]; //判断item是否为数组或者长度是否为0 if (!(item instanceof Array) || item.length === 0) { //如果item不是数组或者长度为0 则跳过继续向下解析 continue; } //如果长度为1 if (item.length === 1) { //拿到value值存入val变量 var val = item[0]; //判断val是否为对象 if (typeof val === 'object') { //如果val为对象 则进一步进行遍历 message[key] = formatMessage(val); } else { //如果不是对象 就把值赋给当前的key放入message里 并去除收尾空格 message[key] = (val || '').trim(); } } //如果item的长度既不是0也不是1 则说明它是一个数组 else { //把message的key设置为空数组 message[key] = []; //对数组进行遍历 for (var j = 0, k = item.length; j < k; j++) { message[key].push(formatMessage(item[j])); } } } } return message; } exports.formatMessage = function(xml) { return new Promise(function(resolve, reject) { xml2js.parseString(xml, { trim: true }, function(err, content) { if (err) { reject(err); } else { resolve(content); }; }); }); }; exports.formatMessage = formatMessage;## # 完成這節的程式碼後,當關注微信測試公眾號的時候,會自動回覆『你好,同學! ’的提示訊息。 ###
以上是如何使用NodeJS來實現微信公眾號關注後自動回覆功能的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版
中文版,非常好用

SublimeText3 Linux新版
SublimeText3 Linux最新版

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。