上一篇:Nodejs微信公众号开发-4.自动回复各种消息。我们已经实现了被动回复文字和图片,但是无法回复图片,因为需要先获取通过素材管理接口上传多媒体文件得到的MediaId,本节将实现素材管理接口。可以参考:公共平台开发者文档(项目github地址:https://github.com/Panfen/wem...)1.添加临时素材临时素材,顾名思义就是临时的,之后会被清空上传后的一段时间。适用于一些时间敏感的图形链接。临时素材注意事项:临时素材,每条素材(media_id)在开发者上传或粉丝发送到微信服务器3天后自动删除(所以用户发给开发者的素材要发如果开发者需要,请尽快下载到本地)以节省服务器资源。media_id是可重用的。素材格式和尺寸要求与公众平台官网一致。具体图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式,语音大小不超过5M,时长不超过60秒,支持mp3/wma/wav/amr格式,需要使用https调用该接口。请求地址:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE1.1实现uploadTempMaterial方法uploadTempMaterial用于上传临时素材,直接加入微信原型链:Wechat.prototype.uploadTempMaterial=function(type,filepath){varthat=this;varform={//构造表单media:fs.createReadStream(filepath)}returnnewPromise(function(resolve,reject){that.fetchAccessToken().then(function(data){varurl=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{thrownewError('上传素材失败!');}}).catch(function(err){reject(err);});});});}代码中的fetchAccessToken用于获取access_token,修改2号回复的代码:elseif(content==='2'){vardata=yieldwechatApi.uploadTempMaterial('image',__dirname+'/public/king.jpg');reply={type:'image',mediaId:data.media_id}}先上传一张本地图片到临时素材接口,获取media_id,封装在reply消息中。同样的方法也适用于语音、视频等:2.添加永久素材。永久素材会一直保存在微信后台服务器上。永不失败。永久素材有几个特点:添加的永久素材也可以在公众平台官网的素材管理模块中看到。永久素材有数量上限,请慎重添加。图文消息素材和图片素材上限为5000条,其他类型为1000条。素材格式和尺寸要求与公众平台官网一致。具体图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式,语音大小不超过5M,时长不超过60秒,支持mp3/wma/wav/amr格式调用这个接口需要添加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_TOKEN2.1实现uploadPermMaterial方法uploadPermMaterial和uploadTempMaterial方法基本类似,只是永久素材的上传分为三类,需要判断输入的类型。Wechat.prototype.uploadPermMaterial=function(type,material){varthat=this;varform={}varuploadUrl='';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);}returnnewPromise(function(resolve,reject){that.fetchAccessToken().then(function(data){varurl=uploadUrl+'access_token='+data.access_token;varopts={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{抛出newError('上传永久素材失败!');}}).catch(函数(错误){拒绝(错误);});});});}注:虽然实现了永久素材上传,但是测试账号并不是每次都能测试成功,未认证的订阅号不支持永久素材上传。3.获取素材链接由于获取临时素材和获取永久素材区别不大,所以直接在一个函数中完成。Wechat.prototype.getMaterial=function(mediaId,permanent){varthat=this;变种getUrl=永久?api.getPermMaterial:api.getTempMaterial;returnnewPromise(function(resolve,reject){that.fetchAccessToken().then(function(data){varurl=getUrl+'access_token='+data.access_token;if(!permanent)url+='&media_id='+mediaId;resolve(url)});});}4.删除永久素材删除永久素材比较简单,传入一个mediaId即可:Wechat.prototype.delMaterial=function(mediaId){varthat=this;returnnewPromise(function(resolve,reject){that.fetchAccessToken().then(function(data){varurl=api.delPermMaterial+'access_token='+data.access_token;varform={media_id:mediaId}请求({url:url,method:'POST',formData:form,json:true}).then(function(response){var_data=response.body;if(_data.errcode===0){resolve();}else{thrownewError('删除永久素材失败!');}}).catch(函数(错误){拒绝(错误);});});});}5.其他包括修改永久图片由于文本素材、获取素材总数、获取素材列表等功能在本项目中不会用到,所以不一一实现。
