利用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);
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

评论(0)