详解nodejs微信公众号开发——5.素材管理接口


Posted in NodeJs onApril 11, 2017

上一篇文章:nodejs微信公众号开发——4.自动回复各种消息,我们实现了被动回复文字和图文,回复图片失败,因为需要先获取通过素材管理接口上传多媒体文件而得到的MediaId,这一节们就来实现素材管理的接口。可参看:公众平台开发者文档

1. 新增临时素材

临时素材顾名思义是临时的,上传后一定时间就被清理掉,适用于一些有时效性的图文链接。关于临时素材需要注意的点:

  1. 对于临时素材,每个素材(media_id)会在开发者上传或粉丝发送到微信服务器3天后自动删除(所以用户发送给开发者的素材,若开发者需要,应尽快下载到本地),以节省服务器资源。
  2. media_id是可复用的。
  3. 素材的格式大小等要求与公众平台官网一致。具体是,图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒,支持mp3/wma/wav/amr格式
  4. 需使用https调用本接口。

请求地址:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE

1.1 实现uploadTempMaterial方法

uploadTempMaterial是用来上传临时素材,直接在Wechat的原型链上添加:

Wechat.prototype.uploadTempMaterial = function(type,filepath){
  var that = this;
  var form = { //构造表单
    media:fs.createReadStream(filepath)
  }
  return new Promise(function(resolve,reject){
    that.fetchAccessToken().then(function(data){

      var url = api.uploadMaterial + 'access_token=' + data.access_token + '&type=' + type;
      request({url:url,method:'POST',formData:form,json:true}).then(function(response){
        var _data = response.body;
        if(_data){
          resolve(_data)
        }else{
          throw new Error('upload material failed!');
        }
      }).catch(function(err){
        reject(err);
      });
    });
  });
}

代码中的fetchAccessToken用以获取access_token,修改回复数字2的代码:

else if(content === '2'){
  var data = yield wechatApi.uploadTempMaterial('image',__dirname+'/public/king.jpg');
  reply = {
    type:'image',
    mediaId:data.media_id
  }
}

先将本地的一张图片上传到临时素材接口,获取media_id,封装到回复消息里面去。同样的方法适用于语音,视频等:

详解nodejs微信公众号开发——5.素材管理接口

2. 新增永久素材

永久素材回永远存储在微信后台服务器上,永不失效。关于永久素材有一下几个特点:

  1. 新增的永久素材也可以在公众平台官网素材管理模块中看到
  2. 永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000
  3. 素材的格式大小等要求与公众平台官网一致。具体是,图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒,支持mp3/wma/wav/amr格式
  4. 调用该接口需https协议

新增永久图文素材请求地址:https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=ACCESS_TOKEN

新增永久图片请求地址:https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN

新增其他类型永久素材请求地址:https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN

2.1 实现uploadPermMaterial方法

uploadPermMaterialuploadTempMaterial方法基本是类似的,只是永久素材的的上传分为三类,需要判断一下传入的类型。

Wechat.prototype.uploadPermMaterial = function(type,material){
  var that = this;
  var form = {}
  var uploadUrl = '';
  if(type === 'pic') uploadUrl = api.uploadPermPics;
  if(type === 'other') uploadUrl = api.uploadPermOther;
  if(type === 'news'){
    uploadUrl = api.uploadPermNews;
    form = material
  }else{
    form.media = fs.createReadStream(material);
  }
  return new Promise(function(resolve,reject){
    that.fetchAccessToken().then(function(data){
      var url = uploadUrl + 'access_token=' + data.access_token;
      var opts = {
        method:'POST',
        url:url,
        json:true
      }
      (type == 'news') ? (opts.body = form) : (opts.formData = form); //上传数据的方式不同
      request(opts).then(function(response){
        var _data = response.body;
        if(_data){
          resolve(_data)
        }else{
          throw new Error('upload permanent material failed!');
        }
      }).catch(function(err){
        reject(err);
      });
    });
  });
}

:虽然实现了永久素材上传,但是测试账号也不是每一次都能测试成功,未经过认证的订阅号也不支持永久素材的上传。

3. 获取素材链接

