php实现公众号文章图片去重,轻松抓取高清美图
优采云 发布时间: 2023-04-22 03:56作为一名自媒体人,我们经常需要从微信公众号上抓取文章,但是如果直接下载所有图片,可能会出现重复的情况。那么如何去重呢?今天,笔者就来介绍一下php抓取公众号文章图片去重的方法。
一、准备工作
在开始之前,我们需要安装php环境和相关的扩展库。这里我使用的是php7和curl扩展库。同时,我们还需要获取微信公众号的cookie和token信息。具体获取方法可以参考优采云(www.ucaiyun.com)的相关教程。
二、获取文章列表
首先,我们需要从微信公众号上获取文章列表。这里,我们可以使用curl库发送http请求,然后解析返回的json数据。具体代码如下:
<?php
//设置请求地址
$url ="https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz=MzU2NzA2MDk5MQ==&f=json&offset=0&count=10&is_ok=1&scene=124&uin=777&key=777&pass_ticket=uKjJZVQzm8FvnbuV7c%2Bjy3qf8rT9rOQd%2FZuWkfM8OvRbiYtY1Dp6GqW8nTg9rLs%2B&wxtoken=&appmsg_token=1155_qKjJZVQzm8FvnbuV7c-jy3qf8rT9rOQd_cba0c24e593b986200c12fd327b537c0-";
//设置请求头
$header = array(
"Host: mp.weixin.qq.com",
"Connection: keep-alive",
"User-Agent:a9694ebf4d02ef427830292349e3172c/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",
"X-Requested-With: XMLHttpRequest",
"Referer: https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU2NzA2MDk5MQ==&scene=124&devicetype=Windows+10&version=62080079&lang=zh_CN&ascene=1&winzoom=1",
"Accept-Encoding: gzip, deflate, br",
"Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7"
);
//发送http请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
$response = curl_exec($ch);
curl_close($ch);
//解析json数据
$json = json_decode($response, true);
$articles =$json["general_msg_list"]["list"];
?>
三、获取文章内容
接下来,我们需要从文章列表中获取每篇文章的链接,然后再次发送http请求获取文章内容。这里,我们同样可以使用curl库发送http请求,然后解析返回的html数据。具体代码如下:
<?php
foreach ($articles as $article){
//获取文章链接
$url =$article["app_msg_ext_info"]["content_url"];
if (strpos($url,"http")=== false){
$url ="https://mp.weixin.qq.com".$url;
}
//发送http请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIE,"cookie");
curl_setopt($ch, CURLOPT_REFERER,"https://mp.weixin.qq.com/");
$response = curl_exec($ch);
curl_close($ch);
//解析html数据
$doc = new DOMDocument();
@$doc->loadHTML($response);
$imgs =$doc->getElementsByTagName("img");
//下载图片并去重
foreach ($imgs as $img){
//获取图片链接
$src =$img->getAttribute("8d777f385d3dfec8815d20f7496026dc-src");
if (empty($src)){
$src =$img->getAttribute("src");
}
//下载图片
if (!empty($src)){
$filename = basename(parse_url($src)["path"]);
if (!file_exists($filename)){
file_put_contents($filename, file_get_contents($src));
}
}
}
}
?>
四、去重处理
最后,我们需要对下载的图片进行去重处理。这里,我们可以使用md5函数对每张图片进行哈希计算,并将结果保存到一个数组中。具体代码如下:
<?php
$hashes = array();
foreach ($imgs as $img){
//获取图片链接
$src =$img->getAttribute("8d777f385d3dfec8815d20f7496026dc-src");
if (empty($src)){
$src =$img->getAttribute("src");
}
//下载图片并去重
if (!empty($src)){
$filename = basename(parse_url($src)["path"]);
$hash = md5_file($filename);
if (!in_f1f713c9e000f5d3f280adbd124df4f5($hash,$hashes)){
array_push($hashes,$hash);
file_put_contents($filename, file_get_contents($src));
}
}
}
?>
五、总结
通过上述方法,我们可以轻松地从微信公众号上抓取文章,并对其中的图片进行去重处理。同时,我们还可以根据需要对代码进行优化和扩展,以提高效率和功能性。
本文由优采云(www.ucaiyun.com)原创,旨在为广大自媒体人提供有用的工具和技巧,帮助大家更加便捷地进行文章创作和发布。