这是最常见的失效场景,PHPCMS默认CURL不支持SSL证书验证跳过,同时部分老版默认CURL参数缺失。
打开网站根目录下的 /phpcms/modules/content/classes/attachment.class.php
找到约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文件,防止误操作。
目标站通常通过检查Referer、Cookie或自定义Header反爬,此时需在采集节点规则中添加相应配置。
1. 打开Chrome浏览器,按F12进入开发者工具,切换到Network(网络)面板,勾选Preserve log(保留日志); 2. 访问目标站的单篇文章,找到要采集的图片URL,点击查看请求详情,复制以下关键Header: - Referer:目标站文章或首页URL - Cookie:若目标站需登录或访问验证,可复制当前浏览器的Cookie(注意Cookie有效期)

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判断逻辑。
部分目标站图片用相对路径(如/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( '/3. 若采集的是缩略图,需将缩略图字段配置规则的URL预处理同样设置为convert_relative_img。
完成上述场景对应的修复后,按以下步骤验证: 1. 回到采集节点,点击测试采集,选择单篇文章测试; 2. 查看测试结果中的缩略图和文章内容,确认图片已显示; 3. 若仍失效,检查以下细节:
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图