2021-01-20 17:10:45 +08:00
|
|
|
|
package cn.hutool.http.useragent;
|
|
|
|
|
|
2022-05-07 12:18:29 +08:00
|
|
|
|
import cn.hutool.core.collection.ListUtil;
|
2022-04-28 03:35:07 +08:00
|
|
|
|
import cn.hutool.core.regex.ReUtil;
|
2021-01-20 17:10:45 +08:00
|
|
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 浏览器对象
|
2021-03-16 13:24:28 +08:00
|
|
|
|
*
|
2021-01-20 17:10:45 +08:00
|
|
|
|
* @author looly
|
|
|
|
|
* @since 4.2.1
|
|
|
|
|
*/
|
|
|
|
|
public class Browser extends UserAgentInfo {
|
2021-07-09 20:11:25 +08:00
|
|
|
|
private static final long serialVersionUID = 1L;
|
2021-01-20 17:10:45 +08:00
|
|
|
|
|
2021-07-09 20:11:25 +08:00
|
|
|
|
/**
|
|
|
|
|
* 未知
|
|
|
|
|
*/
|
2021-01-20 17:10:45 +08:00
|
|
|
|
public static final Browser Unknown = new Browser(NameUnknown, null, null);
|
2021-07-09 20:11:25 +08:00
|
|
|
|
/**
|
|
|
|
|
* 其它版本
|
|
|
|
|
*/
|
2021-01-20 17:10:45 +08:00
|
|
|
|
public static final String Other_Version = "[\\/ ]([\\d\\w\\.\\-]+)";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 支持的浏览器类型
|
|
|
|
|
*/
|
2022-05-07 13:24:02 +08:00
|
|
|
|
public static final List<Browser> browers = ListUtil.of(
|
2021-07-23 09:50:36 +08:00
|
|
|
|
// 部分特殊浏览器是基于安卓、Iphone等的,需要优先判断
|
|
|
|
|
// 企业微信 企业微信使用微信浏览器内核,会包含 MicroMessenger 所以要放在前面
|
|
|
|
|
new Browser("wxwork", "wxwork", "wxwork\\/([\\d\\w\\.\\-]+)"),
|
|
|
|
|
// 微信
|
2021-09-23 17:05:06 +08:00
|
|
|
|
new Browser("MicroMessenger", "MicroMessenger", Other_Version),
|
2021-07-23 09:50:36 +08:00
|
|
|
|
// 微信小程序
|
2021-09-23 17:05:06 +08:00
|
|
|
|
new Browser("miniProgram", "miniProgram", Other_Version),
|
2021-07-23 09:50:36 +08:00
|
|
|
|
// QQ浏览器
|
|
|
|
|
new Browser("QQBrowser", "MQQBrowser", "MQQBrowser\\/([\\d\\w\\.\\-]+)"),
|
2022-11-12 20:43:13 +08:00
|
|
|
|
// 钉钉PC端浏览器
|
|
|
|
|
new Browser("DingTalk-win", "dingtalk-win", "DingTalk\\(([\\d\\w\\.\\-]+)\\)"),
|
2021-07-23 09:50:36 +08:00
|
|
|
|
// 钉钉内置浏览器
|
|
|
|
|
new Browser("DingTalk", "DingTalk", "AliApp\\(DingTalk\\/([\\d\\w\\.\\-]+)\\)"),
|
|
|
|
|
// 支付宝内置浏览器
|
|
|
|
|
new Browser("Alipay", "AlipayClient", "AliApp\\(AP\\/([\\d\\w\\.\\-]+)\\)"),
|
|
|
|
|
// 淘宝内置浏览器
|
|
|
|
|
new Browser("Taobao", "taobao", "AliApp\\(TB\\/([\\d\\w\\.\\-]+)\\)"),
|
|
|
|
|
// UC浏览器
|
2021-07-23 23:19:11 +08:00
|
|
|
|
new Browser("UCBrowser", "UC?Browser", "UC?Browser\\/([\\d\\w\\.\\-]+)"),
|
2022-03-22 13:37:16 +08:00
|
|
|
|
// XiaoMi 浏览器
|
|
|
|
|
new Browser("MiuiBrowser", "MiuiBrowser|mibrowser", "MiuiBrowser\\/([\\d\\w\\.\\-]+)"),
|
2021-07-23 23:19:11 +08:00
|
|
|
|
// 夸克浏览器
|
2021-09-23 17:05:06 +08:00
|
|
|
|
new Browser("Quark", "Quark", Other_Version),
|
2022-01-14 09:49:15 +08:00
|
|
|
|
// 联想浏览器
|
|
|
|
|
new Browser("Lenovo", "SLBrowser", "SLBrowser/([\\d\\w\\.\\-]+)"),
|
2021-12-21 18:52:40 +08:00
|
|
|
|
new Browser("MSEdge", "Edge|Edg", "(?:edge|Edg|EdgA)\\/([\\d\\w\\.\\-]+)"),
|
2021-09-23 17:05:06 +08:00
|
|
|
|
new Browser("Chrome", "chrome", Other_Version),
|
2021-01-20 17:10:45 +08:00
|
|
|
|
new Browser("Firefox", "firefox", Other_Version),
|
|
|
|
|
new Browser("IEMobile", "iemobile", Other_Version),
|
|
|
|
|
new Browser("Android Browser", "android", "version\\/([\\d\\w\\.\\-]+)"),
|
|
|
|
|
new Browser("Safari", "safari", "version\\/([\\d\\w\\.\\-]+)"),
|
|
|
|
|
new Browser("Opera", "opera", Other_Version),
|
|
|
|
|
new Browser("Konqueror", "konqueror", Other_Version),
|
|
|
|
|
new Browser("PS3", "playstation 3", "([\\d\\w\\.\\-]+)\\)\\s*$"),
|
|
|
|
|
new Browser("PSP", "playstation portable", "([\\d\\w\\.\\-]+)\\)?\\s*$"),
|
|
|
|
|
new Browser("Lotus", "lotus.notes", "Lotus-Notes\\/([\\w.]+)"),
|
|
|
|
|
new Browser("Thunderbird", "thunderbird", Other_Version),
|
|
|
|
|
new Browser("Netscape", "netscape", Other_Version),
|
|
|
|
|
new Browser("Seamonkey", "seamonkey", Other_Version),
|
|
|
|
|
new Browser("Outlook", "microsoft.outlook", Other_Version),
|
|
|
|
|
new Browser("Evolution", "evolution", Other_Version),
|
|
|
|
|
new Browser("MSIE", "msie", "msie ([\\d\\w\\.\\-]+)"),
|
|
|
|
|
new Browser("MSIE11", "rv:11", "rv:([\\d\\w\\.\\-]+)"),
|
2021-09-23 17:05:06 +08:00
|
|
|
|
new Browser("Gabble", "Gabble", Other_Version),
|
2021-01-20 17:10:45 +08:00
|
|
|
|
new Browser("Yammer Desktop", "AdobeAir", "([\\d\\w\\.\\-]+)\\/Yammer"),
|
|
|
|
|
new Browser("Yammer Mobile", "Yammer[\\s]+([\\d\\w\\.\\-]+)", "Yammer[\\s]+([\\d\\w\\.\\-]+)"),
|
|
|
|
|
new Browser("Apache HTTP Client", "Apache\\\\-HttpClient", "Apache\\-HttpClient\\/([\\d\\w\\.\\-]+)"),
|
2021-07-23 09:50:36 +08:00
|
|
|
|
new Browser("BlackBerry", "BlackBerry", "BlackBerry[\\d]+\\/([\\d\\w\\.\\-]+)")
|
2021-01-20 17:10:45 +08:00
|
|
|
|
);
|
|
|
|
|
|
2021-07-09 20:11:25 +08:00
|
|
|
|
/**
|
|
|
|
|
* 添加自定义的浏览器类型
|
|
|
|
|
*
|
|
|
|
|
* @param name 浏览器名称
|
|
|
|
|
* @param regex 关键字或表达式
|
|
|
|
|
* @param versionRegex 匹配版本的正则
|
|
|
|
|
* @since 5.7.4
|
|
|
|
|
*/
|
2022-04-30 20:47:32 +08:00
|
|
|
|
synchronized public static void addCustomBrowser(final String name, final String regex, final String versionRegex) {
|
2021-07-09 20:11:25 +08:00
|
|
|
|
browers.add(new Browser(name, regex, versionRegex));
|
|
|
|
|
}
|
2021-01-20 17:10:45 +08:00
|
|
|
|
|
2021-07-09 20:11:25 +08:00
|
|
|
|
private Pattern versionPattern;
|
2021-01-20 17:10:45 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 构造
|
2021-03-16 13:24:28 +08:00
|
|
|
|
*
|
2021-07-09 20:11:25 +08:00
|
|
|
|
* @param name 浏览器名称
|
|
|
|
|
* @param regex 关键字或表达式
|
2021-01-20 17:10:45 +08:00
|
|
|
|
* @param versionRegex 匹配版本的正则
|
|
|
|
|
*/
|
2022-04-30 20:47:32 +08:00
|
|
|
|
public Browser(final String name, final String regex, String versionRegex) {
|
2021-01-20 17:10:45 +08:00
|
|
|
|
super(name, regex);
|
|
|
|
|
if (Other_Version.equals(versionRegex)) {
|
|
|
|
|
versionRegex = name + versionRegex;
|
|
|
|
|
}
|
|
|
|
|
if (null != versionRegex) {
|
|
|
|
|
this.versionPattern = Pattern.compile(versionRegex, Pattern.CASE_INSENSITIVE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取浏览器版本
|
2021-03-16 13:24:28 +08:00
|
|
|
|
*
|
2021-01-20 17:10:45 +08:00
|
|
|
|
* @param userAgentString User-Agent字符串
|
|
|
|
|
* @return 版本
|
|
|
|
|
*/
|
2022-04-30 20:47:32 +08:00
|
|
|
|
public String getVersion(final String userAgentString) {
|
2021-07-09 20:11:25 +08:00
|
|
|
|
if(isUnknown()){
|
|
|
|
|
return null;
|
|
|
|
|
}
|
2021-01-20 17:10:45 +08:00
|
|
|
|
return ReUtil.getGroup1(this.versionPattern, userAgentString);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 是否移动浏览器
|
2021-03-16 13:24:28 +08:00
|
|
|
|
*
|
2021-01-20 17:10:45 +08:00
|
|
|
|
* @return 是否移动浏览器
|
|
|
|
|
*/
|
|
|
|
|
public boolean isMobile() {
|
2021-07-09 20:11:25 +08:00
|
|
|
|
final String name = this.getName();
|
|
|
|
|
return "PSP".equals(name) ||
|
|
|
|
|
"Yammer Mobile".equals(name) ||
|
|
|
|
|
"Android Browser".equals(name) ||
|
|
|
|
|
"IEMobile".equals(name) ||
|
|
|
|
|
"MicroMessenger".equals(name) ||
|
|
|
|
|
"miniProgram".equals(name) ||
|
|
|
|
|
"DingTalk".equals(name);
|
2021-01-20 17:10:45 +08:00
|
|
|
|
}
|
|
|
|
|
}
|