您好,欢迎来到95分类目录!站长微信:vip3632094
当前位置:95分类目录 » 站长资讯 » 35dir专区 » 文章详细 订阅RssFeed

增加95分类目录后台网站截图获取目标站logo本地化(没有logo获取ico)

来源:本站原创 浏览:23次 时间:2025-06-01
简介:增加95分类目录后台网站截图获取目标站logo本地化(没有logo获取ico)

找到/themes/system/website.html

添加获取logo按钮

<tr>
<th>网站截图:</th>
<td><input name=“web_pic” type=“text” class=“ipt” id=“web_pic” size=“50” maxlength=“100” value=“{#$row.web_pic#}” /></td>
</tr>
改为

<tr>
<th>网站截图:</th>
<td>
<输入名称=“web_pic” type=“text” class=“ipt” id=“web_pic” size=“50” maxlength=“100” value=“{#$row.web_pic#}” />
<input type=“button” class=“btn” id=“logo_btn” value=“获取网站LOGO” onclick=“GetLogo()”>
<span id=“logo_status” style=“margin-left: 10px;”></span>
</td>
</tr>
<script type=“text/javascript”>
// 获取网站LOGO功能
function GetLogo() {
var url = document.getElementById('web_url').value;
if (!url) {
alert('请先填写网站域名');
return;
}

// 显示加载状态
document.getElementById('logo_status').innerText = '正在获取LOGO...';

发送AJAX请求到后端处理脚本
var xhr = new XMLHttpRequest();
xhr.open('POST', 'get_logo.php', true);
xhr.setRequestHeader('内容类型', 'application/x-www-form-urlencoded');
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
try {
var response = JSON.parse(xhr.responseText);
if (response.status === 'success') { // 将logo路径填入网站截图输入框
document.getElementById('web_pic').value = response.logo_path;
// 构建成功消息,包含尺寸信息和SVG标记
var successMsg = '<span style=“color:green;”>获取成功!';
response.is_svg} else {
successMsg += '(SVG矢量图)';
} else { successMsg += '(' + response.width + '×' + response.height + ')';
}
successMsg += '</span>';
document.getElementById('logo_status').innerHTML = successMsg;
// 显示图片预览
var previewHtml = '<div style=“margin-top:5px;”><img src=“' + response.logo_path +
'” style=“max-width:100px;最大高度:50px;border:1px solid #ddd;padding:2px;”></div>';
document.getElementById('logo_status').innerHTML += previewHtml;
} else {
document.getElementById('logo_status').innerHTML =
'<span style=“color:red;”>获取失败: ' + response.message + '</span>';
}
} catch (e) {
document.getElementById('logo_status').innerHTML =
'<span style=“color:red;”>解析响应失败</span>';
}
} else {
document.getElementById('logo_status').innerHTML =
'<span style=“color:red;”>请求错误,请重试</span>';
}
} }
;
xhr.send('url=' + encodeURIComponent(url));
}
</script>

接着找到/system

新建文件get_logo.php

将下面代码加入里面

