當(dāng)前位置:首頁 > IT技術(shù) > 微信平臺(tái) > 正文

C#開發(fā)微信門戶及應(yīng)用(26)-公眾號(hào)微信素材管理
2021-07-25 17:27:27

C#開發(fā)微信門戶及應(yīng)用(26)-公眾號(hào)微信素材管理

微信公眾號(hào)最新修改了素材的管理模式,提供了兩類素材的管理:臨時(shí)素材和永久素材的管理,原先的素材管理就是臨時(shí)素材管理,永久素材可以永久保留在微信服務(wù)器上,微信素材可以在上傳后,進(jìn)行圖片文件或者圖文消息的發(fā)送,關(guān)注的公眾號(hào)可以在素材有效期內(nèi)查看相關(guān)的資源,對(duì)于永久素材,那就不會(huì)存在過期的問題,只是純粹數(shù)量上限的限制。本文綜合兩方面進(jìn)行介紹素材管理的各種接口和實(shí)現(xiàn)。

微信公眾號(hào)最新修改了素材的管理模式,提供了兩類素材的管理:臨時(shí)素材和永久素材的管理,原先的素材管理就是臨時(shí)素材管理,永久素材可以永久保留在微信服務(wù)器上,微信素材可以在上傳后,進(jìn)行圖片文件或者圖文消息的發(fā)送,關(guān)注的公眾號(hào)可以在素材有效期內(nèi)查看相關(guān)的資源,對(duì)于永久素材,那就不會(huì)存在過期的問題,只是純粹數(shù)量上限的限制。本文綜合兩方面進(jìn)行介紹素材管理的各種接口和實(shí)現(xiàn)。

1、素材類型和功能點(diǎn)

關(guān)于素材的官方說明:

臨時(shí)素材:

公眾號(hào)經(jīng)常有需要用到一些臨時(shí)性的多媒體素材的場(chǎng)景,例如在使用接口特別是發(fā)送消息時(shí),對(duì)多媒體文件、多媒體消息的獲取和調(diào)用等操作,是通過media_id來進(jìn)行的。素材管理接口對(duì)所有認(rèn)證的訂閱號(hào)和服務(wù)號(hào)開放。通過本接口,公眾號(hào)可以新增臨時(shí)素材(即上傳臨時(shí)多媒體文件)。對(duì)于臨時(shí)素材,每個(gè)素材(media_id)會(huì)在開發(fā)者上傳或粉絲發(fā)送到微信服務(wù)器3天后自動(dòng)刪除。素材的格式大小等要求與公眾平臺(tái)官網(wǎng)一致。具體是,圖片大小不超過2M,支持bmp/png/jpeg/jpg/gif格式,語音大小不超過5M,長(zhǎng)度不超過60秒,支持mp3/wma/wav/amr格式。

永久素材:

除了3天就會(huì)失效的臨時(shí)素材外,開發(fā)者有時(shí)需要永久保存一些素材,屆時(shí)就可以通過本接口新增永久素材。新增的永久素材也可以在公眾平臺(tái)官網(wǎng)素材管理模塊中看到。永久素材的數(shù)量是有上限的,請(qǐng)謹(jǐn)慎新增。圖文消息素材和圖片素材的上限為5000,其他類型為1000。

?

素材管理包含了下面截圖的相關(guān)功能:

C#開發(fā)微信門戶及應(yīng)用(26)-公眾號(hào)微信素材管理_微信公眾平臺(tái)及門戶應(yīng)用

?

2、臨時(shí)素材的管理接口定義和實(shí)現(xiàn)?

我們定義一個(gè)IMediaApi接口,用來定義相關(guān)的接口處理。

1)上傳臨時(shí)文件

對(duì)于上傳臨時(shí)文件,官方的接口定義如下所示。

接口調(diào)用請(qǐng)求說明

http請(qǐng)求方式: POST/FORM,需使用https
https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
調(diào)用示例(使用curl命令,用FORM表單方式上傳一個(gè)多媒體文件):
curl -F media=@test.jpg "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE"

