当前位置:网站首页 >  攻略

PHPCMS V9/V10 采集远程图片失效的三种核心场景及完整修复步骤

时间:2026年05月23日 20:30:09 来源:易频IT社区

场景一:开启HTTPS后采集HTTP/HTTPS图片全失败

这是最常见的失效场景,PHPCMS默认CURL不支持SSL证书验证跳过,同时部分老版默认CURL参数缺失。

第一步:找到采集图片的核心函数文件

打开网站根目录下的 /phpcms/modules/content/classes/attachment.class.php

第二步:定位并修改down_file函数

找到约150-200行的 down_file 函数(不同小版本行数略有差异,搜索function down_file即可),替换整个函数为以下完整代码:

```php function down_file($url, $filename = '', $dir = '') { if (empty($url)) return false; if (empty($dir)) $dir = $this->updir; if (!is_dir(PHPCMS_PATH.$dir)) { pc_base::load_sys_class('dir', '', 0); dir::create(PHPCMS_PATH.$dir); } if (empty($filename)) { $ext = fileext($url); $filename = $dir.$this->get_name($ext); } else { $filename = $dir.$filename; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 跳过SSL证书验证(解决HTTPS问题) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 伪造浏览器UA,避免被目标站反爬 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'); // 跟随301/302跳转 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 允许自动设置Referer curl_setopt($ch, CURLOPT_AUTOREFERER, true); $img = curl_exec($ch); if (curl_errno($ch)) { curl_close($ch); return false; } $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($http_code != 200) return false; // 验证下载内容是否为图片 $img_mime = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp']; $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_buffer($finfo, $img); finfo_close($finfo); if (!in_array($mime, $img_mime)) return false; file_put_contents(PHPCMS_PATH.$filename, $img); if (is_file(PHPCMS_PATH.$filename)) { return $filename; } else { return false; } } ```

注意:替换前务必备份原attachment.class.php文件,防止误操作。

场景二:部分带防盗链/特殊Header的图片采集失败

目标站通常通过检查Referer、Cookie或自定义Header反爬,此时需在采集节点规则中添加相应配置。

第一步:获取目标站的反爬Header信息

1. 打开Chrome浏览器,按F12进入开发者工具,切换到Network(网络)面板,勾选Preserve log(保留日志); 2. 访问目标站的单篇文章,找到要采集的图片URL,点击查看请求详情,复制以下关键Header: - Referer:目标站文章或首页URL - Cookie:若目标站需登录或访问验证,可复制当前浏览器的Cookie(注意Cookie有效期)

第二步:在PHPCMS采集节点中配置Header

PHPCMS V9/V10 采集远程图片失效的三种核心场景及完整修复步骤

1. 登录PHPCMS后台,进入内容 - 采集管理 - 节点管理,点击对应节点的修改; 2. 切换到内容分页设置(部分小版本在高级设置),找到自定义HTTP请求头选项; 3. 按以下格式填写,每行一个Header(注意格式为Header名: Header值,中间冒号后带一个空格): ``` Referer: https://目标站域名.com/ User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Cookie: 刚才复制的完整Cookie ```

4. 若小版本无自定义HTTP请求头选项,需修改采集类文件 /phpcms/modules/collection/classes/collection.class.php,搜索 curl_setopt,在已有参数后添加:

```php // 填写你的目标站自定义Header,多个用数组拼接 $custom_headers = [ 'Referer: https://目标站域名.com/', 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $custom_headers); ```

注意:此方法对所有采集节点生效,若需针对单个节点,需修改代码加入节点ID判断逻辑。

场景三:采集的图片URL相对路径转绝对后无法访问

部分目标站图片用相对路径(如/img/xxx.jpg),PHPCMS默认转换规则可能出错,需修改采集规则的URL预处理函数。

第一步:修改采集节点的图片字段

1. 进入对应采集节点的修改页面,切换到内容字段设置; 2. 找到缩略图文章内容(带图片)字段,点击配置规则; 3. 在内容处理下拉框中选择自定义函数,输入函数名 convert_relative_img; 4. 点击保存字段配置

第二步:添加自定义预处理函数

打开网站根目录下的 /phpcms/modules/collection/functions/global.func.php,在文件末尾(?>之前)添加以下完整代码:

```php function convert_relative_img($content, $nodeid = 0) { if (empty($content) || empty($nodeid)) return $content; // 获取当前节点的目标站URL前缀(从节点配置读取) $node_db = pc_base::load_model('collection_node_model'); $node = $node_db->get_one(['nodeid' => $nodeid], 'url'); if (empty($node['url'])) return $content; // 解析目标站URL的协议、域名、端口 $parse_url = parse_url($node['url']); $protocol = isset($parse_url['scheme']) ? $parse_url['scheme'] : 'http'; $domain = $parse_url['host']; $port = isset($parse_url['port']) ? ':'.$parse_url['port'] : ''; $path = isset($parse_url['path']) ? dirname($parse_url['path']).'/' : '/'; // 组合基础URL $base_url = $protocol.'://'.$domain.$port; $full_base_url = $base_url.$path; // 正则匹配相对路径图片 $content = preg_replace_callback( '/]src=["\'](?!(?:https?:|data:))([^"\']+)["\'][^>]>/i', function($matches) use ($base_url, $full_base_url) { $img_src = trim($matches[1]); // 处理不同类型的相对路径 if (substr($img_src, 0, 1) === '/') { // 根目录相对路径 $img_src = $base_url.$img_src; } elseif (substr($img_src, 0, 2) === './') { // 当前目录相对路径 $img_src = $full_base_url.substr($img_src, 2); } elseif (substr($img_src, 0, 3) === '../') { // 上级目录相对路径,循环处理直到没有../ $up_levels = 0; while (substr($img_src, 0, 3) === '../') { $up_levels++; $img_src = substr($img_src, 3); } $temp_path = rtrim($full_base_url, '/'); for ($i = 0; $i < $up_levels; $i++) { $temp_path = dirname($temp_path); } $img_src = $temp_path.'/'.$img_src; } else { // 其他相对路径 $img_src = $full_base_url.$img_src; } return str_replace($matches[1], $img_src, $matches[0]); }, $content ); return $content; } ```

3. 若采集的是缩略图,需将缩略图字段配置规则的URL预处理同样设置为convert_relative_img。

最终验证与排查

完成上述场景对应的修复后,按以下步骤验证: 1. 回到采集节点,点击测试采集,选择单篇文章测试; 2. 查看测试结果中的缩略图文章内容,确认图片已显示; 3. 若仍失效,检查以下细节:

  • 服务器是否安装了finfo扩展(场景一代码中用到),可通过phpinfo()查看;
  • 网站根目录的/uploadfile文件夹权限是否为755或777;
  • 目标站的图片是否已删除或失效;
  • 检查PHPCMS后台系统设置 - 附件设置中的上传目录、允许上传的图片格式是否正确。

相关推荐

最新

热门

推荐

精选

标签

易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。

Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图