自己网站涉及到了获取别的网站的logo,于是网上找到代码,自己又优化了一点,代码可以直接拿走用。主要用到了访问网页的Jsoup依赖和HuTool的工具包。
本人自测大部分能获取到,获取不到的,代码返回网站地址+/favicon.ico。如果返回的icon链接不正确,可自行F12,查找head元素里面的link标签,带有icon的就是logo地址,如果还找不到,可以查看netwrok那里,找下图片的资源。再实在不行就截图吧。
maven依赖
<!--Jsoup-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.14.3</version>
</dependency>
<!--HuTool工具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.15</version>
</dependency>
主要代码
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import com.yyg.zqdhms.utils.SslUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
public static String getFaviconUrl(String link) {
String urlJoinHttps = "";
String faviconHref = "";
String protocol = "";
String host = "";
try {
String linkTrim = StrUtil.trimToEmpty(link);
// 假设输入的参数不携带协议,则拼接协议
urlJoinHttps = urlJoinHttps(linkTrim);
URL url = new URL(urlJoinHttps);
protocol = url.getProtocol();
host = url.getHost();
//忽略SSL证书
SslUtils.ignoreSsl();
// 发请求
Document document = Jsoup.connect(urlJoinHttps).get();
// 筛选包含favicon图标的link标签
Elements title = document.select("link[type=image/x-icon]");
title = ObjectUtil.isEmpty(title) ? document.select("link[rel$=icon]") : title;
if (title.size() == 0) {
System.out.println("[" + urlJoinHttps + "]找不到");
return faviconJoinHttps(protocol, host, faviconHref) + "favicon.ico";
}
// 获取favicon路径
faviconHref = title.attr("href");
// 假设获取到的favicon路径已经包含了域名,则直接返回,没有则拼接
String faviconJoinHttps = faviconJoinHttps(protocol, host, faviconHref);
String img = URLUtil.normalize(isImg(protocol, host, faviconJoinHttps));
return img;
} catch (Exception e) {
System.out.println("[" + urlJoinHttps + "]获取失败:" + e);
return URLUtil.normalize(faviconJoinHttps(protocol, host, faviconHref) + "/favicon.ico");
}
}
public static String urlJoinHttps(String url) {
String lowerCaseStr = url.toLowerCase();
if (!lowerCaseStr.startsWith("http:") && !lowerCaseStr.startsWith("https:")) {
return "https://" + url;
} else {
return url;
}
}
public static String faviconJoinHttps(String protocol, String host, String faviconHref) {
if (faviconHref.contains("http") || faviconHref.contains("https") || faviconHref.contains(".com") || faviconHref.contains(".cn")) {
return faviconHref;
} else {
if (faviconHref.startsWith("/")) {
return protocol + "://" + host + faviconHref;
} else {
return protocol + "://" + host + "/" + faviconHref;
}
}
}
public static String isImg(String protocol, String host, String faviconJoinHttps) {
if (faviconJoinHttps.contains(".jpg") || faviconJoinHttps.contains(".ico") || faviconJoinHttps.contains(".png") || faviconJoinHttps.contains(".jpeg") || faviconJoinHttps.contains(".svg") || faviconJoinHttps.contains(".webp")) {
return faviconJoinHttps;
} else {
return faviconJoinHttps(protocol, host, faviconJoinHttps);
}
}
SslUtils 文件
import javax.net.ssl.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
/**
* @author Administrator
*/
public class SslUtils {
public static void trustAllHttpsCertificates() throws Exception {
TrustManager[] trustAllCerts = new TrustManager[1];
TrustManager tm = new miTM();
trustAllCerts[0] = tm;
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
static class miTM implements TrustManager,X509TrustManager {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public boolean isServerTrusted(X509Certificate[] certs) {
return true;
}
public boolean isClientTrusted(X509Certificate[] certs) {
return true;
}
public void checkServerTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
public void checkClientTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
}
/**
* 忽略HTTPS请求的SSL证书,必须在openConnection之前调用
* @throws Exception
*/
public static void ignoreSsl() throws Exception{
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
return true;
}
};
trustAllHttpsCertificates();
HttpsURLConnection.setDefaultHostnameVerifier(hv);
}
}