由于获取临时素材和获取永久素材的差异性不大,直接放在一个函数里完成。

Wechat.prototype.getMaterial = function(mediaId,permanent){
  var that = this;
  var getUrl = permanent ? api.getPermMaterial : api.getTempMaterial;
  return new Promise(function(resolve,reject){
    that.fetchAccessToken().then(function(data){
      var url = getUrl + 'access_token=' + data.access_token;
      if(!permanent) url += '&media_id=' + mediaId;
      resolve(url)
    });
  });
}

4. 删除永久素材

删除永久素材就比较简单了,只需传入一个mediaId即可:

Wechat.prototype.delMaterial = function(mediaId){
  var that = this;
  return new Promise(function(resolve,reject){
    that.fetchAccessToken().then(function(data){
      var url = api.delPermMaterial + 'access_token=' + data.access_token;
      var form = {media_id:mediaId}
      request({url:url,method:'POST',formData:form,json:true}).then(function(response){
        var _data = response.body;
        if(_data.errcode === '0'){
          resolve();
        }else{
          throw new Error('delete permanent material failed!');
        }
      }).catch(function(err){
        reject(err);
      });
    });
  });
}

5.其他

还有修改永久图文素材获取素材总数获取素材列表功能由于本项目中不会用到,就不一一实现了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
使用Nodejs开发微信公众号后台服务实例
Sep 03 NodeJs
NodeJS Web应用监听sock文件实例
Feb 18 NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 NodeJs
nodejs实现发出蜂鸣声音(系统报警声)的方法
Jan 18 NodeJs
nodejs中模块定义实例详解
Mar 18 NodeJs
详解nodejs微信公众号开发——2.自动回复
Apr 10 NodeJs
详解使用nodeJs安装Vue-cli
May 17 NodeJs
nodeJS实现简单网页爬虫功能的实例(分享)
Jun 08 NodeJs
Nodejs中使用phantom将html转为pdf或图片格式的方法
Sep 18 NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 NodeJs
nodeJs项目在阿里云的简单部署
Nov 27 NodeJs
详解nodejs微信公众号开发——4.自动回复各种消息
Apr 11 #NodeJs
nodejs连接mysql数据库简单封装示例-mysql模块
Apr 10 #NodeJs
详解nodejs操作mongodb数据库封装DB类
Apr 10 #NodeJs
详解nodejs微信公众号开发——3.封装消息响应模块
Apr 10 #NodeJs
详解nodejs微信公众号开发——2.自动回复
Apr 10 #NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 #NodeJs
使用 NodeJS+Express 开发服务端的简单介绍
Apr 07 #NodeJs
You might like
学习使用PHP数组
2006/10/09 PHP
PHP的加密方式及原理
2012/06/14 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
PHP实现事件机制实例分析
2015/06/26 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
greybox——不开新窗口看新的网页
2007/02/20 Javascript
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
js截取函数(indexOf,join等)
2010/09/01 Javascript
JQuery设置和去除disabled属性的5种方法总结
2013/05/16 Javascript
javascript简单实现命名空间效果
2014/03/06 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
深入探讨javascript函数式编程
2015/10/11 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
XMLHttpRequest Level 2 使用指南
2016/08/26 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
微信小程序实现实时圆形进度条的方法示例
2017/02/24 Javascript
利用jQuery解析获取JSON数据
2017/04/08 jQuery
Three.js入门之hello world以及如何绘制线
2017/09/25 Javascript
如何在JavaScript中创建具有多个空格的字符串?
2020/02/23 Javascript
js+css3实现简单时钟特效
2020/09/13 Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
2020/11/16 Javascript
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
flask框架路由常用定义方式总结
2019/07/23 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
css3新单位vw、vh的使用教程
2018/03/23 HTML / CSS
统计每一学生的平均成绩
2014/06/06 面试题
STP的判定过程
2012/10/01 面试题
架构师岗位职责
2013/11/18 职场文书
心理健康教育心得体会
2013/12/29 职场文书
优秀本科生求职推荐信
2014/02/24 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
python实现简单反弹球游戏
2021/04/12 Python
Python 处理表格进行成绩排序的操作代码
2021/07/26 Python