PluginProbe ʕ •ᴥ•ʔ
10Web Booster – Website speed optimization, Cache & Page Speed optimizer / trunk
10Web Booster – Website speed optimization, Cache & Page Speed optimizer vtrunk
2.33.6 2.33.5 2.33.0 2.30.5 2.30.7 2.30.9 2.31.10 2.31.8 2.32.11 2.32.21 2.32.3 2.32.4 2.32.7 2.6.31 2.6.40 2.6.42 2.6.7 2.7.37 2.7.44 2.7.47 2.8.18 2.8.19 2.8.32 2.8.34 2.8.35 2.9.23 2.9.24 2.9.25 2.9.27 v2.27.4 trunk 2.0.10 2.0.11 2.0.12 2.0.13 2.0.14 2.0.15 2.0.17 2.0.18 2.0.21 2.0.22 2.0.25 2.0.26 2.0.27 2.0.3 2.0.7 2.0.9 2.10.46 2.10.65 2.10.66 2.10.68 2.11.41 2.11.42 2.11.43 2.12.15 2.12.21 2.12.22 2.12.23 2.12.26 2.13.37 2.13.40 2.13.41 2.13.42 2.13.44 2.13.45 2.13.47 2.14.49 2.14.50 2.15.18 2.17.21 2.17.23 2.18.17 2.19.44 2.19.45 2.19.46 2.19.49 2.2.12 2.2.15 2.2.16 2.2.18 2.2.8 2.20.31 2.20.32 2.20.33 2.21.11 2.21.12 2.21.16 2.21.25 2.22.32 2.23.13 2.23.15 2.23.16 2.23.18 2.24.12 2.24.14 2.24.18 2.25.14 2.26.6 2.28.10 2.28.13 2.28.14 2.28.7 2.29.1 2.29.2 2.29.3 2.3.0 2.3.1 2.3.2 2.3.3 2.30.18
tenweb-speed-optimizer / vendor / monperrus / crawler-user-agents / __init__.py
tenweb-speed-optimizer / vendor / monperrus / crawler-user-agents Last commit date
.github 1 year ago .gitignore 1 year ago .travis.yml 2 years ago LICENSE 3 years ago MANIFEST.in 2 years ago README.md 1 year ago __init__.py 1 year ago composer.json 3 years ago crawler-user-agents.json 1 year ago format.js 1 year ago go.mod 2 years ago go.sum 2 years ago index.d.ts 3 years ago main.php 3 years ago package-lock.json 2 years ago package.json 2 years ago pyproject.toml 1 year ago test_harness.py 1 year ago test_validation.py 3 years ago validate.go 1 year ago validate.php 3 years ago validate.py 2 years ago validate_test.go 1 year ago
__init__.py
52 lines
1 import re
2 import json
3 from functools import cached_property
4 from pathlib import Path
5
6
7 class CrawlerPatterns:
8 def __init__(self):
9 pass
10
11 @cached_property
12 def case_insensitive(self):
13 return re.compile(
14 "|".join(i["pattern"] for i in CRAWLER_USER_AGENTS_DATA),
15 re.IGNORECASE
16 )
17
18 @cached_property
19 def case_sensitive(self):
20 return re.compile("|".join(i["pattern"] for i in CRAWLER_USER_AGENTS_DATA))
21
22
23 def load_json():
24 cwd = Path(__file__).parent
25 user_agents_file_path = cwd / "crawler-user-agents.json"
26 with user_agents_file_path.open() as patterns_file:
27 return json.load(patterns_file)
28
29
30 CRAWLER_USER_AGENTS_DATA = load_json()
31 CRAWLER_PATTERNS = CrawlerPatterns()
32
33
34 def is_crawler(user_agent: str, case_sensitive: bool = True) -> bool:
35 """Return True if the given User-Agent matches a known crawler."""
36 if case_sensitive:
37 return bool(re.search(CRAWLER_PATTERNS.case_sensitive, user_agent))
38 return bool(re.search(CRAWLER_PATTERNS.case_insensitive, user_agent))
39
40
41 def matching_crawlers(user_agent: str, case_sensitive: bool = True) -> list[int]:
42 """
43 Return a list of the indices in CRAWLER_USER_AGENTS_DATA of any crawlers
44 matching the given User-Agent.
45 """
46 result = []
47 if is_crawler(user_agent, case_sensitive):
48 for num, crawler_user_agent in enumerate(CRAWLER_USER_AGENTS_DATA):
49 if re.search(crawler_user_agent["pattern"], user_agent, 0 if case_sensitive else re.IGNORECASE):
50 result.append(num)
51 return result
52