對(duì)于上傳臨時(shí)文件的處理,我們可以定義它的接口如下所示。

        /// <summary>
        /// 上傳的臨時(shí)多媒體文件。格式和大小限制,如下:
        /// 圖片(image): 1M,支持JPG格式
        /// 語音(voice):2M,播放長(zhǎng)度不超過60s,支持AMRMP3格式
        /// 視頻(video):10MB,支持MP4格式
        /// 縮略圖(thumb):64KB,支持JPG格式。
        /// 媒體文件在后臺(tái)保存時(shí)間為3天,即3天后media_id失效。
        /// </summary>
        /// <param name="accessToken">調(diào)用接口憑證</param>
        /// <param name="type">媒體文件類型,分別有圖片(image)、語音(voice)、視頻(video)和縮略圖(thumb)</param>
        /// <param name="file">form-data中媒體文件標(biāo)識(shí),有filename、filelength、content-type等信息</param>
        /// <returns></returns>
        UploadJsonResult UploadTempMedia(string accessToken, UploadMediaFileType type, string file);

根據(jù)官方接口的說明,我們需要上傳一個(gè)文件,并指定它的類型TYPE就可以了。

具體代碼如下所示。

        public UploadJsonResult UploadTempMedia(string accessToken, UploadMediaFileType type, string file)
        {
            string url = string.Format("http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token={0}&type={1}", accessToken, type.ToString());

            UploadJsonResult result = JsonHelper<UploadJsonResult>.PostFile(url, file);
            return result;
        }

其中JsonHelper類的PostFile就是發(fā)送一個(gè)文件流,我們進(jìn)一步可以看它的實(shí)現(xiàn)思路如下所示。

        /// <summary>
        /// 提交文件并解析返回的結(jié)果
        /// </summary>
        /// <param name="url">提交文件數(shù)據(jù)的鏈接地址</param>
        /// <param name="file">文件地址</param>
        /// <returns></returns>
        public static T PostFile(string url, string file, NameValueCollection nvc = null)
        {
            HttpHelper helper = new HttpHelper();
            string content = helper.PostStream(url, new string[] { file }, nvc);
            VerifyErrorCode(content);

            T result = JsonConvert.DeserializeObject<T>(content);
            return result;
        }

上面代碼主要就是通過POST一個(gè)文件流,并獲得響應(yīng)的結(jié)果字符串內(nèi)容,然后我們分析其中是否有錯(cuò)誤代碼,如果沒有,我們把字符串結(jié)果解析為對(duì)應(yīng)的實(shí)體對(duì)象就可以了。

其中返回結(jié)果的實(shí)體類信息UploadJsonResult的類定義如下所示。

    /// <summary>
    /// 上傳多媒體文件的返回結(jié)果
    /// </summary>
    public class UploadJsonResult : BaseJsonResult
    {
        /// <summary>
        /// 媒體文件類型,分別有圖片(image)、語音(voice)、視頻(video)和縮略圖(thumb,主要用于視頻與音樂格式的縮略圖)
        /// </summary>
        public UploadMediaFileType type { get; set; }

        /// <summary>
        /// 媒體文件上傳后,獲取時(shí)的唯一標(biāo)識(shí)
        /// </summary>
        public string media_id { get; set; }

        /// <summary>
        /// 媒體文件上傳時(shí)間戳
        /// </summary>
        public long created_at { get; set; }
    }

這個(gè)接口的調(diào)用實(shí)例代碼如下所示。

        private void btnUpload_Click(object sender, EventArgs e)
        {
            string file = FileDialogHelper.OpenImage(false);
            if (!string.IsNullOrEmpty(file))
            {
                IMediaApi mediaBLL = new MediaApi();
                UploadJsonResult result = mediaBLL.UploadTempMedia(token, UploadMediaFileType.image, file);
                if (result != null)
                {
                    this.image_mediaId = result.media_id;
                    Console.WriteLine("{0} {1}", result.media_id, result.created_at);
                }
                else
                {
                    Console.WriteLine("上傳文件失敗");
                }
            }
        }

?

2)獲取臨時(shí)素材文件

上傳文件是上傳一個(gè)文件流,并獲得對(duì)應(yīng)的返回結(jié)果,主要就是一個(gè)media_Id的內(nèi)容;而獲取素材文件則是一個(gè)逆過程,通過一個(gè)media_id的參數(shù)獲取一個(gè)文件流保存到本地的過程。

獲取臨時(shí)文件接口的官方定義如下所示。

接口調(diào)用請(qǐng)求說明

http請(qǐng)求方式: GET,https調(diào)用
https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
請(qǐng)求示例(示例為通過curl命令獲取多媒體文件)
curl -I -G "https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID"

對(duì)于獲取臨時(shí)文件,我們定義的接口如下所示。

        /// <summary>
        /// 獲取臨時(shí)素材
        /// </summary>
        /// <param name="accessToken">調(diào)用接口憑證</param>
        /// <param name="mediaId">媒體文件ID</param>
        /// <param name="stream"></param>
        Stream GetTempMedia(string accessToken, string mediaId, ref string fileName);

