详解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与Mysql的交互示例代码
Aug 18 NodeJs
nodejs之请求路由概述
Jul 05 NodeJs
基于NodeJS的前后端分离的思考与实践(二)模版探索
Sep 26 NodeJs
nodejs中实现sleep功能实例
Mar 24 NodeJs
nodejs通过phantomjs实现下载网页
May 04 NodeJs
Nodejs实现批量下载妹纸图
May 28 NodeJs
nodejs基础知识
Feb 03 NodeJs
nodejs对express中next函数的一些理解
Sep 08 NodeJs
Nodejs中使用phantom将html转为pdf或图片格式的方法
Sep 18 NodeJs
详解NodeJs开发微信公众号
May 25 NodeJs
nodejs简单抓包工具使用详解
Aug 23 NodeJs
一文秒懂nodejs中的异步编程
Jan 28 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获取http请求的头信息实现步骤
2012/12/16 PHP
php随机显示图片的简单示例
2014/02/15 PHP
Laravel模糊查询区分大小写的实例
2019/09/29 PHP
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
加载jQuery后$冲突的解决办法
2010/07/09 Javascript
Javascript动态绑定事件的简单实现代码
2010/12/25 Javascript
jQuery绑定事件不执行但alert后可以正常执行
2014/06/03 Javascript
javascript继承机制实例详解
2014/11/20 Javascript
jQuery实现移动 和 渐变特效的点击事件
2015/02/26 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
原生JS轮播图插件
2017/02/09 Javascript
Canvas 绘制粒子动画背景
2017/02/15 Javascript
详解在Angular项目中添加插件ng-bootstrap
2017/07/04 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
js实现全选和全不选
2020/07/28 Javascript
JavaScript常用8种数组去重代码实例
2020/09/09 Javascript
react-intl实现React国际化多语言的方法
2020/09/27 Javascript
python求列表交集的方法汇总
2014/11/10 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
2016/06/30 Python
python 3.5下xadmin的使用及修复源码bug
2017/05/10 Python
Python计时相关操作详解【time,datetime】
2017/05/26 Python
Python判断文件和字符串编码类型的实例
2017/12/21 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
CSS3制作缩略图的详细过程
2016/07/08 HTML / CSS
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
用canvas显示验证码的实现
2020/04/10 HTML / CSS
英国最大的独立摄影零售商:Park Cameras
2019/11/27 全球购物
测试工程师职业规划书
2014/02/06 职场文书
社区端午节活动总结
2015/02/11 职场文书
2015政治思想表现评语
2015/03/25 职场文书
开会通知
2015/04/20 职场文书
女儿满月酒致辞
2015/07/29 职场文书
《飘》英文读后感五篇
2019/10/11 职场文书
浅谈Nginx 中的两种限流方式
2021/03/31 Servers
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