詳解nodejs微信公眾號開發(fā)——5.素材管理接口
上一篇文章:nodejs微信公眾號開發(fā)——4.自動回復(fù)各種消息,我們實現(xiàn)了被動回復(fù)文字和圖文,回復(fù)圖片失敗,因為需要先獲取通過素材管理接口上傳多媒體文件而得到的MediaId,這一節(jié)們就來實現(xiàn)素材管理的接口。可參看:公眾平臺開發(fā)者文檔
1. 新增臨時素材
臨時素材顧名思義是臨時的,上傳后一定時間就被清理掉,適用于一些有時效性的圖文鏈接。關(guān)于臨時素材需要注意的點:
- 對于臨時素材,每個素材(media_id)會在開發(fā)者上傳或粉絲發(fā)送到微信服務(wù)器3天后自動刪除(所以用戶發(fā)送給開發(fā)者的素材,若開發(fā)者需要,應(yīng)盡快下載到本地),以節(jié)省服務(wù)器資源。
- media_id是可復(fù)用的。
- 素材的格式大小等要求與公眾平臺官網(wǎng)一致。具體是,圖片大小不超過2M,支持bmp/png/jpeg/jpg/gif格式,語音大小不超過5M,長度不超過60秒,支持mp3/wma/wav/amr格式
- 需使用https調(diào)用本接口。
請求地址:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
1.1 實現(xiàn)uploadTempMaterial方法
uploadTempMaterial
是用來上傳臨時素材,直接在Wechat的原型鏈上添加:
Wechat.prototype.uploadTempMaterial = function(type,filepath){ var that = this; var form = { //構(gòu)造表單 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
,修改回復(fù)數(shù)字2
的代碼:
else if(content === '2'){ var data = yield wechatApi.uploadTempMaterial('image',__dirname+'/public/king.jpg'); reply = { type:'image', mediaId:data.media_id } }
先將本地的一張圖片上傳到臨時素材接口,獲取media_id,封裝到回復(fù)消息里面去。同樣的方法適用于語音,視頻等:
2. 新增永久素材
永久素材回永遠(yuǎn)存儲在微信后臺服務(wù)器上,永不失效。關(guān)于永久素材有一下幾個特點:
- 新增的永久素材也可以在公眾平臺官網(wǎng)素材管理模塊中看到
- 永久素材的數(shù)量是有上限的,請謹(jǐn)慎新增。圖文消息素材和圖片素材的上限為5000,其他類型為1000
- 素材的格式大小等要求與公眾平臺官網(wǎng)一致。具體是,圖片大小不超過2M,支持bmp/png/jpeg/jpg/gif格式,語音大小不超過5M,長度不超過60秒,支持mp3/wma/wav/amr格式
- 調(diào)用該接口需https協(xié)議
新增永久圖文素材請求地址: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 實現(xiàn)uploadPermMaterial方法
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); //上傳數(shù)據(jù)的方式不同 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); }); }); }); }
注
:雖然實現(xiàn)了永久素材上傳,但是測試賬號也不是每一次都能測試成功,未經(jīng)過認(rèn)證的訂閱號也不支持永久素材的上傳。
3. 獲取素材鏈接
由于獲取臨時素材和獲取永久素材的差異性不大,直接放在一個函數(shù)里完成。
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.其他
還有修改永久圖文素材
、獲取素材總數(shù)
、獲取素材列表
功能由于本項目中不會用到,就不一一實現(xiàn)了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
教你如何用Node實現(xiàn)API的轉(zhuǎn)發(fā)(某音樂)
這篇文章主要介紹了教你如何用Node實現(xiàn)API的轉(zhuǎn)發(fā)(某音樂),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09node.js中的console.timeEnd方法使用說明
這篇文章主要介紹了node.js中的console.timeEnd方法使用說明,本文介紹了console.timeEnd的方法說明、語法、使用實例和實現(xiàn)源碼,需要的朋友可以參考下2014-12-12通過NodeJS輕松使用GRPC和協(xié)議緩沖區(qū)的方法
本文介紹了GRPC和協(xié)議緩沖區(qū)的基本概念,并展示了如何在NodeJS應(yīng)用程序中使用它們,GRPC是一個高性能RPC框架,協(xié)議緩沖區(qū)則用于定義服務(wù)和序列化消息,本文給大家介紹如何在NodeJS應(yīng)用程序中使用GRPC和協(xié)議緩沖區(qū),感興趣的朋友一起看看吧2024-10-10NPM配置私服構(gòu)建內(nèi)網(wǎng)中央倉庫過程詳解
這篇文章主要為大家介紹了NPM配置私服構(gòu)建內(nèi)網(wǎng)中央倉庫過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08