前言
其实就是将browser.js转化为PHP代码,不过因为本身typecho
评论存储的信息有限,所以针对 ~c 360浏览器和win11 c~并不能进行很好的区分,如果很在意这一部分的话,其实也可以改造的;
目前针对win11
的区分可参考how-to-detect-win11,主要platformVersion
大于13的话,就可以确定是Windows 11,不过userAgentData
存在兼容性问题;
内容
主要分为两块,一部分代码在
functions.php
,另一部分代码当然在你需要调用的地方了,也就是comments.php
;
functions.php
代码语言:javascript复制/**
* 浏览器和设备信息
*
* @param string $userAgent 用户代理
* @return string[]
*/
function getBrowsersInfo ($userAgent) {
$deviceInfo = [
"system" => "",
"systemVersion" => "",
"browser" => "",
"version" => "",
"device" => "PC"
];
$match = [
// 浏览器 - 国外浏览器
"Safari" => strstr($userAgent, 'Safari') != false ,
"Chrome" => strstr($userAgent, 'Chrome') != false || strstr($userAgent, 'CriOS') != false ,
"IE" => strstr($userAgent, 'MSIE') != false || strstr($userAgent, 'Trident') != false ,
"Edge" => strstr($userAgent, 'Edge') != false || strstr($userAgent, 'Edg/') != false || strstr($userAgent, 'EdgA') != false || strstr($userAgent, 'EdgiOS') != false,
"Firefox" => strstr($userAgent, 'Firefox') != false || strstr($userAgent, 'FxiOS') != false ,
"Firefox Focus" => strstr($userAgent, 'Focus') != false,
"Chromium" => strstr($userAgent,'Chromium') != false,
"Opera" => strstr($userAgent,'Opera') != false || strstr($userAgent,'OPR') != false,
"Vivaldi" => strstr($userAgent,'Vivaldi') != false,
"Yandex" => strstr($userAgent,'YaBrowser') != false,
"Arora" => strstr($userAgent,'Arora') != false,
"Lunascape" => strstr($userAgent,'Lunascape') != false,
"QupZilla" => strstr($userAgent,'QupZilla') != false,
"Coc Coc" => strstr($userAgent,'coc_coc_browser') != false,
"Kindle" => strstr($userAgent,'Kindle') != false || strstr($userAgent,'Silk/') != false,
"Iceweasel" => strstr($userAgent,'Iceweasel') != false,
"Konqueror" => strstr($userAgent,'Konqueror') != false,
"Iceape" => strstr($userAgent,'Iceape') != false,
"SeaMonkey" => strstr($userAgent,'SeaMonkey') != false,
"Epiphany" => strstr($userAgent,'Epiphany') != false,
// 浏览器 - 国内浏览器
"360" => strstr($userAgent,'QihooBrowser') != false || strstr($userAgent,'QHBrowser') != false,
"360EE" => strstr($userAgent,'360EE') != false,
"360SE" => strstr($userAgent,'360SE') != false,
"UC" => strstr($userAgent,'UCBrowser') != false || strstr($userAgent,' UBrowser') != false || strstr($userAgent,'UCWEB') != false,
"QQBrowser" => strstr($userAgent,'QQBrowser') != false,
"QQ" => strstr($userAgent,'QQ/') != false,
"Baidu" => strstr($userAgent,'Baidu') != false || strstr($userAgent,'BIDUBrowser') != false || strstr($userAgent,'baidubrowser') != false || strstr($userAgent,'baiduboxapp') != false || strstr($userAgent,'BaiduHD') != false,
"Maxthon" => strstr($userAgent,'Maxthon') != false,
"Sogou" => strstr($userAgent,'MetaSr') != false || strstr($userAgent,'Sogou') != false,
"Liebao" => strstr($userAgent,'LBBROWSER') != false || strstr($userAgent,'LieBaoFast') != false,
"2345Explorer" => strstr($userAgent,'2345Explorer') != false || strstr($userAgent,'Mb2345Browser') != false || strstr($userAgent,'2345chrome') != false,
"115Browser" => strstr($userAgent,'115Browser') != false,
"TheWorld" => strstr($userAgent,'TheWorld') != false,
"Quark" => strstr($userAgent,'Quark') != false,
"Qiyu" => strstr($userAgent,'Qiyu') != false,
// 浏览器 - 手机厂商
"XiaoMi" => strstr($userAgent,'MiuiBrowser') != false,
"Huawei" => strstr($userAgent,'HuaweiBrowser') != false || strstr($userAgent,'HUAWEI/') != false || strstr($userAgent,'HONOR') != false || strstr($userAgent,'HBPC/') != false,
"Vivo" => strstr($userAgent,'VivoBrowser') != false,
"OPPO" => strstr($userAgent,'HeyTapBrowser') != false,
// 浏览器 - 客户端
"Wechat" => strstr($userAgent,'MicroMessenger') != false,
"WechatWork" => strstr($userAgent,'wxwork/') != false,
"Taobao" => strstr($userAgent,'AliApp(TB') != false,
"Alipay" => strstr($userAgent,'AliApp(AP') != false,
"Weibo" => strstr($userAgent,'Weibo') != false,
"Douban" => strstr($userAgent,'com.douban.frodo') != false,
"Suning" => strstr($userAgent,'SNEBUY-APP') != false,
"iQiYi" => strstr($userAgent,'IqiyiApp') != false,
"DingTalk" => strstr($userAgent,'DingTalk') != false,
"Douyin" => strstr($userAgent,'aweme') != false,
// 系统或平台
"Windows" => strstr($userAgent,'Windows') != false,
"Linux" => strstr($userAgent,'Linux') != false || strstr($userAgent,'X11') != false,
"Mac OS" => strstr($userAgent,'Macintosh') != false,
"Android" => strstr($userAgent,'Android') != false || strstr($userAgent,'Adr') != false,
"HarmonyOS" => strstr($userAgent,'HarmonyOS') != false,
"Ubuntu" => strstr($userAgent,'Ubuntu') != false,
"FreeBSD" => strstr($userAgent,'FreeBSD') != false,
"Debian" => strstr($userAgent,'Debian') != false,
"Windows Phone" => strstr($userAgent,'IEMobile') != false || strstr($userAgent,'Windows Phone') != false,
"BlackBerry" => strstr($userAgent,'BlackBerry') != false || strstr($userAgent,'RIM') != false,
"MeeGo" => strstr($userAgent,'MeeGo') != false,
"Symbian" => strstr($userAgent,'Symbian') != false,
"iOS" => strstr($userAgent,'like Mac OS X') != false,
"Chrome OS" => strstr($userAgent,'CrOS') != false,
"WebOS" => strstr($userAgent,'hpwOS') != false,
// 设备
"Mobile" => strstr($userAgent,'Mobi') != false || strstr($userAgent,'iPh') != false || strstr($userAgent,'480') != false,
"Tablet" => strstr($userAgent,'Tablet') != false || strstr($userAgent,'Pad') != false || strstr($userAgent,'Nexus 7') != false,
];
// 部分修正 | 因typecho评论数据只存储了ua的信息,所以不能完全进行修正尤其是360相关浏览器
if ($match['Baidu'] && $match['Opera']) $match['Baidu'] = false;
if ($match['iOS']) $match['Safari'] = true;
// 基本信息
$baseInfo = [
"browser" => [
'Safari', 'Chrome', 'Edge', 'IE', 'Firefox', 'Firefox Focus', 'Chromium',
'Opera', 'Vivaldi', 'Yandex', 'Arora', 'Lunascape','QupZilla', 'Coc Coc',
'Kindle', 'Iceweasel', 'Konqueror', 'Iceape','SeaMonkey', 'Epiphany', 'XiaoMi',
'Vivo', 'OPPO', '360', '360SE','360EE', 'UC', 'QQBrowser', 'QQ', 'Huawei', 'Baidu',
'Maxthon', 'Sogou', 'Liebao', '2345Explorer', '115Browser', 'TheWorld', 'Quark', 'Qiyu',
'Wechat', 'WechatWork', 'Taobao', 'Alipay', 'Weibo', 'Douban', 'Suning', 'iQiYi', 'DingTalk', 'Douyin'
],
"system" => [
'Windows', 'Linux', 'Mac OS', 'Android', 'HarmonyOS', 'Ubuntu',
'FreeBSD', 'Debian', 'iOS', 'Windows Phone', 'BlackBerry', 'MeeGo',
'Symbian', 'Chrome OS', 'WebOS'
],
"device" => ['Mobile', 'Tablet'],
];
foreach ($baseInfo as $k => $v) {
foreach ($v as $xv) {
if ($match[$xv]) $deviceInfo[$k] = $xv;
}
}
// 操作系统版本信息
$windowsVersion = [
'10' => "10",
'6.4' => '10',
'6.3' => '8.1',
'6.2' => '8',
'6.1' => '7',
'6.0' => 'Vista',
'5.2' => 'XP',
'5.1' => 'XP',
'5.0' => '2000',
];
$wv = pregMatch("/^Mozilla/d.0 (Windows NT ([d.] )[;)].*$/", $userAgent);
$HarmonyOSVersion = [
10 => "2",
12 => "3"
];
$systemVersion = [
"Windows" => $windowsVersion[$wv] ?? $wv,
"Android" => pregMatch("/^.*Android ([d.] );.*$/", $userAgent),
"HarmonyOS" => $HarmonyOSVersion[pregMatch("/^Mozilla.*Android ([d.] )[;)].*$/", $userAgent)] ?? '',
"iOS" => preg_replace("/_/", '.', pregMatch("/^.*OS ([d_] ) like.*$/", $userAgent)),
"Debian" => pregMatch("/^.*Debian/([d.] ).*$/", $userAgent),
"Windows Phone" => pregMatch("/^.*Windows Phone( OS)? ([d.] );.*$/", $userAgent),
"Mac OS" => preg_replace("/_/", '.',pregMatch("/^.*Mac OS X ([d_] ).*$/", $userAgent)),
"WebOS" => pregMatch("/^.*hpwOS/([d.] );.*$/", $userAgent)
];
if ($systemVersion[$deviceInfo['system']]) {
$deviceInfo['systemVersion'] = $systemVersion[$deviceInfo['system']];
if ($deviceInfo['systemVersion'] == $userAgent) $deviceInfo['systemVersion'] = '';
}
// if ($deviceInfo['system'] == 'Windows' && $_windowsVersion) $deviceInfo['systemVersion'] = $_windowsVersion;
// 浏览器版本信息
$browsers_360SE = [
108 => '14.0',
86 => '13.0',
78 => '12.0',
69 => '11.0',
63 => '10.0',
55 => '9.1',
45 => '8.1',
42 => '8.0',
31 => '7.0',
21 => '6.3',
];
$browsers_360EE = [
95 => '21',
86 => '13.0',
78 => '12.0',
69 => '11.0',
63 => '9.5',
55 => '9.0',
50 => '8.7',
30 => '7.5',
];
$browsers_liebao = [
57 => '6.5',
49 => '6.0',
46 => '5.9',
42 => '5.3',
39 => '5.2',
34 => '5.0',
29 => '4.5',
21 => '4.0'
];
$browsers_2345 = [
69 => '10.0',
55 => '9.9',
69 => '10.0',
55 => '9.9',
69 => '10.0',
55 => '9.9'
];
$chromeVersion = pregMatch('/^.*Chrome/([d] ).*$/', $userAgent);
$browsersVersion = [
"Safari" => pregMatch("/^.*Version/([d.] ).*$/", $userAgent),
"Chrome" => pregMatch("/^.*Chrome/([d.] ).*$/", $userAgent) ?? pregMatch("/^.*CriOS/([d.] ).*$/", $userAgent),
"IE" => pregMatch("/^.*MSIE ([d.] ).*$/", $userAgent) ?? pregMatch("/^.*rv:([d.] ).*$/", $userAgent),
"Edge" => pregMatch("/^.*Edge/([d.] ).*$/", $userAgent) ?? pregMatch("/^.*Edg/([d.] ).*$/", $userAgent) ?? pregMatch("/^.*EdgA/([d.] ).*$/", $userAgent) ?? pregMatch("/^.*EdgiOS/([d.] ).*$/", $userAgent),
"Firefox" => pregMatch("/^.*Firefox/([d.] ).*$/", $userAgent) ?? pregMatch("/^.*FxiOS/([d.] ).*$/", $userAgent),
"Firefox Focus" => pregMatch("/^.*Focus/([d.] ).*$/", $userAgent),
"Chromium" => pregMatch("/^.*Chromium/([d.] ).*$/", $userAgent),
"Opera" => pregMatch("/^.*Opera/([d.] ).*$/", $userAgent) ?? pregMatch("/^.*OPR/([d.] ).*$/", $userAgent),
"Vivaldi" => pregMatch("/^.*Vivaldi/([d.] ).*$/", $userAgent),
"Yandex" => pregMatch("/^.*YaBrowser/([d.] ).*$/", $userAgent),
"Brave" => pregMatch("/^.*Chrome/([d.] ).*$/", $userAgent),
"Arora" => pregMatch("/^.*Arora/([d.] ).*$/", $userAgent),
"Lunascape" => pregMatch("/^.*Lunascape[/s]([d.] ).*$/", $userAgent),
"QupZilla" => pregMatch("/^.*QupZilla[/s]([d.] ).*$/", $userAgent),
"Coc Coc" => pregMatch("/^.*coc_coc_browser/([d.] ).*$/", $userAgent),
"Kindle" => pregMatch("/^.*Version/([d.] ).*$/", $userAgent),
"Iceweasel" => pregMatch("/^.*Iceweasel/([d.] ).*$/", $userAgent),
"Konqueror" => pregMatch("/^.*Konqueror/([d.] ).*$/", $userAgent),
"Iceape" => pregMatch("/^.*Iceape/([d.] ).*$/", $userAgent),
"SeaMonkey" => pregMatch("/^.*SeaMonkey/([d.] ).*$/", $userAgent),
"Epiphany" => pregMatch("/^.*Epiphany/([d.] ).*$/", $userAgent),
"360" => pregMatch("/^.*QihooBrowser(HD)?/([d.] ).*$/", $userAgent),
"Maxthon" => pregMatch("/^.*Maxthon/([d.] ).*$/", $userAgent),
"QQBrowser" => pregMatch("/^.*QQBrowser/([d.] ).*$/", $userAgent),
"QQ" => pregMatch("/^.*QQ/([d.] ).*$/", $userAgent),
"Baidu" => pregMatch("/^.*BIDUBrowser[s/]([d.] ).*$/", $userAgent) ?? pregMatch("/^.*baiduboxapp/([d.] ).*$/", $userAgent),
"UC" => pregMatch("/^.*UC?Browser/([d.] ).*$/", $userAgent),
"Sogou" => pregMatch("/^.*SE ([d.X] ).*$/", $userAgent) ?? pregMatch("/^.*SogouMobileBrowser/([d.] ).*$/", $userAgent),
"115Browser" => pregMatch("/^.*115Browser/([d.] ).*$/", $userAgent),
"TheWorld" => pregMatch("/^.*TheWorld ([d.] ).*$/", $userAgent),
"XiaoMi" => pregMatch("/^.*MiuiBrowser/([d.] ).*$/", $userAgent),
"Vivo" => pregMatch("/^.*VivoBrowser/([d.] ).*$/", $userAgent),
"OPPO" => pregMatch("/^.*HeyTapBrowser/([d.] ).*$/", $userAgent),
"Quark" => pregMatch("/^.*Quark/([d.] ).*$/", $userAgent),
"Qiyu" => pregMatch("/^.*Qiyu/([d.] ).*$/", $userAgent),
"Wechat" => pregMatch("/^.*MicroMessenger/([d.] ).*$/", $userAgent),
"WechatWork" => pregMatch("/^.*wxwork/([d.] ).*$/", $userAgent),
"Taobao" => pregMatch("/^.*AliApp(TB/([d.] ).*$/", $userAgent),
"Alipay" => pregMatch("/^.*AliApp(AP/([d.] ).*$/", $userAgent),
"Weibo" => pregMatch("/^.*weibo__([d.] ).*$/", $userAgent),
"Douban" => pregMatch("/^.*com.douban.frodo/([d.] ).*$/", $userAgent),
"Suning" => pregMatch("/^.*SNEBUY-APP([d.] ).*$/", $userAgent),
"iQiYi" => pregMatch("/^.*IqiyiVersion/([d.] ).*$/", $userAgent),
"DingTalk" => pregMatch("/^.*DingTalk/([d.] ).*$/", $userAgent),
"Douyin" => pregMatch("/^.*app_version/([d.] ).*$/", $userAgent),
"Huawei" => pregMatch("/^.*Version/([d.] ).*$/", $userAgent) ?? pregMatch("/^.*HuaweiBrowser/([d.] ).*$/", $userAgent) ?? pregMatch("/^.*HBPC/([d.] ).*$/", $userAgent),
"360SE" => $browsers_360SE[$chromeVersion] ?? '',
"360EE" => $browsers_360EE[$chromeVersion] ?? '',
"Liebao" => pregMatch("/^.*LieBaoFast/([d.] ).*$/", $userAgent) ?? $browsers_liebao[$chromeVersion],
"2345Explorer" => $browsers_2345[$chromeVersion] ?? pregMatch("/^.*2345Explorer/([d.] ).*$/", $userAgent) ?? pregMatch("/^.*Mb2345Browser/([d.] ).*$/", $userAgent),
];
if ($browsersVersion[$deviceInfo['browser']]) {
$deviceInfo["version"] = $browsersVersion[$deviceInfo['browser']];
if ($deviceInfo["version"] == $userAgent) $deviceInfo['version'] = '';
}
// 修正浏览器版本信息
$chrome = pregMatch('/S Browser/', $userAgent);
if ($deviceInfo['browser'] == 'Chrome' && $chrome) {
$deviceInfo['browser'] = $chrome;
$deviceInfo['version'] = pregMatch('/^.*Browser/([d.] ).*$/', $userAgent);
}
return $deviceInfo;
}
/**
* 返回符合正则的值
*
* @param string $reg 正则
* @param string $sourceData 源数据
* @return mixed|void
*/
function pregMatch($reg, $sourceData) {
if (preg_match($reg, $sourceData, $mat)) return $mat[1];
}
comments.php
代码语言:javascript复制<span id="device_comment_<?php $comments->sequence(); ?>" >
<?php $data = getBrowsersInfo($comments->agent); ?>
<span><?php echo $data['system']; ?> </span>
<span><?php echo $data['systemVersion']; ?> </span>
<span><?php echo $data['browser']; ?> </span>
<span><?php echo $data['version']; ?> </span>
</span>