微信获取素材接口地址:
https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=ACCESS_TOKEN
调用参数:
{
"type":TYPE,// 素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news)
"offset":OFFSET,//从全部素材的该偏移位置开始返回
"count":COUNT //返回素材的数量,取值在1到20之间
}
返回结构
{
"total_count": TOTAL_COUNT,//素材总数
"item_count": ITEM_COUNT,//当前数
"item": [{//素材列表
"media_id": MEDIA_ID,
"name": NAME,
"update_time": UPDATE_TIME,
"url":URL
},
]
}
获取公众号所有素材的思路:
count给最大值20,第一次调用获取total_count,利用total_count除以count获取剩余请求接口数,最后将数据写入数据库
以上操作都很正常,但是当查看数据库后发现 出现了N多name值为CropImage的图片,且素材库里面并没有这些图片,并且图片返回的还不完全
最终查出CropImage产生的原因
用户设置图文消息==>上传图片==>放入素材库==>微信根据传图大小剪裁==>生成多张名为CropImage的隐藏素材库图片
所以这些图片是上传图片的剪裁的一部分 但是这些CropImage的图片不会在素材库里面展示 并且也不占用total_count的个数,但是接口会反回这些数据,就问你坑不坑?更坑的是 当你删除图文消息,删除素材库里面的原图,这些CropImage依然存在于你的接口返回数据里面
最终由于返回图片数远大于total_count导致我的代码出现了bug,也产生了一些没有实际作用的图片,接下来放上优化后的代码
$api = 'https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=1';
$num = 20;
$type = 'image';
$data = ['type'=>$type,'offset'=>0,'count'=>$num];
$has = $i = 1;
$items = [];
while($has){
$data['offset'] = $num*($i-1);
$return = curlRequest($api,$data);//curlRequest封装一个culr方法
if($return['item_count']<$num){//返回数少于num数 则表示下面没有图片 终止循环
$has = 0;
}
if($return['item_count']>0){
$items = array_merge($items, $return['item']);
}
$i++;
}
$mediaData = [];
foreach($items as $item){
if(strtolower($item['name'])=='cropimage'){//放弃cropimage图片的存储
continue;
}
$mediaData[]=[
'app_id'=>$this->app_id,
'media_id'=>$item['media_id'],
'name'=>$item['name'],
'type'=>$type
];
}
save($mediaData);//数据写入
以上;