新增永久素材
除了3天就会失效的临时素材外,开发者有时需要永久保存一些素材,届时就可以通过本接口新增永久素材。
最近更新,永久图片素材新增后,将带有URL返回给开发者,开发者可以在腾讯系域名内使用(腾讯系域名外使用,图片将被屏蔽)。
请注意:
新增的永久素材也可以在公众平台官网素材管理模块中看到
永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000
素材的格式大小等要求与公众平台官网一致。具体是,图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒(公众平台官网可以在文章中插入小于30分钟的语音,但这些语音不能用于群发等场景,只能放在文章内,这方面接口暂不支持),支持mp3/wma/wav/amr格式
调用该接口需https协议
接口调用请求说明
http请求方式: POST
https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=ACCESS_TOKEN
调用示例
{
"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, //图文消息的具体内容
"content_source_url": CONTENT_SOURCE_URL //图文消息的原文地址
},
//若新增的是多图文素材,则此处应有几段articles结构,最多8段
]
}
返回说明
{
"media_id":MEDIA_ID //返回的即为新增的图文消息素材的media_id。
}
以上是微信开发者文档里面的原文
下面讲述一下我在做添加素材是遇到的问题和解决方案仅供参考:
- THUMB_MEDIA_ID(图文消息的封面图片素材id)是哪里来的?
- 接口调用请求是不是用普通的爬虫抓取就可以抓取到?
首先我们来解决第一个问题:
接口调用请求说明
通过POST表单来调用接口,表单id为media,包含需要上传的素材内容,有filename、filelength、content-type等信息。请注意:图片素材将进入公众平台官网素材管理模块中的默认分组。
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)调用示例(使用curl命令,用FORM表单方式新增一个其他类型的永久素材,curl命令的使用请自行查阅资料)
```
**参数说明:**
![](http://upload-images.jianshu.io/upload_images/2509925-2bccff6a5a0fdabf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
以上是[微信开发者文档](https://mp.weixin.qq.com/wiki/10/10ea5a44870f53d79449290dfd43d006.html)里面的原文
当我看到这里的时候,感觉还是一头雾水:首先参数是以什么形式发送到微信服务器做请求参数的,其二media(form-data中媒体文件标识)是直接传一个file文件?
然而我按照这个思路写啦好多代码都没有解决掉,因为从同到尾都错了;最后我还是费了好大时间找到了微信的c#SDK借用了里面封装的方法来解决了这个问题:
> ###### 具体实现
要用微信SDK里面的方法首先需要引用dll文件,在我的百度云盘里面有http://pan.baidu.com/s/1geO3bYN 。
```
//上传图片调用方法
var uploadResult = Senparc.Weixin.MP.AdvancedAPIs.Media.MediaApi.UploadForeverMedia(token, imagePath);
返回一个类:
striing THUMB_MEDIA_ID = uploadResult.media_id;
```
到这里已经获得到了THUMB_MEDIA_ID
接下来就是调用接口去上传素材:着这里我用自己写的抓取没成功,然后调用的是SDK里面的具体实现如下:
```
//首先按照格式拼接json
string json ="{\"articles\": [{\"title\":\"标题\",\"thumb_media_id\":\"THUMB_MEDIA_ID\",\"author\":\"作者\",\"digest\":\"图文消息的摘要\",\"show_cover_pic\": \"1\",\"content\":\"图文消息的具体内容\",\"content_source_url\": \"图文消息的原文地址\"},{\"title\":\"标题2\",\"thumb_media_id\":\"THUMB_MEDIA_ID\",\"author\":\"作者\",\"digest\":\"图文消息的摘要\",\"show_cover_pic\": \"1\",\"content\":\"图文消息的具体内容\",\"content_source_url\": \"图文消息的原文地址\"}]}";
string result = HttpService.Post(json, "https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=" + accessToken + "", false, 60);
正确情况下的返回JSON数据包示例如下
{"errcode":0,"media_id":"**************"}
```
> ###### POST方法
```
public static string Post(string xml, string url, bool isUseCert, int timeout)
{
System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接
string result = "";//返回结果
HttpWebRequest request = null;
HttpWebResponse response = null;
Stream reqStream = null;
try
{
//设置最大连接数
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(); //定义一个网关对象
//proxy.Address = new Uri(WxPayConfig.PROXY_URL); //网关服务器端口:端口
//request.Proxy = proxy;
//设置POST的数据类型和长度
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);
}
//往服务器写入数据
reqStream = request.GetRequestStream();
reqStream.Write(data, 0, data.Length);
reqStream.Close();
//获取服务端返回
response = (HttpWebResponse)request.GetResponse();
//获取服务端返回数据
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;}
批量修改永久素材
大多数人在第一次做批量修改素材是都会犯一个致命的错误,那就是在拼接参数的时候故意拼成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
}
}
```