返回顶部
首页 > 资讯 > 前端开发 > node.js >NodeJS实现微信公众号关注后自动回复功能
  • 443
分享到

NodeJS实现微信公众号关注后自动回复功能

自动回复公众功能 2022-06-04 17:06:24 443人浏览 独家记忆
摘要

一 实先自动回复功能的逻辑步骤   1 处理POST类型的控制逻辑,接收XML的数据包;   2 解析XML数据包(获得数据包的消息类型或者是事件类型);   3 拼装我们定义好的消息;   4 包装成XM

一 实先自动回复功能的逻辑步骤

  1 处理POST类型的控制逻辑,接收XML的数据包;

  2 解析XML数据包(获得数据包的消息类型或者是事件类型);

  3 拼装我们定义好的消息;

  4 包装成XML格式;

  5 在5秒内返回回去

二 代码实操

  本节代码参照上节课继续修改和完善,目录结构跟之前相同,新引入的模块raw-body使用npm install安装一下即可,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;

  完成这节的代码后,当关注微信测试公众号的时候,会自动回复『你好,同学!』的提示信息。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: NodeJS实现微信公众号关注后自动回复功能

本文链接: https://lsjlt.com/news/12588.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • NodeJS实现微信公众号关注后自动回复功能
    一 实先自动回复功能的逻辑步骤   1 处理POST类型的控制逻辑,接收XML的数据包;   2 解析XML数据包(获得数据包的消息类型或者是事件类型);   3 拼装我们定义好的消息;   4 包装成XM...
    99+
    2022-06-04
    自动回复 公众 功能
  • 详解nodejs微信公众号开发——2.自动回复
    上一篇文章:nodejs微信公众号开发(1)接入微信公众号,本篇文章将在此基础上实现简单的回复功能。 1. 接入代码的优化 之前我们简单粗暴的实现了微信公众号的接入,接入的代码直接写在了app.js文件...
    99+
    2022-06-04
    详解 自动回复 公众
  • PHP实现微信关注公众号扫码登录功能
    PHP微信扫码登录看起来简单,但做起来有点复杂,微信接口的坑有点多,稍不注意,就费很多时间。PHP判断是否首次关注公众号,扫码关注公众号获取微信用户头像、openid和省市等信息源码。        ...
    99+
    2023-06-05
  • PHP开发微信公众号:如何实现自动回复
    PHP开发微信公众号:如何实现自动回复微信公众号是企业或个人通过微信平台向用户提供服务、传播信息的重要渠道之一。自动回复是微信公众号功能中的关键点之一,它可以帮助企业快速响应用户的咨询、指引用户进行相关操作,提高用户的满意度和体验。本文将介...
    99+
    2023-10-27
    PHP编程 微信公众号开发 自动回复 PHP开发微信公众号:
  • nodejs微信公众号开发之如何实现自动回复各种消息
    这篇文章主要介绍了nodejs微信公众号开发之如何实现自动回复各种消息,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 被动回复用户消息当...
    99+
    2024-04-02
  • Python开发之快速搭建自动回复微信公众号功能
    在之前的一篇文章 Python利用 AIML 和 Tornado 搭建聊天机器人微信订阅号 中用 aiml 实现了一个简单的英文聊天机器人订阅号。但是只能处理英文消息,现在用 图灵机器人 来实现一个中文的聊...
    99+
    2022-06-04
    自动回复 公众 快速
  • 详解nodejs微信公众号开发——4.自动回复各种消息
    上一篇文章:nodejs微信公众号开发——3.封装消息响应模块,实现了对消息接口的模块化处理,方便后期的使用,本篇文章将介绍微信公众号回复各种消息的功能实现,包括文本、图片、语音、视频、音乐、图文等。 注...
    99+
    2022-06-04
    详解 自动回复 公众
  • nodejs中怎么实现微信公众号开发
    今天就跟大家聊聊有关nodejs中怎么实现微信公众号开发,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.公众平台测试帐号的使用登录微信公众平台,由...
    99+
    2024-04-02
  • SpringBoot + 微信公众号JSAPI支付功能的实现
    1、pom.xml依赖配置 <!-- 微信支付 --> <dependency> <groupId>com.egzosn</grou...
    99+
    2024-04-02
  • Java实现公众号功能、关注、消息推送
    Java实现公众号功能开发 文章目录 Java实现公众号功能开发描述引入依赖注册公众号配置公众号各事件处理实现公众号事件处理类实现公众号日志记录处理器实现公众号用户关注处理器实现公众号用户取消...
    99+
    2023-10-20
    java 微信公众平台
  • 使用Nodejs开发微信公众号后台服务实例
    摘要: 微信,庞大的用户基数,极强的用户粘性,在近两年吸引了无数的开发者注意力。 Nodejs,近两年发展非常快的开发工具,尤其适合构建移动后台。本文就以笔者自己开发的实例,来描述如何基于Nodejs开发属...
    99+
    2022-06-04
    后台 实例 公众
  • 如何使用PHP编写微信公众号自动回复程序
    随着移动互联网的快速发展,微信已经成为了人们生活中必不可少的社交工具。而在微信公众号中,自动回复功能也是不可缺少的一部分。本文将介绍如何使用PHP编写微信公众号自动回复程序。准备工作首先,需要有一个微信公众号。如果没有的话可以去申请一个。其...
    99+
    2023-05-14
    PHP 微信公众号 自动回复程序
  • Spring Security实现微信公众号网页授权功能
    微信公众号提供了微信支付、微信优惠券、微信H5红包、微信红包封面等等促销工具来帮助我们的应用拉新保活。但是这些福利要想正确地发放到用户的手里就必须拿到用户特定的(微信应用)微信标识o...
    99+
    2024-04-02
  • 基于Python实现微信自动回复功能
    大家好,之前我们使用 WechatPCAPI 做了获取微信好友信息以及查看撤回消息,本文我们再使用 WechatPCAPI 来实现微信自动回复的功能。 实现自动回复的功能,我们需要用...
    99+
    2024-04-02
  • 利用python微信库itchat实现微信自动回复功能
    前言 在论坛上看到了用Python登录微信并实现自动签到,才了解到一个新的Python库: itchat 利用Python 微信库itchat,可以实现自动回复等多种功能,好玩到根本停不下来啊,尤其是调戏调...
    99+
    2022-06-04
    自动回复 功能 python
  • 基于chatgpt的微信自动回复功能实现
    微信自动回复 基于聊天api的 import pyautogui import pyperclip import keyboard import requests import ti...
    99+
    2023-02-24
    chatgpt微信自动回复 聊天api微信自动回复
  • java微信扫描公众号二维码实现登陆功能
    本文实例为大家分享了java微信扫描公众号二维码实现登陆的具体代码,供大家参考,具体内容如下前提条件: 微信公众平台为服务号, 2.服务号实现了账号绑定功能,即将open_id 与业务系统中的用户名有对应关系具体实现原理: 用户访问业务系统...
    99+
    2023-05-31
    java 二维码
  • 如何在微信公众号上用PHP实现直播功能
    如何在微信公众号上用PHP实现直播功能随着科技的不断发展和智能手机的普及,直播已经成为了一种流行的社交媒体方式。很多企业和个人也开始在微信公众号上开设直播间,以吸引更多的粉丝和用户关注。本文将介绍如何用PHP实现在微信公众号上的直播功能,并...
    99+
    2023-10-26
    PHP 微信公众号 直播功能
  • 基于Python如何实现微信自动回复功能
    这篇文章主要介绍“基于Python如何实现微信自动回复功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于Python如何实现微信自动回复功能”文章能帮助大家解决问题。实现自动回复的功能,我们需要...
    99+
    2023-07-02
  • SpringBoot实现发送邮件、发送微信公众号推送功能
    目录SpringBoot实现发送邮件pom.xmlapplication.yml代码实现SpringBoot实现发送微信公众号推送pom.xml代码实现SpringBoot实现发送邮...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作