利用php下载火车头内容标签图片,并自定义目录及图片名,其实火车头都能自定义图片下载,纯无聊写的代码。供学习参考。

将代码复制别存到Plugins目录,并命名为downimg.php,如下图所示,启用插件。

标签里加入图片目录、图片名、设置cookie(有些图片需要有cookie才能采集到,就有用。)

<?php // 关闭错误报告 error_reporting(0); // 设置响应头内容类型为HTML,字符编码为UTF-8 header("Content-type: text/html; charset=utf-8"); // 初始化cookie处理 if (isset($_COOKIE['custom_settings'])) { // 解码cookie中的设置 $cookieSettings = json_decode($_COOKIE['custom_settings'], true); // 检查JSON解码是否成功 if (json_last_error() === JSON_ERROR_NONE) { // 将cookie设置合并到标签数组中 foreach ($cookieSettings as $key => $value) {
            if (!isset($LabelArray[$key])) {
                $LabelArray[$key] = $value;
            }
        }
    }
}

// 处理内容字段中的图片下载
if (isset($LabelArray['内容'])) {
    $LabelArray['内容'] = download_images($LabelArray['内容'], $LabelArray);
}

/**
 * 下载远程图片到本地
 * @param string $content 包含图片的HTML内容
 * @param array $LabelArray 标签数组(包含设置)
 * @return string 处理后的HTML内容
 */
function download_images($content, $LabelArray) {
    // 设置图片下载目录
    $download_dir = isset($LabelArray['图片目录']) && !empty($LabelArray['图片目录']) 
        ? rtrim($_SERVER['DOCUMENT_ROOT'], '/') . '/' . trim($LabelArray['图片目录'], '/') . '/'
        : rtrim($_SERVER['DOCUMENT_ROOT'], '/') . '/images/fx/';
    
    // 设置图片基础URL
    $base_url = isset($LabelArray['图片目录']) && !empty($LabelArray['图片目录']) 
        ? '/' . trim($LabelArray['图片目录'], '/') . '/'
        : '/images/fx/';

    // 检查并创建目录(如果不存在)
    if (!file_exists($download_dir)) {
        if (!mkdir($download_dir, 0755, true) && !is_dir($download_dir)) {
            // 记录目录创建错误
            error_log("[DIR ERROR] 无法创建目录: " . print_r(error_get_last(), true));
            return $content;
        }
    }

    // 匹配HTML中的所有img标签
    preg_match_all(
        '/<img\b[^>]*?\bsrc\s*=\s*(["\'])((?:https?:)?\/\/[^"\'\s>]+?\.(?:jpe?g|png|gif|webp|bmp)(?:\?[^"\'\s>]*)?)\1[^>]*>/i',
        $content,
        $matches,
        PREG_SET_ORDER
    );

    $replacements = []; // 存储替换内容
    $image_counter = 1; // 图片计数器
    
    // 处理每个匹配到的图片
    foreach ($matches as $match) {
        $full_match = $match[0]; // 完整img标签
        $quote = $match[1]; // 使用的引号类型
        $original_url = html_entity_decode($match[2]); // 解码HTML实体后的原始URL

        // 跳过已经本地化的图片
        if (strpos($original_url, $base_url) === 0 || strpos($original_url, '/images/fx/') !== false) {
            continue;
        }

        // 规范化URL(处理无协议和相对协议的情况)
        if (strpos($original_url, '//') === 0) {
            $original_url = 'https:' . $original_url;
        } elseif (!preg_match('/^https?:/i', $original_url)) {
            continue; // 跳过非http(s)协议的URL
        }

        // 下载图片内容(带重试机制)
        $file_content = false;
        $retry = 0;
        $max_retries = 2;
        
        while ($retry < $max_retries && !$file_content) { $file_content = download_file($original_url); if (!$file_content) { $retry++; usleep(500000); // 重试前等待0.5秒 } } // 下载失败则跳过 if (!$file_content) { error_log("下载失败: {$original_url}"); continue; } // 获取文件扩展名 $file_extension = strtolower(pathinfo(parse_url($original_url, PHP_URL_PATH), PATHINFO_EXTENSION)); // 生成新文件名 if (isset($LabelArray['图片名']) && !empty($LabelArray['图片名'])) { $new_filename = $LabelArray['图片名']; // 多张图片时添加序号 if (count($matches) > 1) {
                $new_filename .= '_' . str_pad($image_counter, 2, '0', STR_PAD_LEFT);
            }
            $new_filename .= '.' . $file_extension;
            $image_counter++;
        } else {
            // 生成随机文件名
            $new_filename = time() . '_' . substr(str_shuffle("abcdefghijklmnopqrstuvwxyz"), 0, 6) . '.' . $file_extension;
        }
        
        $save_path = $download_dir . $new_filename;

        // 保存图片文件
        if (file_put_contents($save_path, $file_content)) {
            // 构建新的图片URL
            $new_url = $base_url . $new_filename;
            
            // 替换img标签中的src属性
            $new_img_tag = preg_replace(
                '/(src\s*=\s*["\'])(?:https?:)?\/\/[^"\'\s>]+?\.(?:jpe?g|png|gif|webp|bmp)(?:\?[^"\'\s>]*)?(["\'])/i',
                '$1' . $new_url . '$2',
                $full_match
            );
            
            $replacements[$full_match] = $new_img_tag;
        }
    }

    // 执行替换操作
    if (!empty($replacements)) {
        $content = strtr($content, $replacements);
        
        // 验证是否还有远程图片未替换
        if (preg_match('/src\s*=\s*["\']https?:\/\//i', $content)) {
            error_log("[警告] 仍有远程图片未替换: " . substr($content, 0, 500));
        }
    }

    return $content;
}

/**
 * 下载文件函数
 * @param string $url 文件URL
 * @return mixed 文件内容或false
 */
function download_file($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36');
    
    // 设置Referer和HTTP头
    curl_setopt($ch, CURLOPT_REFERER, 'https://fpjiaocheng.xyz');
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Accept: image/webp,image/apng,image/*,*/*;q=0.8',
        'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8',
    ]);
    
    // 添加cookie支持
    if (!empty($_COOKIE)) {
        $cookies = [];
        foreach ($_COOKIE as $name => $value) {
            $cookies[] = $name . '=' . $value;
        }
        curl_setopt($ch, CURLOPT_COOKIE, implode('; ', $cookies));
    }
    
    $data = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    // 检查HTTP状态码
    if ($httpcode != 200) {
        error_log("下载失败 HTTP {$httpcode}: {$url}");
        return false;
    }
    
    return $data;
}

// 设置cookie(如果需要)
if (isset($LabelArray['设置cookie'])) {
    $cookieSettings = [];
    if (isset($LabelArray['图片目录'])) {
        $cookieSettings['图片目录'] = $LabelArray['图片目录'];
    }
    if (isset($LabelArray['图片名'])) {
        $cookieSettings['图片名'] = $LabelArray['图片名'];
    }
    
    // 设置30天有效期的cookie
    if (!empty($cookieSettings)) {
        setcookie('custom_settings', json_encode($cookieSettings), time() + 86400 * 30, '/');
    }
}

// 输出序列化后的标签数组
echo serialize($LabelArray);
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。