微信和QQ的内置浏览器,就像是一个装修豪华但啥也干不了的小黑屋。你想下载文件?它说:“抱歉,功能暂未开放。” 你想正常播放视频?它给你卡成PPT。这时候,作为店老板,你得想办法把客人带到“阳光充足”的系统浏览器大厅里去。
1. 遇上QQ客人?直接“传送”!
NO:1 の 骚操作:
// 检测到QQ浏览器?立马启动“传送门”!
<?php
// 配置开关
$settings = [
'qq_redirect' => true
];
// 判断是否为 QQ 内置浏览器
$userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
if ($settings['qq_redirect'] && stripos($userAgent, 'QQ/') !== false) {
$currentUrl = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://')
. $_SERVER['HTTP_HOST']
. $_SERVER['REQUEST_URI'];
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>正在跳转到系统浏览器...</title>
<script src="https://open.mobile.qq.com/sdk/qqapi.js?_bid=152"></script>
<script>
(function(){
mqq.ui.openUrl({
target: 2,
url: "<?php echo $currentUrl; ?>"
});
})();
</script>
</head>
<body>
</body>
</html>
<?php
exit;
}
?>
- 实现方法:就像酒店门童一眼认出QQ来的客人(User-Agent里带
QQ/
),然后偷偷塞给他一张“传送卷轴”(调用QQ的JS-SDK)。 - 效果:客人还没反应过来,“咻”的一声,就直接被传送到系统浏览器里了——体验丝滑,堪比魔法。
- 注意:这招需要QQ浏览器支持,万一哪天QQ更新了版本,卷轴可能失效,得及时补货。
2. 遇上微信客人?弹窗“嘴遁”劝说!
微信浏览器是个铜墙铁壁的“超级牢房”,直接传送?没门!那我们只能苦口婆心地劝客人自己走出来。
NO:2 の 无奈之举:
// 如果是微信或QQ,就在页面头顶弹出“温馨提示”
<?php
// 在微信或 QQ 内置浏览器中弹出温馨提示
function show_wechat_qq_notice() {
$ua = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
if (stripos($ua, 'MicroMessenger') !== false || stripos($ua, 'QQ') !== false) {
?>
<script>
window.addEventListener('load', function () {
alert("温馨提示:为防止文件下载过期,建议不要在微信或QQ内直接下载文件。\n请点击右上角菜单,选择【在浏览器中打开】进行下载。");
});
</script>
<?php
}
}
add_action('wp_head', 'show_wechat_qq_notice');
- 实现方法:检测到User-Agent里有
MicroMessenger
,就知道是微信来的。等页面加载完,直接一个弹窗糊脸。 - 优缺点:简单粗暴,但容易引起用户“弹窗PTSD”。理想情况是做个更友好的提示框,比如:“亲,微信里下载文件容易扑街哦~点这里解锁完整体验?”
策略: 对QQ能传送就传送,对微信和传送失败的QQ就“嘴遁”劝说。总之一个原则:能救一个是一个!
3. 验明正身:抓出那些cosplay搜索引擎的“戏精爬虫”
你以为来的是谷歌、百度的官方蜘蛛?naive!太多爬虫喜欢玩cosplay,穿上“Googlebot”的马甲就敢来你店里骗吃骗喝。怎么办?查它户口!
NO:3 の 侦探手册:
<?php
/**
* 验证指定IP是否为真实搜索引擎蜘蛛(基于反向+正向DNS解析)
* @param string $ip 待验证的IP地址
* @return array 验证结果(is_valid: 是否真实, spider: 蜘蛛名称, domain: 解析域名)
*/
function verifySpiderByIp(string $ip): array {
// 验证IP格式
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
return [
'is_valid' => false,
'spider' => '未知',
'domain' => '无效的IP地址'
];
}
// 反向解析 IP -> 域名
$reverseDomain = gethostbyaddr($ip);
if ($reverseDomain === $ip || $reverseDomain === false) {
return [
'is_valid' => false,
'spider' => '未知',
'domain' => '反向DNS解析失败'
];
}
// 正向解析 域名 -> IP 验证
$forwardIps = gethostbynamel($reverseDomain); // 可能返回多个IP
if (!$forwardIps || !in_array($ip, $forwardIps)) {
return [
'is_valid' => false,
'spider' => '未知',
'domain' => $reverseDomain . '(正向解析IP不匹配)'
];
}
// 搜索引擎域名规则
$spiderRules = [
'Googlebot' => '/\.googlebot\.com$/',
'Baiduspider' => '/(\.baiduspider\.com|\.crawl\.baidu\.com)$/',
'Bingbot' => '/(\.search\.msn\.com|\.bingbot\.com)$/',
'YandexBot' => '/\.yandex\.com$/',
'Sogou Spider' => '/\.sogou\.com$/'
];
foreach ($spiderRules as $name => $pattern) {
if (preg_match($pattern, $reverseDomain)) {
return [
'is_valid' => true,
'spider' => $name,
'domain' => $reverseDomain
];
}
}
// 未匹配到
return [
'is_valid' => false,
'spider' => '未知爬虫',
'domain' => $reverseDomain
];
}
// ------------------- 测试示例 -------------------
$testIps = [
'66.249.66.1', // Googlebot
'220.181.108.1', // Baiduspider
'114.114.114.114' // 普通DNS服务器
];
foreach ($testIps as $ip) {
$res = verifySpiderByIp($ip);
echo "验证IP: {$ip}<br>";
echo "结果: " . ($res['is_valid'] ? '✅ 真实蜘蛛' : '❌ 非真实蜘蛛') . "<br>";
echo "蜘蛛名称: {$res['spider']}<br>";
echo "解析域名: {$res['domain']}<br><br>";
}
?>
侦探流程三步走:
- 反向查户口:拿到IP地址,先去DNS局问:“这IP谁家的?”(反向DNS解析)。如果回答是“就它自己”,那绝对是野路子。
- 正向对暗号:DNS局说这IP是
googlebot.com
家的?好,那我再问一下:“googlebot.com
家地址是啥?”(正向解析)。如果答不上来或者对不上,肯定是假护照! - 验明正身:户口和暗号都对上了,再看看是不是在咱们“VIP名单”(搜索引擎域名规则)里。是的话,热烈欢迎!不是的话,哼哼——“关门,放验证码!”
性能小贴士: 这套查户口流程比较费时,别来个客人就查一次!建议用缓存(Redis/Memcached)把结果存起来,比如12小时之内同一个IP只查一次,不然服务器累得要骂娘。
没啦
做网站就像开客栈,既要贴心服务“被困住”的真用户,也要火眼金睛识别“戏精”假爬虫。
- 对付内置浏览器:咱们是能传则传,不能传就劝,争取让每个用户都能享受到“五星级体验”。
- 对付cosplay的爬虫:切记:User-Agent就是件戏服,随便穿!必须“查户口”+“对暗号”双管齐下,才能让李鬼变李逵。