详解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 相关文章推荐
跟我学Nodejs(一)--- Node.js简介及安装开发环境
May 20 NodeJs
nodejs npm install全局安装和本地安装的区别
Jun 05 NodeJs
nodejs事件的监听与触发的理解分析
Feb 12 NodeJs
Nodejs学习笔记之入门篇
Apr 16 NodeJs
Nodejs获取网络数据并生成Excel表格
Mar 31 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
nodejs实现OAuth2.0授权服务认证
Dec 27 NodeJs
nodejs+express搭建多人聊天室步骤
Feb 12 NodeJs
Nodejs Express 通过log4js写日志到Logstash(ELK)
Aug 30 NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 NodeJs
Nodejs libuv运行原理详解
Aug 21 NodeJs
linux 下以二进制的方式安装 nodejs
Feb 12 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
一个用mysql_odbc和php写的serach数据库程序
2006/10/09 PHP
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
php简单分页类实现方法
2015/02/26 PHP
基于CI框架的微信网页授权库示例
2016/11/25 PHP
PHP关于foreach复制知识点总结
2019/01/28 PHP
jquery+json 通用三级联动下拉列表
2010/04/19 Javascript
jquery用get实现ajax在ie里面刷新不进入后台解决方法
2013/08/12 Javascript
JavaScript中使用Math.floor()方法对数字取整
2015/06/15 Javascript
一个例子轻松学会Vue.js
2017/01/02 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
在Create React App中使用CSS Modules的方法示例
2019/01/15 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
vue中@change兼容问题详解
2019/10/25 Javascript
JavaScript实现左右滚动电影画布
2020/02/06 Javascript
Node.js path模块,获取文件后缀名操作
2020/11/07 Javascript
浅谈es6中的元编程
2020/12/01 Javascript
Vue实现指令式动态追加小球动画组件的步骤
2020/12/18 Vue.js
[01:11]回顾历届DOTA2国际邀请赛中国区预选赛
2017/06/26 DOTA
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
Python 3中print函数的使用方法总结
2017/08/08 Python
利用Pandas读取文件路径或文件名称包含中文的csv文件方法
2018/07/04 Python
python实现简单五子棋游戏
2019/06/18 Python
基于python的Paxos算法实现
2019/07/03 Python
python sorted函数原理解析及练习
2020/02/10 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
澳大利亚票务和娱乐市场领导者:Ticketmaster
2017/03/03 全球购物
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
秋季婚礼证婚词
2014/01/11 职场文书
2014自荐信的写作技巧
2014/01/28 职场文书
幼儿园安全检查制度
2014/01/30 职场文书
行政助理的岗位职责
2014/02/18 职场文书