我們獲得文件流的同時(shí),也返回一個(gè)文件名參數(shù)(不過一般情況下,我們獲取不到文件名)。

它的實(shí)現(xiàn)代碼如下所示,主要邏輯就是解析返回結(jié)果,獲取返回的文件流。

        /// <summary>
        /// 獲取臨時(shí)素材
        /// </summary>
        /// <param name="accessToken">調(diào)用接口憑證</param>
        /// <param name="mediaId">媒體文件ID</param>
        /// <param name="stream"></param>
        public Stream GetTempMedia(string accessToken, string mediaId, ref string fileName)
        {
            string url = string.Format("http://file.api.weixin.qq.com/cgi-bin/media/get?access_token={0}&media_id={1}", accessToken, mediaId);

            HttpHelper helper = new HttpHelper();
            Stream stream = helper.GetStream(url, ref fileName, null);
            return stream;
        }

獲取素材文件的實(shí)例代碼如下所示。

        private void btnDownload_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(image_mediaId))
            {
                IMediaApi mediaBLL = new MediaApi();

                string fileName = "";
                Stream stream = mediaBLL.GetTempMedia(token, image_mediaId, ref fileName);
                if (stream != null)
                {
                    string filePath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, fileName);
                    using (var fileStream = File.Create(filePath))
                    {
                        byte[] buffer = new byte[1024];
                        int bytesRead = 0;
                        while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0)
                        {
                            fileStream.Write(buffer, 0, bytesRead);
                        }
                        fileStream.Flush();
                    }
                    stream.Close();
                }
                Console.WriteLine("下載文件:" + (File.Exists(fileName) ? "成功" : "失敗"));
            }
        }

?

3、永久素材的管理接口定義和實(shí)現(xiàn)?

根據(jù)官方接口的描述,我們可以把新增永久素材接口定義為三種:新增圖文素材、其他類型永久素材和視頻素材三種接口。

1)新增永久圖文素材

接口調(diào)用請(qǐng)求說明

http請(qǐng)求方式: POST
https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=ACCESS_TOKEN

調(diào)用示例

{
  "articles": [{
       "title": TITLE,
       "thumb_media_id": THUMB_MEDIA_ID,
       "author": AUTHOR,
       "digest": DIGEST,
       "show_cover_pic": SHOW_COVER_PIC(0 / 1),
       "content": CONTENT,
       "content_source_url": CONTENT_SOURCE_URL
    },
    //若新增的是多圖文素材,則此處應(yīng)還有幾段articles結(jié)構(gòu)
 ]
}

2)新增其他類型永久素材

接口調(diào)用請(qǐng)求說明

通過POST表單來調(diào)用接口,表單id為media,包含需要上傳的素材內(nèi)容,有filename、filelength、content-type等信息。請(qǐng)注意:圖片素材將進(jìn)入公眾平臺(tái)官網(wǎng)素材管理模塊中的默認(rèn)分組。

http請(qǐng)求方式: POST
http://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN
調(diào)用示例(使用curl命令,用FORM表單方式新增一個(gè)其他類型的永久素材):
curl -F media=@test.jpg "http://file.api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN"

3)新增永久視頻素材

在上傳視頻素材時(shí)需要POST另一個(gè)表單,id為description,包含素材的描述信息,內(nèi)容格式為JSON,格式如下:

{
  "title":VIDEO_TITLE,
  "introduction":INTRODUCTION
}

新增永久視頻素材的調(diào)用示例:

curl "http://file.api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN" -F media=@media.file -F  description='{"title":VIDEO_TITLE, "introduction":INTRODUCTION}'

?

根據(jù)上面的說明,我們定義新增永久圖文素材的接口代碼如下所示。

        /// <summary>
        /// 新增永久圖文素材
        /// </summary>
        /// <param name="accessToken">調(diào)用接口憑證</param>
        /// <param name="newsList">圖文消息組</param>
        /// <returns></returns>
        MaterialResult UploadMaterialNews(string accessToken, List<NewsUploadJson> newsList);

定義新增其他永久素材接口如下:

        /// <summary>
        /// 新增其他類型永久素材(圖片(image)、語音(voice)和縮略圖(thumb))
        /// </summary>
        /// <param name="accessToken">調(diào)用接口憑證</param>
        /// <param name="type">媒體文件類型,分別有圖片(image)、語音(voice)、視頻(video)和縮略圖(thumb)</param>
        /// <param name="file">form-data中媒體文件標(biāo)識(shí),有filename、filelength、content-type等信息</param>
        /// <returns></returns>
        MaterialResult UploadMaterialMedia(string accessToken, UploadMediaFileType type, string file);

