refactored
This commit is contained in:
@ -6,9 +6,9 @@ from typing import Generator
|
|||||||
from jsoner import json_write_sync
|
from jsoner import json_write_sync
|
||||||
from telethon import TelegramClient
|
from telethon import TelegramClient
|
||||||
from telethon.sessions import StringSession
|
from telethon.sessions import StringSession
|
||||||
from tooler import ProxyParser
|
|
||||||
|
|
||||||
from .base_session import BaseSession
|
from .base_session import BaseSession
|
||||||
|
from .proxy_parser import ProxyParser
|
||||||
|
|
||||||
|
|
||||||
class JsonConverter(BaseSession):
|
class JsonConverter(BaseSession):
|
||||||
|
|||||||
113
basethon/proxy_parser.py
Normal file
113
basethon/proxy_parser.py
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
from dataclasses import asdict, dataclass
|
||||||
|
from typing import Literal
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ThonProxy:
|
||||||
|
proxy_type: Literal["http", "socks5"] | str
|
||||||
|
addr: str
|
||||||
|
port: int
|
||||||
|
username: str | None
|
||||||
|
password: str | None
|
||||||
|
rdns: bool = True
|
||||||
|
|
||||||
|
|
||||||
|
class ProxyParser:
|
||||||
|
"""Парсер проксей, если что-то не так, то райзит ValueError"""
|
||||||
|
|
||||||
|
def __init__(self, proxy: str, splitter: str = ":"):
|
||||||
|
proxy = proxy.replace("https:", "http:")
|
||||||
|
self.__proxy, self.__splitter = proxy, splitter
|
||||||
|
self.__prefixes = ("http", "socks5", "ss")
|
||||||
|
self.__url_prefixes = ("http://", "socks5://", "ss://")
|
||||||
|
|
||||||
|
@property
|
||||||
|
def splitted(self) -> list[str]:
|
||||||
|
_proxy = self.__proxy
|
||||||
|
for url_prefix in self.__url_prefixes:
|
||||||
|
if not self.__proxy.startswith(url_prefix):
|
||||||
|
continue
|
||||||
|
_url_prefix = url_prefix.replace("//", "")
|
||||||
|
_proxy = self.__proxy.replace(url_prefix, _url_prefix, 1)
|
||||||
|
if "@" in _proxy:
|
||||||
|
_splitted = _proxy.split("@", maxsplit=1)
|
||||||
|
_creds = _splitted[0].replace(_url_prefix, "", 1)
|
||||||
|
return f"{_url_prefix}{_splitted[-1]}:{_creds}".split(":")
|
||||||
|
return _proxy.split(self.__splitter)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def type(self) -> Literal["http", "socks5", "ss"]:
|
||||||
|
p_type = self.splitted[0]
|
||||||
|
match p_type:
|
||||||
|
case "http":
|
||||||
|
return "http"
|
||||||
|
case "socks5":
|
||||||
|
return "socks5"
|
||||||
|
case "ss":
|
||||||
|
return "ss"
|
||||||
|
return "http"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ip(self) -> str:
|
||||||
|
if self.__proxy.startswith(self.__prefixes):
|
||||||
|
try:
|
||||||
|
return self.splitted[1]
|
||||||
|
except IndexError as e:
|
||||||
|
_message = f"[ProxyParser] Не найден IP в прокси: {self.__proxy}"
|
||||||
|
raise ValueError(_message) from e
|
||||||
|
return self.splitted[0]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def port(self) -> int:
|
||||||
|
_message = f"[ProxyParser] Некорректно задан порт в прокси: {self.__proxy}"
|
||||||
|
if self.__proxy.startswith(self.__prefixes):
|
||||||
|
try:
|
||||||
|
return int(self.splitted[2])
|
||||||
|
except (ValueError, TypeError, IndexError) as e:
|
||||||
|
raise ValueError(_message) from e
|
||||||
|
try:
|
||||||
|
return int(self.splitted[1])
|
||||||
|
except (ValueError, TypeError, IndexError) as e:
|
||||||
|
raise ValueError(_message) from e
|
||||||
|
|
||||||
|
@property
|
||||||
|
def user(self) -> str | None:
|
||||||
|
if self.splitted[0] in self.__prefixes:
|
||||||
|
# [type, ip, port, user, pswd]
|
||||||
|
if len(self.splitted) == 5:
|
||||||
|
return self.splitted[3]
|
||||||
|
# [ip, port, user, pswd]
|
||||||
|
if len(self.splitted) == 4:
|
||||||
|
return self.splitted[2]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def pswd(self) -> str | None:
|
||||||
|
if self.splitted[0] in self.__prefixes:
|
||||||
|
# [type, ip, port, user, pswd]
|
||||||
|
if len(self.splitted) == 5:
|
||||||
|
return self.splitted[4]
|
||||||
|
# [ip, port, user, pswd]
|
||||||
|
if len(self.splitted) == 4:
|
||||||
|
return self.splitted[3]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def url(self) -> str:
|
||||||
|
if self.type == "ss":
|
||||||
|
return ""
|
||||||
|
if not self.user or not self.pswd:
|
||||||
|
return f"{self.type}://{self.ip}:{self.port}"
|
||||||
|
return f"{self.type}://{self.user}:{self.pswd}@{self.ip}:{self.port}"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def thon(self) -> ThonProxy:
|
||||||
|
return ThonProxy(self.type, self.ip, self.port, self.user, self.pswd)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def asdict_thon(self) -> dict:
|
||||||
|
return asdict(self.thon)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def check(self) -> str:
|
||||||
|
if not self.user or not self.pswd:
|
||||||
|
return f"{self.type}:{self.ip}:{self.port}"
|
||||||
|
return f"{self.type}:{self.ip}:{self.port}:{self.user}:{self.pswd}"
|
||||||
28
poetry.lock
generated
28
poetry.lock
generated
@ -16,19 +16,18 @@ name = "jsoner"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
description = ""
|
description = ""
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "^3.11"
|
python-versions = "^3.10"
|
||||||
files = []
|
files = []
|
||||||
develop = false
|
develop = false
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
aiofiles = "^23.2.1"
|
aiofiles = "^23.2.1"
|
||||||
tooler = {git = "https://github.com/trojvn/tooler.git"}
|
|
||||||
|
|
||||||
[package.source]
|
[package.source]
|
||||||
type = "git"
|
type = "git"
|
||||||
url = "https://github.com/trojvn/jsoner.git"
|
url = "https://github.com/trojvn/jsoner.git"
|
||||||
reference = "HEAD"
|
reference = "HEAD"
|
||||||
resolved_reference = "1d714ef57aaac46caf261ba493b38ab00ce7e365"
|
resolved_reference = "b3a43e5e14609a7939f87e521654b6ae266e2723"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pyaes"
|
name = "pyaes"
|
||||||
@ -53,13 +52,13 @@ files = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rsa"
|
name = "rsa"
|
||||||
version = "4.9"
|
version = "4.9.1"
|
||||||
description = "Pure-Python RSA implementation"
|
description = "Pure-Python RSA implementation"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6,<4"
|
python-versions = "<4,>=3.6"
|
||||||
files = [
|
files = [
|
||||||
{file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"},
|
{file = "rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762"},
|
||||||
{file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"},
|
{file = "rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
@ -83,21 +82,6 @@ rsa = "*"
|
|||||||
[package.extras]
|
[package.extras]
|
||||||
cryptg = ["cryptg"]
|
cryptg = ["cryptg"]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "tooler"
|
|
||||||
version = "0.5.0"
|
|
||||||
description = ""
|
|
||||||
optional = false
|
|
||||||
python-versions = "^3.11"
|
|
||||||
files = []
|
|
||||||
develop = false
|
|
||||||
|
|
||||||
[package.source]
|
|
||||||
type = "git"
|
|
||||||
url = "https://github.com/trojvn/tooler.git"
|
|
||||||
reference = "HEAD"
|
|
||||||
resolved_reference = "ff04688e6131ec612ea871fe091f76cedf5098ca"
|
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = "^3.12"
|
python-versions = "^3.12"
|
||||||
|
|||||||
Reference in New Issue
Block a user