chore: 重写初始提交(清空历史,整理后全量提交)

This commit is contained in:
ywxapp
2026-08-16 16:54:14 +08:00
commit 6c1a106bc1
1808 changed files with 238144 additions and 0 deletions
+84
View File
@@ -0,0 +1,84 @@
<?php
// +----------------------------------------------------------------------
// | YwxApp [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: ywxapp<admin@ywxapp.cn>
// +----------------------------------------------------------------------
declare(strict_types=1);
namespace ywxapp\library;
/**
* 搜索引擎蜘蛛识别
*
* 仅按 User-Agent 特征串识别(不做 DNS 反查,保证零阻塞)。
* 新增蜘蛛只需在 SPIDERS 追加一行:标识 => [UA特征串列表, 显示名]。
*
* @author ywxapp <admin@ywxapp.cn>
*/
class SpiderDetect
{
/**
* 蜘蛛特征表:key=入库标识,value=[UA 特征串(不区分大小写,命中任一即算), 中文显示名]
*/
public const SPIDERS = [
'baidu' => [['Baiduspider'], '百度'],
'google' => [['Googlebot', 'Google-InspectionTool', 'AdsBot-Google'], '谷歌'],
'bing' => [['bingbot', 'msnbot', 'BingPreview'], '必应'],
'sogou' => [['Sogou web spider', 'Sogou inst spider', 'Sogou Pic Spider'], '搜狗'],
'so360' => [['360Spider', 'HaoSouSpider', 'qihoobot'], '360'],
'bytedance' => [['Bytespider', 'ToutiaoSpider'], '字节跳动'],
'shenma' => [['YisouSpider'], '神马'],
'huawei' => [['PetalBot'], '华为花瓣'],
'yandex' => [['YandexBot'], 'Yandex'],
'duckduckgo' => [['DuckDuckBot', 'DuckDuckGo-Favicons-Bot'], 'DuckDuckGo'],
'yahoo' => [['Yahoo! Slurp'], '雅虎'],
'apple' => [['Applebot'], '苹果'],
'gptbot' => [['GPTBot', 'ChatGPT-User', 'OAI-SearchBot'], 'OpenAI'],
'claudebot' => [['ClaudeBot', 'anthropic-ai'], 'Anthropic'],
'semrush' => [['SemrushBot'], 'Semrush'],
'ahrefs' => [['AhrefsBot'], 'Ahrefs'],
'mj12' => [['MJ12bot'], 'Majestic'],
'facebook' => [['facebookexternalhit', 'FacebookBot'], 'Facebook'],
];
/**
* 识别 UA,命中返回蜘蛛标识(SPIDERS 的 key),未命中返回 null
*/
public static function detect(string $userAgent): ?string
{
if ($userAgent === '') {
return null;
}
foreach (self::SPIDERS as $key => [$needles]) {
foreach ($needles as $needle) {
if (stripos($userAgent, $needle) !== false) {
return $key;
}
}
}
return null;
}
/**
* 蜘蛛标识 → 中文显示名(未知标识原样返回)
*/
public static function label(string $key): string
{
return self::SPIDERS[$key][1] ?? $key;
}
/**
* 全部蜘蛛 标识=>显示名(后台下拉/报表用)
*/
public static function labels(): array
{
$out = [];
foreach (self::SPIDERS as $key => [, $label]) {
$out[$key] = $label;
}
return $out;
}
}