定義新增視頻永久素材接口如下所示:

        /// <summary>
        /// 在上傳視頻素材時(shí)需要POST另一個(gè)表單,id為description,包含素材的描述信息,內(nèi)容格式為JSON.
        /// </summary>
        /// <param name="accessToken">調(diào)用接口憑證</param>
        /// <param name="file">form-data中媒體文件標(biāo)識(shí),有filename、filelength、content-type等信息</param>
        /// <param name="title">視頻標(biāo)題</param>
        /// <param name="introduction">視頻描述</param>
        /// <returns></returns>
        MaterialResult UploadMaterialVideo(string accessToken, string file, string title, string introduction);

這幾個(gè)接口都沒有太多難度,不過在微信接口討論組里面,很多人對(duì)于上傳永久素材的操作總是不成功,覺得可能是微信API本身的問題,其實(shí)不然,這個(gè)接口我還是測(cè)試通過了,并且在服務(wù)器上看到對(duì)應(yīng)的素材信息,具體我們來看看上傳其他類型素材的接口實(shí)現(xiàn)代碼。

        /// <summary>
        /// 新增其他類型永久素材(圖片(image)、語音(voice)和縮略圖(thumb))
        /// </summary>
        /// <param name="accessToken">調(diào)用接口憑證</param>
        /// <param name="type">媒體文件類型,分別有圖片(image)、語音(voice)、視頻(video)和縮略圖(thumb)</param>
        /// <param name="file">form-data中媒體文件標(biāo)識(shí),有filename、filelength、content-type等信息</param>
        /// <returns></returns>
        public MaterialResult UploadMaterialMedia(string accessToken, UploadMediaFileType type, string file)
        {
            string url = string.Format("http://api.weixin.qq.com/cgi-bin/material/add_material?access_token={0}&type={1}", accessToken, type.ToString());

            MaterialResult result = JsonHelper<MaterialResult>.PostFile(url, file);
            return result;
        }

注意這個(gè)URL是http而不是https,有點(diǎn)特殊。

另外,我們?cè)谑褂肞OST文件流的時(shí)候,HttpWebRequest對(duì)象的內(nèi)容一定要設(shè)置好,主要是需要和微信定義的media這個(gè)保持一直才可以。如下是HttpHelper 輔助類里面的PostStream的部分代碼,供參考。

C#開發(fā)微信門戶及應(yīng)用(26)-公眾號(hào)微信素材管理_編程_02

永久素材上傳后的結(jié)果可以在微信公眾號(hào)后臺(tái)進(jìn)行查看到,具體界面如下所示。

C#開發(fā)微信門戶及應(yīng)用(26)-公眾號(hào)微信素材管理_微信公眾平臺(tái)及門戶應(yīng)用_03

對(duì)于永久素材的接口,我們還可以根據(jù)微信API的要求,完善永久素材的更新、刪除、獲取素材,以及獲取素材總數(shù)、獲取圖文素材列表等功能,由于大多數(shù)操作類似,不需要一一列出,希望再次拋磚引玉,使得大家能夠更好了解、利用好微信公眾號(hào)的素材管理接口,從而實(shí)現(xiàn)我們更加豐富的數(shù)據(jù)管理。

?

C#開發(fā)微信門戶及應(yīng)用(26)-公眾號(hào)微信素材管理_微信公眾平臺(tái)及門戶應(yīng)用_04主要研究技術(shù):代碼生成工具、會(huì)員管理系統(tǒng)、客戶關(guān)系管理軟件、病人資料管理軟件、Visio二次開發(fā)、酒店管理系統(tǒng)、倉庫管理系統(tǒng)等共享軟件開發(fā)
專注于Winform開發(fā)框架/混合式開發(fā)框架、Web開發(fā)框架、Bootstrap開發(fā)框架、微信門戶開發(fā)框架的研究及應(yīng)用。
??轉(zhuǎn)載請(qǐng)注明出處:
C#開發(fā)微信門戶及應(yīng)用(26)-公眾號(hào)微信素材管理_微信公眾平臺(tái)及門戶應(yīng)用_04撰寫人:伍華聰? ?

本文摘自 :https://blog.51cto.com/w

開通會(huì)員,享受整站包年服務(wù)立即開通 >