详解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访问ActiveX对象,以操作Access数据库为例。
Dec 15 NodeJs
nodejs npm package.json中文文档
Sep 04 NodeJs
nodejs开发环境配置与使用
Nov 17 NodeJs
nodejs中实现sleep功能实例
Mar 24 NodeJs
浅谈Nodejs观察者模式
Oct 13 NodeJs
Nodejs express框架一个工程中同时使用ejs模版和jade模版
Dec 28 NodeJs
NodeJS中的MongoDB快速入门详细教程
Nov 11 NodeJs
nodejs利用ajax实现网页无刷新上传图片实例代码
Jun 06 NodeJs
nodejs调取微信收货地址的方法
Dec 20 NodeJs
使用nodejs+express实现简单的文件上传功能
Dec 27 NodeJs
nodejs中express入门和基础知识点学习
Sep 13 NodeJs
Nodejs libuv运行原理详解
Aug 21 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 变量定义和变量替换的方法
2009/07/30 PHP
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
php抽奖小程序的实现代码
2013/06/18 PHP
codeigniter中view通过循环显示数组数据的方法
2015/03/20 PHP
codeigniter发送邮件并打印调试信息的方法
2015/03/21 PHP
Yii2 队列 shmilyzxt/yii2-queue 简单概述
2017/08/02 PHP
php接口隔离原则实例分析
2019/11/11 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
2020/12/01 PHP
ExtJS Ext.MessageBox.alert()弹出对话框详解
2010/04/02 Javascript
js 弹出菜单/窗口效果
2011/10/30 Javascript
ajax异步刷新实现更新数据库
2012/12/03 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
2016/02/25 Javascript
jquery中live()方法和bind()方法区别分析
2016/06/23 Javascript
AngularJS 模型详细介绍及实例代码
2016/07/27 Javascript
jQuery初级教程之网站品牌列表效果
2017/08/02 jQuery
jQuery实现倒计时功能 jQuery实现计时器功能
2017/09/19 jQuery
AngularJS 的$timeout服务示例代码
2017/09/21 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
json数据传到前台并解析展示成列表的方法
2018/08/06 Javascript
angular4中引入echarts的方法示例
2019/01/29 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
详解JavaScript中new操作符的解析和实现
2020/09/04 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
在Python中使用全局日志时需要注意的问题
2015/05/06 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
python实现的自动发送消息功能详解
2019/08/15 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
运动会通讯稿300字
2014/02/02 职场文书
志愿者服务感言
2014/02/27 职场文书
个人总结格式范文
2015/03/09 职场文书
楚门的世界观后感
2015/06/03 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书
深入理解Pytorch微调torchvision模型
2021/11/11 Python