1proxy / app /grabber /patterns.py
paijo77's picture
update app/grabber/patterns.py
c1f87fd verified
import re
from typing import List, Tuple
class ProxyPatterns:
HTTP_IP_PORT = re.compile(
r"\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}"
r"(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
r":([0-9]{1,5})\b"
)
VMESS_URL = re.compile(r"vmess://[A-Za-z0-9+/=]+")
VLESS_URL = re.compile(r"vless://[a-zA-Z0-9-]+@[a-zA-Z0-9.-]+:[0-9]+[^\s]*")
TROJAN_URL = re.compile(r"trojan://[^@\s]+@[a-zA-Z0-9.-]+:[0-9]+[^\s]*")
SS_URL = re.compile(r"ss://[A-Za-z0-9+/=]+@[a-zA-Z0-9.-]+:[0-9]+")
@classmethod
def extract_http_proxies(cls, text: str) -> List[Tuple[str, str]]:
result = []
for match in cls.HTTP_IP_PORT.finditer(text):
ip_port = match.group(0)
ip, port = ip_port.rsplit(":", 1)
result.append((ip, port))
return result
@classmethod
def is_vmess(cls, url: str) -> bool:
return bool(cls.VMESS_URL.match(url))
@classmethod
def extract_vmess_urls(cls, text: str) -> List[str]:
return cls.VMESS_URL.findall(text)
@classmethod
def is_vless(cls, url: str) -> bool:
return bool(cls.VLESS_URL.match(url))
@classmethod
def extract_vless_urls(cls, text: str) -> List[str]:
return cls.VLESS_URL.findall(text)
@classmethod
def is_trojan(cls, url: str) -> bool:
return bool(cls.TROJAN_URL.match(url))
@classmethod
def extract_trojan_urls(cls, text: str) -> List[str]:
return cls.TROJAN_URL.findall(text)
@classmethod
def is_shadowsocks(cls, url: str) -> bool:
return bool(cls.SS_URL.match(url))
@classmethod
def extract_ss_urls(cls, text: str) -> List[str]:
return cls.SS_URL.findall(text)
@classmethod
def is_valid_ip(cls, ip: str) -> bool:
try:
octets = ip.split(".")
return len(octets) == 4 and all(0 <= int(o) <= 255 for o in octets)
except (ValueError, AttributeError):
return False
@classmethod
def is_valid_port(cls, port: int) -> bool:
return 1 <= port <= 65535