新增永久素材
除了3天就會失效的臨時素材外撤缴,開發(fā)者有時需要永久保存一些素材,屆時就可以通過本接口新增永久素材叽唱。
最近更新屈呕,永久圖片素材新增后,將帶有URL返回給開發(fā)者棺亭,開發(fā)者可以在騰訊系域名內(nèi)使用(騰訊系域名外使用虎眨,圖片將被屏蔽)。
請注意:
新增的永久素材也可以在公眾平臺官網(wǎng)素材管理模塊中看到
永久素材的數(shù)量是有上限的镶摘,請謹慎新增嗽桩。圖文消息素材和圖片素材的上限為5000,其他類型為1000
素材的格式大小等要求與公眾平臺官網(wǎng)一致凄敢。具體是碌冶,圖片大小不超過2M,支持bmp/png/jpeg/jpg/gif格式贡未,語音大小不超過5M种樱,長度不超過60秒(公眾平臺官網(wǎng)可以在文章中插入小于30分鐘的語音,但這些語音不能用于群發(fā)等場景俊卤,只能放在文章內(nèi)嫩挤,這方面接口暫不支持),支持mp3/wma/wav/amr格式
調(diào)用該接口需https協(xié)議
接口調(diào)用請求說明
http請求方式: 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, //圖文消息的封面圖片素材id(必須是永久mediaID)
"author": AUTHOR, //作者
"digest": DIGEST, //圖文消息的摘要
"show_cover_pic": SHOW_COVER_PIC(0 / 1), //是否顯示封面
"content": CONTENT, //圖文消息的具體內(nèi)容
"content_source_url": CONTENT_SOURCE_URL //圖文消息的原文地址
},
//若新增的是多圖文素材消恍,則此處應有幾段articles結(jié)構岂昭,最多8段
]
}
返回說明
{
"media_id":MEDIA_ID //返回的即為新增的圖文消息素材的media_id。
}
以上是微信開發(fā)者文檔里面的原文
下面講述一下我在做添加素材是遇到的問題和解決方案僅供參考:
- THUMB_MEDIA_ID(圖文消息的封面圖片素材id)是哪里來的狠怨?
- 接口調(diào)用請求是不是用普通的爬蟲抓取就可以抓取到约啊?
首先我們來解決第一個問題:
接口調(diào)用請求說明
通過POST表單來調(diào)用接口邑遏,表單id為media,包含需要上傳的素材內(nèi)容恰矩,有filename记盒、filelength、content-type等信息外傅。請注意:圖片素材將進入公眾平臺官網(wǎng)素材管理模塊中的默認分組纪吮。
http請求方式: POST,需使用https[https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN](https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN)調(diào)用示例(使用curl命令萎胰,用FORM表單方式新增一個其他類型的永久素材碾盟,curl命令的使用請自行查閱資料)
```
**參數(shù)說明:**

以上是[微信開發(fā)者文檔](https://mp.weixin.qq.com/wiki/10/10ea5a44870f53d79449290dfd43d006.html)里面的原文
當我看到這里的時候,感覺還是一頭霧水:首先參數(shù)是以什么形式發(fā)送到微信服務器做請求參數(shù)的技竟,其二media(form-data中媒體文件標識)是直接傳一個file文件冰肴?
然而我按照這個思路寫啦好多代碼都沒有解決掉,因為從同到尾都錯了榔组;最后我還是費了好大時間找到了微信的c#SDK借用了里面封裝的方法來解決了這個問題:
> ###### 具體實現(xiàn)
要用微信SDK里面的方法首先需要引用dll文件熙尉,在我的百度云盤里面有http://pan.baidu.com/s/1geO3bYN 。
```
//上傳圖片調(diào)用方法
var uploadResult = Senparc.Weixin.MP.AdvancedAPIs.Media.MediaApi.UploadForeverMedia(token, imagePath);
返回一個類:
striing THUMB_MEDIA_ID = uploadResult.media_id;
```
到這里已經(jīng)獲得到了THUMB_MEDIA_ID
接下來就是調(diào)用接口去上傳素材:著這里我用自己寫的抓取沒成功瓷患,然后調(diào)用的是SDK里面的具體實現(xiàn)如下:
```
//首先按照格式拼接json
string json ="{\"articles\": [{\"title\":\"標題\",\"thumb_media_id\":\"THUMB_MEDIA_ID\",\"author\":\"作者\",\"digest\":\"圖文消息的摘要\",\"show_cover_pic\": \"1\",\"content\":\"圖文消息的具體內(nèi)容\",\"content_source_url\": \"圖文消息的原文地址\"},{\"title\":\"標題2\",\"thumb_media_id\":\"THUMB_MEDIA_ID\",\"author\":\"作者\",\"digest\":\"圖文消息的摘要\",\"show_cover_pic\": \"1\",\"content\":\"圖文消息的具體內(nèi)容\",\"content_source_url\": \"圖文消息的原文地址\"}]}";
string result = HttpService.Post(json, "https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=" + accessToken + "", false, 60);
正確情況下的返回JSON數(shù)據(jù)包示例如下
{"errcode":0,"media_id":"**************"}
```
> ###### POST方法
```
public static string Post(string xml, string url, bool isUseCert, int timeout)
{
System.GC.Collect();//垃圾回收骡尽,回收沒有正常關閉的http連接
string result = "";//返回結(jié)果
HttpWebRequest request = null;
HttpWebResponse response = null;
Stream reqStream = null;
try
{
//設置最大連接數(shù)
ServicePointManager.DefaultConnectionLimit = 200;
//設置https驗證方式
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(CheckValidationResult);
}
/***************************************************************
* 下面設置HttpWebRequest的相關屬性
* ************************************************************/
request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.Timeout = timeout * 1000;
//設置代理服務器
//WebProxy proxy = new WebProxy(); //定義一個網(wǎng)關對象
//proxy.Address = new Uri(WxPayConfig.PROXY_URL); //網(wǎng)關服務器端口:端口
//request.Proxy = proxy;
//設置POST的數(shù)據(jù)類型和長度
request.ContentType = "text/xml";
byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
request.ContentLength = data.Length;
//是否使用證書
if (isUseCert)
{
string path = HttpContext.Current.Request.PhysicalApplicationPath;
X509Certificate2 cert = new X509Certificate2(path + WxPayConfig.SSLCERT_PATH, WxPayConfig.SSLCERT_PASSWORD);
request.ClientCertificates.Add(cert);
}
//往服務器寫入數(shù)據(jù)
reqStream = request.GetRequestStream();
reqStream.Write(data, 0, data.Length);
reqStream.Close();
//獲取服務端返回
response = (HttpWebResponse)request.GetResponse();
//獲取服務端返回數(shù)據(jù)
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
result = sr.ReadToEnd().Trim();
sr.Close();
}
catch (System.Threading.ThreadAbortException e)
{
System.Threading.Thread.ResetAbort();
}
catch (WebException e)
{
if (e.Status == WebExceptionStatus.ProtocolError)
{
}
}
catch (Exception e)
{
}
finally
{
//關閉連接和流
if (response != null)
{
response.Close();
}
if(request != null)
{
request.Abort();
}
}
return result;}
批量修改永久素材
大多數(shù)人在第一次做批量修改素材是都會犯一個致命的錯誤,那就是在拼接參數(shù)的時候故意拼成JSON格式擅编,導致請求服務器時返回錯誤信息攀细;其實在拼接字符串時只要按格式拼接對字符串就一切OK了:
{
"media_id":MEDIA_ID,
"index":INDEX,
"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
}, {
"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
}
}
```