微信素材管理——批量添加、修改永久素材

新增永久素材

除了3天就会失效的临时素材外,开发者有时需要永久保存一些素材,届时就可以通过本接口新增永久素材。

最近更新,永久图片素材新增后,将带有URL返回给开发者,开发者可以在腾讯系域名内使用(腾讯系域名外使用,图片将被屏蔽)。

请注意:

  1. 新增的永久素材也可以在公众平台官网素材管理模块中看到

  2. 永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000

  3. 素材的格式大小等要求与公众平台官网一致。具体是,图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒(公众平台官网可以在文章中插入小于30分钟的语音,但这些语音不能用于群发等场景,只能放在文章内,这方面接口暂不支持),支持mp3/wma/wav/amr格式

  4. 调用该接口需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。
}

以上是微信开发者文档里面的原文


下面讲述一下我在做添加素材是遇到的问题和解决方案仅供参考:

  1. THUMB_MEDIA_ID(图文消息的封面图片素材id)是哪里来的?
  2. 接口调用请求是不是用普通的爬虫抓取就可以抓取到?
首先我们来解决第一个问题:

接口调用请求说明

通过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
    }
}
```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容