<?php
// 设置响应头
header('Content-Type: application/json');
接收URL参数
$url = isset($_POST['url']) ?trim($_POST['url']) : '';
if (empty($url)) {
echo json_encode(['status' => 'error', 'message' => '网站URL不能为空']);


// 确保URL格式正确
if (!preg_match('/^(https?://)/', $url)) {
$url = 'http://' . $url;
}
try {
// 创建保存目录
$upload_dir = 'uploads/logos/';
if (!file_exists($upload_dir)) {
mkdir($upload_dir, 0777, true);
}
生成唯一文件名(使用域名作为基础)
$domain = parse_url($url, PHP_URL_HOST);
$filename = preg_replace('/[^a-zA-Z0-9]/', '_', $domain) .'_' .时间();
// 设置HTTP请求上下文
$context = stream_context_create([
'http' => [
'timeout' => 10,
'user_agent' => 'Mozilla/5.0 (Windows NT 10.0;Win64 的;x64) AppleWebKit/537.36(KHTML,如 Gecko) Chrome/91.0.4472.124 Safari/537.36'
]
]);
获取网站HTML内容
$html = @file_get_contents($url, false, $context);
if ($html === false) {
echo json_encode(['status' => 'error', 'message' => '无法访问网站']);


存储可能的徽标 URL
$logo_candidates = [];

1.首先尝试查找SVG格式的logo (最高优先级)
$svg_patterns = [
// SVG图片标签
'/<img[^>]+src=[“']([^”']*(?::) logo|brand)[^“']*.svg)[”'][^>]*>/i',
// SVG内联对象
'/<object[^>]+data=[“']([^”']*(?:logo|brand)[^“']*.svg)[”'][^>]*>/i',
// 具有logo或brand类的SVG图像
'/<img[^>]+class=[“'][^”']*(?:logo|brand)[^“']*[^>]+src=[”']([^“']+.svg)[”'][^>]*>/i',
//常见SVG logo路径
'/<link[^>]+rel=[“'](?:icon|shortcut icon)[”'][^>]+href=[“']([^”']+.svg)[“'][^>]*>/i'
];

foreach ($svg_patterns as $pattern) {
if (preg_match_all($pattern, $html, $matches)) {
$logo_candidates = array_merge($logo_candidates, $matches[1]);
}
}

// 添加常见SVG logo路径
$common_svg_paths = [
'/logo.svg',
'/images/logo.svg',
'/img/logo.svg',
'/assets/logo.svg',
'/assets/images/logo.svg',
'/static/logo.svg',
'/static/images/logo.svg',
'/icons/logo.svg',
'/brand/logo.svg'
];

foreach ($common_svg_paths as $path) {
$logo_candidates[] = rtrim($url, '/') . $path;
}

//阿拉伯数字。尝试查找og:image元标签(通常是较大的品牌图像)
if (preg_match('/<meta[^>]+property=[“']og:image[”'][^>]+content=[“']([^”']+)[“'][^>]*>/i', $html, $matches)) {
$logo_candidates[] = $matches[1];
}

3.查找带有logo关键词的图片
$pattern = '/<img[^>]+src=[“']([^”']*(?:logo|brand)[^“']*.(?:p ng|jpg|jpeg|gif))[”'][^>]*>/i';
if (preg_match_all($pattern, $html, $matches)) {
$logo_candidates = array_merge($logo_candidates, $matches[1]);
}

4.查找通用的 logo类名
$pattern = '/<img[^>]+class=[“'][^”']*(?:logo|brand)[^“']*[”'][^>]+src=[“']([^”']+)[“'][^>]*>/i';
if (preg_match_all($pattern, $html, $matches)) {
$logo_candidates = array_merge($logo_candidates, $matches[1]);
}

5.尝试常见的logo路径
$common_paths = [
'/logo.png',
'/images/logo.png',
'/img/logo.png',
'/assets/logo.png',
'/assets/images/logo.png',
'/static/logo.png',
'/static/images/logo.png',
];

foreach ($common_paths as $path) {
$logo_candidates[] = rtrim($url, '/') . $path;
}

6.查找apple-touch-icon(通常比favicon大)
$pattern = '/<link[^>]+rel=[“']apple-touch-icon[”'][^>]+href=[“']([^”']+)[“'][^>]*>/i';
if (preg_match($pattern, $html, $matches)) {
$logo_candidates[] = $matches[1];
}

7.最后才查找常规favicon链接
$pattern = '/<link[^>]+rel=[“'](?:shortcut icon|icon)[”'][^>]+href=[“']([^”']+)[“'][^>]*>/i';
if (preg_match($pattern, $html, $matches)) {
$logo_candidates[] = $matches[1];
}

8.标准favicon.ico位置作为最后选择
$logo_candidates[] = rtrim($url, '/') 。'/favicon.ico';
去重
$logo_candidates = array_unique($logo_candidates);

尝试下载每个候选logo
$logo_found = false;
$logo_info = 空;
$logo_content = 空;
$logo_extension = 空;

foreach ($logo_candidates as $logo_url) {
// 处理相对URL
if (!preg_match('/^(https?://)/', $logo_url)) {
if (substr($logo_url, 0, 1) === '/') {
$parsed_url = parse_url($url);
$logo_url = $parsed_url['scheme'] .'://' .$parsed_url['host'] .$logo_url;
} else {
$logo_url = rtrim($url, '/') .'/' .$logo_url;
}
}

// 尝试获取图片内容
$logo_content = @file_get_contents($logo_url, false, $context);
if ($logo_content !== false) {
// 检查是否是SVG
$is_svg = false;
if (stripos($logo_url, '.svg') !== false ||
strpos($logo_content, '<svg') !== false ||
strpos($logo_content, '<?xml') !== false) {
// 验证SVG内容
if (strpos($logo_content, '<svg') !== false) {
$is_svg = true;
$logo_extension = 'svg';
// SVG尺寸通常在SVG标签中定义
$svg_width = $svg_height = 0;
if (preg_match('/<svg[^>]+width=[“'](.*?)[“']/', $logo_content, $width_match)) { $svg_width = preg_replace('/[^0-9.]/', '', $width_match[1]);}
if (preg_match('/<svg[^>]+height=[“'](.*?)[“']/', $logo_content, $height_match)) {
$svg_height = preg_replace('/[^0-9.]/', '', $height_match[1]);
}
// 如果没有明确尺寸,设为默认值
if (empty($svg_width) || empty($svg_height)) {
// 提取viewBox信息
if (preg_match('/<svg[^>]+viewBox=[“'](.*?)[“']/', $logo_content, $viewbox_match)) {
$viewbox = explode(' ', trim($viewbox_match[1]));if (count($viewbox) == 4) {
$svg_width = $viewbox[2];
$svg_height = $viewbox[3];
}
}
// 如果仍然没有尺寸,设置默认值
if (empty($svg_width) || empty($svg_height)) {
$svg_width = 100;
$svg_height = 100;
}
}
$logo_found = 真;
$logo_info = [ 'width' => $svg_width,
'height' => $svg_height, 'mime' => 'image/svg+xml',
'url' => $logo_url,
'is_svg' => true
];
破;SVG是最优选择,直接结束搜索
}
} // 如果不是SVG,检查其他图片类型
if (!$is_svg) {
$temp_file = tempnam(sys_get_temp_dir(), 'logo');
file_put_contents($temp_file, $logo_content);
$img_info = @getimagesize($temp_file);
unlink($temp_file);

if ($img_info !== false) { // 设置文件扩展名
$mime_to_ext = [
'image/jpeg' => 'jpg',
'image/png' => 'png', 'image/gif' => 'gif',
'image/x-icon' => 'ico',
'image/vnd.microsoft.icon' => 'ico'
];
$logo_extension = isset($mime_to_ext[$img_info['mime']])
? $mime_to_ext[$img_info['mime']] : 'png';
// 优先选择大于48x48的非ico图片
if ($logo_extension != 'ico' && $img_info[0] >= 48 && $img_info[1] >= 48) {
$logo_found = true;
$logo_info = [
'width' => $img_info[0],
'height' => $img_info[1], 'mime' => $img_info['mime'],
'url' => $logo_url,
'is_svg' => false
]; break; // 找到合适的大图,停止搜索 }
// 如果还没有找到任何图片,先记住这个 if (!$logo_found) { $logo_found = true;
$logo_info = [
'width' => $img_info[0],
'height' => $img_info[1],
'mime' => $img_info['mime'],
'url' => $logo_url,
'is_svg' => false
];
不中断循环,继续寻找更好的选项
}
}
}
}


} if (!$logo_found || !$logo_content) {
echo json_encode(['status' => 'error', 'message' => '无法获取网站LOGO']);



保存图片到本地
$save_path = $upload_dir .$filename .'.' .$logo_扩展;
if (file_put_contents($save_path, $logo_content)) {
// 构建响应信息
$response = [
'status' => 'success',
'logo_path' => $save_path,
'width' => $logo_info['width'],
'height' => $logo_info['height'],
'is_svg' => $logo_info['is_svg'],
'source_url' => $logo_info['url']
];

} SVG标记
if ($logo_info['is_svg']) {
$response['format'] = 'SVG矢量图';


回声 json_encode($response);
} else {
echo json_encode(['status' => 'error', 'message' => '无法保存LOGO到服务器']);

} catch (异常 $e) {
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
?>

注意:如没有自己创建/system/uploads/logos目录请手动添加,权限775

© 版权声明

推荐站点

  • QR Online.ioQR Online.io

    Free online QR code generator supporting URL, text, contact info, WiFi and more. Customize colors, add logos, high-quality output.

    www.qronline.io
  • Temp Mail 365Temp Mail 365

    Temp Mail 365 provides instant temporary email addresses to protect your privacy and avoid spam. No registration required, 5-60 minute validity.

    temp-mail-365.com
  • 我的电视我的电视

    我的电视是一个在线观看高清影视电影的免费站点

    my0713.com
  • 优站库 - 新型分类目录优站库 - 新型分类目录

    一个集网站推荐、内容推荐于一体的宝藏之地。我们精心搜罗各类常用网站,构建起全面的网站目录。无论是学习提升所需的在线课程平台,还是休闲娱乐的影视音乐网站,亦或是商务办公的效率工具站点,都能在我们的分类大全中快速找到。同时,我们也是一个充满活力的建站交流社区。站长们在此分享经验、探讨技术,共同提升网站建设水平。作为网址导航,我们为你清晰分类,节省寻找优质网站的时间和精力。在这里,你无需再为找不到合适的网站而烦恼,只需轻轻一点,就能开启精彩的网络之旅。

    www.uzkoo.com
  • Bible Verse of the DayBible Verse of the Day

    Get your free Bible Verse of the Day

    verseoftheday.online