Files
proxy-scraper-checker/proxy_scraper_checker/proxy.py
T

79 lines
2.5 KiB
Python
Raw Normal View History

2023-01-02 00:09:55 +03:00
from __future__ import annotations
2024-01-21 21:46:01 +03:00
import json
2024-01-21 17:45:01 +00:00
from io import StringIO
2023-01-02 00:09:55 +03:00
from time import perf_counter
2024-01-21 17:45:01 +00:00
from typing import Optional
2023-01-02 00:09:55 +03:00
2024-01-21 17:45:01 +00:00
import attrs
from aiohttp import ClientSession
2023-01-04 17:49:45 +03:00
from aiohttp_socks import ProxyConnector, ProxyType
2023-01-02 00:09:55 +03:00
2024-01-23 09:37:29 +03:00
from .http import (
HEADERS,
SSL_CONTEXT,
fallback_charset_resolver,
get_cookie_jar,
get_response_text,
)
2024-01-21 17:45:01 +00:00
from .parsers import parse_ipv4
from .settings import CheckWebsiteType, Settings
2023-01-15 13:05:16 +03:00
2023-02-19 21:44:15 +03:00
2024-01-21 17:45:01 +00:00
@attrs.define(
repr=False,
unsafe_hash=True,
weakref_slot=False,
kw_only=True,
getstate_setstate=False,
match_args=False,
)
class Proxy:
2024-01-21 17:45:01 +00:00
protocol: ProxyType
2023-02-19 21:44:15 +03:00
host: str
port: int
2024-01-21 17:45:01 +00:00
username: Optional[str]
password: Optional[str]
2024-01-23 08:09:08 +03:00
timeout: float = attrs.field(init=False, eq=False)
exit_ip: str = attrs.field(init=False, eq=False)
2023-01-15 13:05:16 +03:00
2024-01-21 17:45:01 +00:00
async def check(self, *, settings: Settings) -> None:
async with settings.semaphore:
2023-01-02 00:09:55 +03:00
start = perf_counter()
2023-06-27 12:04:44 +03:00
connector = ProxyConnector(
2024-01-21 17:45:01 +00:00
proxy_type=self.protocol,
host=self.host,
port=self.port,
username=self.username,
password=self.password,
ssl=SSL_CONTEXT,
2023-06-27 12:04:44 +03:00
)
2023-04-17 16:48:11 +03:00
async with ClientSession(
2023-01-15 13:05:16 +03:00
connector=connector,
2023-02-19 21:44:15 +03:00
headers=HEADERS,
2024-01-21 17:45:01 +00:00
cookie_jar=get_cookie_jar(),
raise_for_status=True,
2024-01-21 17:45:01 +00:00
timeout=settings.timeout,
2024-01-23 09:37:29 +03:00
fallback_charset_resolver=fallback_charset_resolver,
) as session, session.get(settings.check_website) as response:
2024-01-21 21:46:01 +03:00
content = await response.read()
2023-01-02 00:09:55 +03:00
self.timeout = perf_counter() - start
2024-01-21 17:45:01 +00:00
if settings.check_website_type == CheckWebsiteType.HTTPBIN_IP:
2024-01-23 09:37:29 +03:00
r = json.loads(
get_response_text(response=response, content=content)
)
2024-01-21 17:45:01 +00:00
self.exit_ip = r["origin"]
elif settings.check_website_type == CheckWebsiteType.PLAIN_IP:
2024-01-23 09:37:29 +03:00
self.exit_ip = parse_ipv4(
get_response_text(response=response, content=content)
)
2023-01-02 00:09:55 +03:00
2024-01-21 17:45:01 +00:00
def as_str(self, *, include_protocol: bool) -> str:
with StringIO() as buf:
if include_protocol:
buf.write(f"{self.protocol.name.lower()}://")
if self.username is not None and self.password is not None:
buf.write(f"{self.username}:{self.password}@")
buf.write(f"{self.host}:{self.port}")
return buf.getvalue()