上一篇文章:nodejs微信公衆號開發——4.自動回覆各類消息,咱們實現了被動回覆文字和圖文,回覆圖片失敗,由於須要先獲取經過素材管理接口上傳多媒體文件而獲得的
MediaId
,這一節們就來實現素材管理的接口。可參看:公衆平臺開發者文檔 (項目github地:https://github.com/Panfen/wem... )html
臨時素材顧名思義是臨時的,上傳後必定時間就被清理掉,適用於一些有時效性的圖文連接。關於臨時素材須要注意的點:node
請求地址:git
https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
uploadTempMaterial
是用來上傳臨時素材,直接在Wechat的原型鏈上添加:github
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
的代碼:json
else if(content === '2'){ var data = yield wechatApi.uploadTempMaterial('image',__dirname+'/public/king.jpg'); reply = { type:'image', mediaId:data.media_id } }
先將本地的一張圖片上傳到臨時素材接口,獲取media_id,封裝到回覆消息裏面去。一樣的方法適用於語音,視頻等:segmentfault
永久素材回永遠存儲在微信後臺服務器上,永不失效。關於永久素材有一下幾個特色:api
新增永久圖文素材請求地址:服務器
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
uploadPermMaterial
和uploadTempMaterial
方法基本是相似的,只是永久素材的的上傳分爲三類,須要判斷一下傳入的類型。
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); }); }); }); }
注:
雖然實現了永久素材上傳,可是測試帳號也不是每一次都能測試成功,未通過認證的訂閱號也不支持永久素材的上傳。
因爲獲取臨時素材和獲取永久素材的差別性不大,直接放在一個函數裏完成。
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) }); }); }
刪除永久素材就比較簡單了,只需傳入一個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); }); }); }); }
還有修改永久圖文素材
、獲取素材總數
、獲取素材列表
功能因爲本項目中不會用到,就不一一實現了。